Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

Ela, functional programming language

, 5 Jul 2012 GPL3
Description of an interpreted functional programming language implemented solely in .NET/C#.
ela-0-9-5.zip
Ela.dll
elac.exe
lib
Core.ela
elalib.dll
Prelude.ela
Test.ela
0.9.5.0:Release:Release of Ela 0.9.5
0.9.4.4:Change:PushelemI4 op code is now decomissioned (it wasn't emitted by compiler anyway).
0.9.4.3:Change:Major improvemenet in thunk calculation. Performance for thunks is increased, also thunk calculation cannot cause stack overflow anymore in a case of long recursion spree.
0.9.4.2:Change:Pushelemi and Popelemi op codes are now decomissioned.
0.9.4.1:Change:Swap operator (<->) is now decomissioned.
0.9.4.0:Release:Release of Ela 0.9.4
0.9.3.7:Fix:A bug fixed in lazy list comprehension - variable references inside generator expressions weren't correctly resolved.
0.9.3.6:Fix:A bug fixed in call stack generation - function names weren't always determined correctly.
0.9.3.5:New:Now it is possible to open module with a qualified access only using new 'qualified' keyword, e.g. 'open qualified Foo'.
0.9.3.4:Change:Conversion routines for ElaValue/ElaObject are refactored in order to be more extensible.
0.9.3.3:Change:Now ElaLinker has an AddArgument method. This method simulates arguments using an implicit $Args module.
0.9.3.2:Change:Arguments engine is decomissioned (arg tokens are removed from the language as well as corresponding op codes).
0.9.3.1:Fix:Arguments didn't work at all.
0.9.3.0:Release:Release of Ela 0.9.3
0.9.2.9:Fix:Minor corrections in implementation of Show by ElaFunction.
0.9.2.8:New:Now lists support structural comparison.
0.9.2.7:Fix:A bug in ElaList.GetLength and ElaList.GetValue fixed. They used to raise actual exceptions instead of reporting about errors through execution context (could cause Ela VM to crush).
0.9.2.6:New:Now linker generates a 'ModuleResolve' event when it can't find a module (without the DLL specified). In this case user code has an ability to manually supply an instance of a module.
0.9.2.5:Change:Refactoring in Ela linker - all 'AddModule' methods of CodeAssembly are not internal. Also public interface for the ModuleReference is cleaned up.
0.9.2.4:New:Now compiler is able to recognize builtin functions (and inline) them when they are declared using 'et' (mutual recursion).
0.9.2.3:Fix:Minor fixes in generation of debug info for variable declarations.
0.9.2.2:Change:Attributes are decomissioned.
0.9.2.1:Change:'ExportVars' now has a public constructor.
0.9.2.0:Release:Release of Ela 0.9.2
0.9.1.16:Change:The 'base' is decomissioned.
0.9.1.15:Change:Compilation of pattern matching with guards optimized.
0.9.1.14:Change:Now redefinition of variables is not allowed in pattern matching.
0.9.1.13:Change:Now rules for mutual recursive declarations are relaxed. The work for any declarations but for regular strict binding an error will be generated if a particular bindings refer to a non-initialized value.
0.9.1.12:Fix:A bug fixed in declaration of mutually recursive functions.
0.9.1.11:New:Now Ela supports custom attribute both on module and on 'let' binding level. The first are serialized to object files and preserved in run-time, the latter can be used by external tools such as documentation generators.
0.9.1.10:Change:Refactoring in parsing of lazy expressions. Now both '(& expr )' and '( & expr)' are valid.
0.9.1.9:Change:When declaring operator in infix form it is possible to use parenthesis around operator name (or to omit parenthesis as is worked before), e.g. both 'let + x = ...' and 'let (+) x = ...' are valid.
0.9.1.8:Change:Now it is not possible to omit a variant name and to match any variant.
0.9.1.7:Change:Now variant names don't have to be prepended with an apostrophe however all variants should start with an uppercase letter.
0.9.1.6:Change:Now all regular variables (except of modules and variants) should start from the lowercase letter.
0.9.1.5:Change:Now when applying a function using infix form, e.g. x `fun` y, one can writen any literal expression (not just identifier) inside apostrophes.
0.9.1.4:Change:Now parenthesis around head/tail pattern are required everywhere except regular match construct.
0.9.1.3:New:Now one can declare functions in both infix and postfix forms.
0.9.1.2:New:Now one can use symbolic names in patterns (by enclosing them in parenthesis, e.g. 'fun (+) x y' is now valid'.
0.9.1.1:New:Now one can reference a symbolic name declared in a module (or a symbolic field in a record) using syntax 'Module.(op)'.
0.9.1.0:Release:Release of Ela 0.9.1
0.9.0.13:Change:Minor refactoring in strict range compilation logic.
0.9.0.12:Fix:'InvalidLazyListDefinition' run-time exception wasn't generated correctly (it cause VM to crush).
0.9.0.11:Fix:Flipping of parameters wasn't always done correctly when compiling partial applications of built-in functions.
0.9.0.10:Fix:Postfix and prefix calls for custom operators was compiled incorrectly.
0.9.0.8:Fix:'NotEqual' operation for ElaTuple was implemented incorrectly.
0.9.0.7:Fix:Pretty printer didn't generate 'inline' modifier for bindings with 'inline' modifier.
0.9.0.6:Change:Now compiler doesn't generate 'InlineOnlyFunctions' error.
0.9.0.5:Change:Now it is possible to use 'inline' modifier on non-global functions as well.
0.9.0.4:Fix:'Not' op code (and 'not' built-in function) worked correctly only with boolean types (e.g. it didn't work correctly with tuples).
0.9.0.3:Change:Tuples now no longer support bitwise operations (which was of low use anyway).
0.9.0.2:Change:Now when function is formatted to a string function name is enclosed in parenthesis if it is an operator.
0.9.0.1:Change:Now Ela function can determine its name even if there is no source code available and a module was read from an object file (works only for global functions).
0.9.0.0:Release:Release of Ela 0.9.0
0.8.6.103:Change:Now functions fst, snd, fst3 and snd3 are implemented as built-in functions.
0.8.6.102:New:New built-in functions tag and untag are implemented (when applied to a variant they return a variant tag and tagged value respectively).
0.8.6.101:Fix:Recovery of Ela machine after errors in interactive mode wasn't always done correctly.
0.8.6.100:Fix:Placeholder symbol '_' was compiled with an error.
0.8.6.99:Fix:Function call on a left-hand side could cause VM stack corruption (compilation logic error).
0.8.6.98:New:Now Ela supports inline functions through an 'inline' modifier.
0.8.6.97:Change:ElaTraits flags are decomissioned. Instead ElaPatterns flags will be used.
0.8.6.96:Change:Builtin functions 'typeid' and 'show' are decomissioned. Function 'show' will now be defined as a partially applied 'showf'.
0.8.6.95:Change:Variants are now not transparent.
0.8.6.94:Fix:Stack behavior for Newfun op code was calculated incorrectly.
0.8.6.93:Fix:Match was incorrectly compiled when a single tuple element was used as a match expression.
0.8.6.92:Fix:Ela linker didn't correctly process situations when an object file wasn't coupled with a source code file.
0.8.6.91:Fix:Arguments for Ela functions passed from external context (such as .NET code) were passed in a wrong order.
0.8.6.90:Fix:A bug fixed in head/tail pattern compilation logic.
0.8.6.89:Change:Compilation stage and linking stage are now overlapping. All incudles are processed exactly after an include node is found by compiler. Compiler uses metadata from compiled imported modules to decide whether it is possible to inline some of the operators.
0.8.6.88:Change:Compiler now has a setting that allows to specify the name of a module used as a Predule module (in this case no explicit import is required).
0.8.6.87:Change:An ability to define/redefine any operator added. All standard operators now will be added through 'Prelude' module.
0.8.6.86:Change:Major redesign in Ela parser and grammar. Now instead of specific operators Ela defines several tokens for operators. Priorioty and precendence is controlled by the first character (similar to OCaml/F#). Ela doesn't have built-in operators anymore except of special forms.
0.8.6.85:Change:Most of Ela operators now uses a different evaluation order (from right to left) and are no more than regular functions. Because of that sequencing operator that requires left to right order is no longer a function, but a special form.
0.8.6.84:Change:Ela multiline strings now have '<[ ... ]>' syntax.
0.8.6.83:Change:Operators '<|' and '<<' are not right associative, but '>>' is not.
0.8.6.82:Change:Minor refactoring in parsing of comprehensions (potential LL conflict in grammar is removed, no syntax changes).
0.8.6.81:New:Now implicit naming of record fields is supported when records elements are variable references, e.g. '{x,y}'.
0.8.6.80:Change:An ability to use negative numerics in pattern matching is (probably temporary) disabled.
0.8.6.79:Change:Now it is possible to declare non-global operators and to pair operators with other declarations using 'et' keyword.
0.8.6.78:Change:Pervasives engine is decomissioned (it is no longer needed with the new automatic module open procedure) along with corresponding op code and data structures. Custom operators are not treated like regular functions.
0.8.6.77:Change:Now compiler doesn't track undefined variables. Linker does.
0.8.6.76:Change:Now all module variables are imported automatically. An explicit import list is decomissioned.
0.8.6.75:Fix:A critical bug in VM fixed - pervasives (such as operators) were initialized only for the first module that referenced a module with pervasives.
0.8.6.74:New:Now Ela linker generates a warning if there is an referenced argument that wasn't supplied.
0.8.6.73:Fix:A critical bug with pervasives fixed - VM crushed in pervasives (such as operators) were used not in a main module.
0.8.6.72:New:New traits (with no corresponding logic) 'Int' and 'Real' are added to denote integer and real numbers.
0.8.6.71:Change:Ela 'Fold' trait renamed to 'Seq'.
0.8.6.70:Change:Type verification of pattern match is decomissioned. According to the language sematics all possible combinations of patterns are correct.
0.8.6.69:Change:All previous warnings and hints that were generates in a case when an irrefutable pattern was used before other patterns are decomissioned.
0.8.6.68:Change:MatchEntryAlwaysFail warning message now displays the pattern that will never match.
0.8.6.67:Change:MatchEntryTypingFailed error now made into warning.
0.8.6.66:New:Check for overlapping match entries is implemented (experimental).
0.8.6.65:Change:Pretty printer for Ela AST is completely redesigned to support indented output.
0.8.6.64:Fix:A bug in type check of patterns in pattern matching construct is fixed (string pattern and list pattern could be considered as invalid when this is a valid combination).
0.8.6.63:Change:Ela now doesn't have any special treatment for unary operators. They are treated in the same way as binary. Unary notiation is allowed using "partial application" syntax. It changes almost nothing with the only exception that unary operators can be called using postfix notation.
0.8.6.61:Change:Partial application for operators as well as operator referencing as functions now don't require braces.
0.8.6.60:Change:Keyword 'and' is not replaced by keyword 'et'.
0.8.6.59:Change:Now it is required to write function name before each function body.
0.8.6.58:Fix:Syntax for 'binding' pattern changed.
0.8.6.57:Fix:Now 'where' clause is correctly processed when it is attached to another 'where' clause (which e.g. is a regular variable binding).
0.8.6.56:Change:Multiple refactorings in Ela parser.
0.8.6.55:Fix:Multiple corrections in Ela parser error messages.
0.8.6.54:New:Now 'F' (or 'f') prefix is supported by Ela numeric literals to denote single precision floating numbers.
0.8.6.53:Fix:A critical error in compilation logic of comprehensions is fixed - multiple generators used to crash Ela machine.
0.8.6.52:Change:Now ForeignModule has a Close method that is called when Ela machine is disposed (Ela machine implements IDisposable for that and now it is mandatory to dispose it).
0.8.6.51:New:A sequencing operator '$' is now a function.
0.8.6.50:Change:Parsing rules for 'match' and 'try' expressions are changed. Now they are not 'simple' expressions anymore and cannot be used in function application without parenthesis.
0.8.6.49:Change:Minor enhancements in parser error reporting.
0.8.6.48:Fix:A bug in parser fixed - parser could crash if you try to use an operator as a function when an operator is not a function but is a special form.
0.8.6.47:New:Now Ela linker can accept files with no extension, files with .ela extension and files with .elaobj extension as primary module. It will always first try to read object file and only then - to compile a file.
0.8.6.46:Fix:An error in object file reader and writer is fixed that could cause a linker crush or incorrect module deserialization because of an error in they way how module references were processed.
0.8.6.45:Change:Ela supports optional "no layout" mode when semicolons are used as a replacement for indentation (will be useful in interactive mode).
0.8.6.44:Change:Ela now supports entering expressions directly at the top level.
0.8.6.43:Change:A new layout based syntax is implemented. Keyword 'end' is not longer required for 'let' and 'where' bindings (as well as for 'match' and 'try' expressions). Also semicolons are not required between match entries.
0.8.6.42:Fix:A bug in functional literal compilation logic fixed - it could cause stack corruption when used on a left side of an expression.
0.8.6.41:Fix:Parser could crush on a syntax error binding pattern.
0.8.6.40:Fix:A bug in range compilation logic fixed - it didn't take into account situations when range is used at the left hand side and as a result generate code could cause stack corruption.
0.8.6.39:Fix:A critical bug fixed in compilation logic of guards in pattern matching constructs.
0.8.6.38:Fix:A critical bug fixed in compilation logic of head/tail pattern.
0.8.6.37:Fix:Corrections in error message for 'TraitFieldSet' run time error.
0.8.6.36:Fix:A warning ELA400 (UnitAlwaysFail) could be generated in an incorrect case (when applying 'Eq' trait to unit which is legal).
0.8.6.35:Change:Now one can write expressions directly in the global scope.
0.8.6.34:Change:Syntax for 'module open' directive is changed from 'open Foo[dllname] as MyFoo with x,y' to 'open Foo#dllname@MyFoo with x,y'.
0.8.6.33:Fix:Minor fixes in implementation of 'Show' trait for ElaList.
0.8.6.32:Change:All imperative cycles including 'for-to', 'for-downto', 'for-in' and 'while' are decomissioned. Also 'return', 'break' and 'continue' keywords are removed.
0.8.6.31:Change:Syntax for mutable record fields changed from '{mutable x=...}' to '{!x=...}'.
0.8.6.30:Change:Strict compiler mode is decomissioned (it only enforced errors on global mutable variables which are useless as soon as there are no mutable variables at all).
0.8.6.29:Change:Ela doesn't support mutable variables anymore. One should use reference cells to achieve the same effect, e.g. '{!value=...}'.
0.8.6.28:Fix:Parse could crash on a binding expression without initialization block, e.g. 'let foo'.
0.8.6.27:Change:Minor corrections in compiler error messages.
0.8.6.26:Change:Multiple code refactorings in order to support .NET 2.0 as a minimum requirement (C# 3.0 is still a minimum version of compiler that is needed to build Ela projects).
0.8.6.25:New:Now ElaModule supports trait 'FieldGet'.
0.8.6.24:Change:Now printing infinite lists (using 'show' trait and built-in formatter helper) cannot cycle - looping through the list will always stop after first 50 elements. If one needs to show more elements than these elements should be explicitely taken from list before that ('take').
0.8.6.23:Change:Built-in function 'cout' (along with corresponding op code) is decomissioned. One should should use Con module for console output.
0.8.6.22:Change:ElaRecord fully refactored. Now it doesn't inherit ElaTuple. Also support for 'Ord' and 'Num' traits is dropped. However records still provide structural equality.
0.8.6.21:Change:Pattern matching in bindings ('let' and 'where') has changed. Now all patterns except of variant pattern can be used without extra parenthesis.
0.8.6.20:New:Trait 'Cons' extended with a 'Nil' method that can be used to get a 'nil' instance of an entity. Also a new built-in 'nil' function is added to is mapped to this action.
0.8.6.19:New:Not is is possible to create pervasives (such as custom operators) from foreign modules (modules written in .NET).
0.8.6.18:New:A new built-in function 'ref' added (along with new op code Ceqref). This function can be used to test two given object using reference equality.
0.8.6.17:Fix:A bug fixed in compilation logic of head/tail pattern for patterns that are combined from two nested patterns. A typical example of a case when this bug could be reproduced is when you have a head/tail pattern that ends with (xs@n) - in such as case 'n' variable wasn't declared at all.
0.8.6.16:Change:Trait 'Seq' renamed to 'Ix'.
0.8.6.15:New:A new public 'Concatenate' method added to ElaList (method can be used from .NET code to concatenate two lists).
0.8.6.14:Change:Ela reflection API is fully refactored.
0.8.6.13:New:Methods Left and Some added to ElaVariant to simplify construction of 'Either' variant (for operation in .NET code).
0.8.6.12:Change:Method for comparison (ElaObject.Compare) can now be overriden by the types defined outside of Ela core assembly.
0.8.6.11:Fix:Now ElaString supports 'Seq' trait (which supported by string as soon as it represents an ordered structure of elements).
0.8.6.10:Fix:Location information corrected for the literal patterns.
0.8.6.9:Fix:Pattern type check logic corrected in according to the recent type system changes (it used to generate errors for the correct cases).
0.8.6.8:Fix:Multiple corrections in Ela AST pretty printing logic.
0.8.6.7:New:Now all Ela types expose a GetTypeName method that is used internally by Ela machine to determine type name.
0.8.6.6:Change:Verification of function application at compile time is enhanced - it will now generate warning for all attempts to call something different than function if it was directly initialized with a literal.
0.8.6.5:Change:ElaArray now moved from the built-in types to the standard library. Arrcons op code, array literal, array pattern, etc. are decomissioned.
0.8.6.4:Change:'Tagval' op code renamed to 'Untag'.
0.8.6.3:Fix:'Tag' trait didn't have a full implementation. The direct casting to ElaVariant still took place for the 'untag' operation. A new 'Untag' method added to the trait 'Tag' to avoid this.
0.8.6.2:Change:FormatHelper class made public so it can be used when implementing 'Show' trait for custom types.
0.8.6.1:New:Now lazy lists can be fully used from .NET code - ElaList.Next correctly processes a situation when a list is lazy and forces thunk evaluation.
0.8.6.0:Release:Release of Ela 0.8.6
0.8.5.24:Fix:Module name wasn't preserved when using incremental linker (and as a result didn't show up in call stack).
0.8.5.23:Fix:A critical error in built-in 'flip' function fixed - it corrupted functions when applied to external functions.
0.8.5.22:Change:ElaCallException is decomissioned. Instead new ElaRuntimeException should be used by external methods (it allows to specify an exception category that is translated by Ela into variant tag).
0.8.5.21:New:Now Ela types implement 'Compare' method (which is exposed to public through implementation of IComparable<> interface in ElaValue).
0.8.5.20:New:A standard 'Equals' function is implemented in ElaValue (it delegates to 'Eq' trait implementation of a particular type).
0.8.5.19:New:A hashing function ('GetHashCode') is implemented for all Ela types where it is reasonable to have one.
0.8.5.18:Change:'Seq' trait makes its return. It is used to mark a type as a one that supports a sequential access to its elements (and is normally coupled with 'Get').
0.8.5.17:Change:Syntax of 'trait check' pattern is changed from '<Foo,Bar>' to '?(Foo,Bar)'.
0.8.5.16:Fix:Implementation of 'Eq' trait in ElaVariant now correctly processes a situation when both compared values are variants (previously a comparison like '`Foo 42 == `Bar 42' would result to 'true'.
0.8.5.15:Fix:Now ElaValue.FromObject doesn't fail if a provided value is a null reference. An ElaUnit value is used in such case.
0.8.5.14:Fix:Bug fix in a conversion method - a conversion used to fail when target and source types were the same.
0.8.5.13:New:ElaVariant now has static methods 'Some' and 'None' that simplify creation of Option-type variants.
0.8.5.12:New:Now ElaValue exposes all trait methods that can be used to operate with traits supported by a wrapped object.
0.8.5.11:Change:A 'Call' method that supports 'Call' trait made protected internal as all other trait methods.
0.8.5.10:New:A new 'Is<T>' and 'As<T>' methods added to ElaValue that can be used to test type of a wrapped object and convert it directly.
0.8.5.9:New:A 'ReferenceEquals' method added to ElaValue that can be used to perform fast reference comparison (without the need to convert to object first).
0.8.5.8:Fix:A bug in type conversion logic for ElaValue has fixed - it didn't correctly processes all the possible values for the target type and as a result conversion from ElaObject to a comparible type wasn't supported.
0.8.5.7:Fix:Now type conversion for ElaValue can correctly handle a situation when a requested conversion is from ElaValue to ElaValue.
0.8.5.6:Change:Type check pattern now has syntax '?typename' instead of 'x ? typename'. This syntax is used in all constructs, e.g. 'x is ?typename' (used to be 'x ? typename', the '?' operator was used for both 'short match' expression and type check pattern).
0.8.5.5:Change:Operator '?' is now replaced by 'is'.
0.8.5.4:Fix:Pretty printing is corrected for type check pattern when check is done against traits.
0.8.5.3:Change:A new 'Tag' trait added and now operations with polymorphic variants are performed through this trait.
0.8.5.2:Fix:Now Ela allows to use '[]' pattern in the middle of head/tail pattern (e.g. 'x[]xs'). This is a completely legal situation (nil list beign an element of another list) but was treated as an error.
0.8.5.1:Change:A built-in function 'ignore' is decomissioned.
0.8.5.0:Release:Release of Ela 0.8.5
0.8.4.12:Change:The syntax for comprehension is changed, now '\\' operator is used instead of '@', e.g. [x \\ x <- [1..10]].
0.8.4.11:New:Now ElaValue can be created from both arrays and IEnumerable implementations. The first creates ElaArray, the second - ElaList.
0.8.4.10:New:Now ElaValue.GetType method can convert Ela objects to arrays (in the same manner as to IEnumerable<>).
0.8.4.9:New:Now ElaValue.GetType method can convert Ela objects to IEnumerable<T> type where T can be a native .NET type (e.g. char or int). This also affect marshalling of data types performed by ForeignModule when registering delegates as Ela functions.
0.8.4.8:Change:Module 'open' directive syntax changed. Instead of 'open Foo at "Directory" with x' we have 'open Directory.Foo x'.
0.8.4.7:Fix:Module 'open' directive now correctly works in both Windows and Unix when a path element is specified.
0.8.4.6:Change:Minor cleanups and enhancements in parser error reporting logic.
0.8.4.5:Fix:The 'as' clause didn't work in 'open' module directive.
0.8.4.4:Fix:An incorrect warning could be generated for an expression like so 'x <- ()'.
0.8.4.3:Change:Now ToString in ElaObject prints '<unknown>' if a value cannot be determined (which happens for stack based values).
0.8.4.2:Fix:ElaRecord didn't correctly process a situation when one tried to use 'Gen' trait with it (it doesn't support Gen but error was raised).
0.8.4.1:New:Comprehension operator '@@' can now be used for ranges as well as for comprehensions.
0.8.4.0:Release:Release of Ela 0.8.4
0.8.3.7:New:Partial application (in the form '(@@ [x,x<-seq])') for the comprehension operator has added.
0.8.3.6:New:An ability to use guards (multiple, with mandatory 'else' guard) in 'let' and 'where' bindings added.
0.8.3.5:New:Now ElaString supports 'Cons' trait (can be constructed using list construction operator).
0.8.3.4:New:A comprehension operator '@@' is added. (With comprehension operator you can use comprehensions for any type that supports 'Gen' trait).
0.8.3.3:New:Now ElaLinker raises an exception when a module reference is used in sandbox mode.
0.8.3.2:Fix:A bug fixed in compilation logic of 'while true do...' expression. Invalid optimization for this pattern was causing VM to crush.
0.8.3.1:New:An ability to executed Ela scripts in a limited trust environment added. Now ElaLinker has a Sandbox option (disabled by default) that allows it.
0.8.3.0:Release:Release of Ela 0.8.3
0.8.2.10:Change:An internal type name for function is changed from 'function' to 'fun'.
0.8.2.9:Fix:Syntax in the form 'x * -y' is now recognized as invalid (the correct one is 'x * -y').
0.8.2.8:Fix:Self reference in variable declaration was always allowed for regular declarations as well that could cause VM to crush in certain cases.
0.8.2.7:New:A new public Convert method that accepts ObjectType and execution context added to ElaValue.
0.8.2.6:New:Now ElaFunction supports a set of static Create method that allow to create an Ela function from Func<> delegates.
0.8.2.5:Fix:Linker didn't scan files in the folder where 'elac.exe' is located.
0.8.2.4:Fix:Local binding using 'where' didn't always create a lexical scope.
0.8.2.3:Fix:A bug in implementation of 'length' function for lists is fixed - it could crash in a case of lazy lists or cycle forever.
0.8.2.2:Fix:A bug fixed in enumeration of lazy lists.
0.8.2.1:Fix:A bug fixed in parser that could case parser to crash in semantic action for a match entry with guards.
0.8.2.0:Release:Release of Ela 0.8.2
0.8.1.7:Change:A 'Seq' trait is decomissioned.
0.8.1.6:New:An ability to test if a given value supports specified traits is added to pattern matching, i.e. 'x ? <Num,Eq>').
0.8.1.5:Fix:Operations 'succ' and 'pred' didn't work correctly with 'tuples' - the length of a result tuple wasn't calculated correctly.
0.8.1.4:Fix:Negation ('Neg' op code) operation didn't work correctly for 'single' data type.
0.8.1.3:New:Now string support 'Ord' trait - comparison operations such as greater, lesser, etc.
0.8.1.2:Fix:Minor fixes in 'match' pretty printing logic.
0.8.1.1:Fix:Now 'end' is required for the 'where' construct. Logic that allowed to omit it in certain cases caused error prone code.
0.8.1.0:Release:Release of Ela 0.8.1
0.8.0.21:Fix:A bug in 'lazy' data type behavior when it acts as a tail of a lazy list is fixed (this bug was reproducible on certain types of lazy lists).
0.8.0.20:Fix:A bug in enumeration of certain types of lazy lists is fixed.
0.8.0.19:Fix:A bug fixed in compiler that could cause compiler to crush when an initialization is missing in a variable declaration (should result in a regular error message instead).
0.8.0.18:Fix:A bug fixed in error formatting code in Ela Console that could cause console to crush in certain cases.
0.8.0.17:New:Now all record fields are immutable by default. To declare a mutable field one should write 'mutable', i.e. '{mutable x = 0}'.
0.8.0.16:Fix:A critical bug in stack size calculation fixed - compilation logic for the head/tail pattern is rewritten.
0.8.0.15:New:Now types 'single' and 'double' support 'Enum' trait (successor/predecessor operations).
0.8.0.14:Change:'Arrcons', 'Tupcons' and 'Lrev' op codes are decomissioned. Now new op codes 'Gen' and 'Genfin' (to finalize generation) are used instead for all data structures. A new trait 'Gen' is added to support it.
0.8.0.13:Change:Compilation logic for comprehensions and ranges is refactored and now is more generic.
0.8.0.12:Change:Parsing logic for comprehensions and their representation in Ela DOM is redesigned.
0.8.0.11:Change:Serialization to string of tuples is changed for the case of single element tuples, now a comma is added at the end to match literal and to denote that this a tuple, not just grouped expression.
0.8.0.10:Fix:A bug fixed in implementation of 'pred' trait for integers (used to work in the same manner as 'succ').
0.8.0.9:New:Now type 'char' supports trait 'Ord' (comparison operations - greater, lesser, etc.).
0.8.0.8:Change:Implementation of 'Show' trait in variant is corrected and now prints only the tag if it was created without the tagged value like so `None.
0.8.0.7:New:A new 'Thunk' trait added. Now Ela 'lazy' type implements this trait and operations with lazy (force) are not hardcoded for the particular type, but for the trait (now once can implement his own lazy type).
0.8.0.6:Fix:Correction in output of value in runtime error message (in certain case the value wasn't printed).
0.8.0.5:Change:Now the name of 'memory' module (in interactive mode) is always printed in brakets like so '<memory>' when an error is printed to output.
0.8.0.4:Fix:Minor corrections in Ela compiler error messages.
0.8.0.3:New:ForeignModule now supports delegates from Func family through methods like Add(string name,Func<T1,T2> fun).
0.8.0.2:Change:Now ElaValue generate standard InvalidCastException instead of ElaCastException. ElaParameterTypeException is decomissioned as well.
0.8.0.1:New:A generic ChangeType method added to ElaValue. This method can be used for conversions.
0.8.0.0:Release:Release of Ela 0.8
0.7.20.134:New:Now it is possible to use negative integers and reals in literal patterns like so '--1' or '--.25'.
0.7.20.133:Change:Now it is not possible to declare a cycle variable as mutable (e.g. for let mutable x in...). The cycle variables are still kind of mutable but their value is changed only by the cycle itself. (Basically you can notice this only if you capture this variable using closure).
0.7.20.132:Fix:A bug fixed in partial application of functions using 'operator' syntax.
0.7.20.131:New:A pretty printing functionality is added to Ela AST. Some of the compiler error message now shows the body of an errorneous expression.
0.7.20.130:Change:Now Ela allows to declare custom operators with any number of arguments (they can be called in infix, prefix and postfix forms).
0.7.20.129:Change:Parser error reporting logic is refactored and enhanced.
0.7.20.128:Fix:Traits 'Cont' and 'Insert' used to define a mutable container such as ElaArray are removed as welll as corresponding built-ins and op codes. Now ElaArray directly exposes functions to operate with its contents like it used before.
0.7.20.127:New:Variant types are fully refactored. Now variant is a type that holds a tag and an instance of an object of any other type. It provide transparent operations with the wrapped object, e.g. you can write '`Some 3 + 5' and this will be a perfectly valid code with the result '8'. Pattern matching for variants is refactored as well.
0.7.20.126:New:'Show' trait now supports format strings (all numeric types implement them). Also new built-ins 'show' (with default format) and 'showf' (with a format as a first argument) are added with corresponding op codes.
0.7.20.125:Change:Unary minus and 'bitwise not' are now normal unary operators with their own precedence (less tight than function application). Partial application is also supported. Functions 'negate' and 'bitnot' are decomissioned.
0.7.20.124:Change:Compilation logic for pipe operators is fully refactored. Now these operators a not functions but a pure syntax and only exist in parse time and are translated to regular function application AST node.
0.7.20.123:Fix:Validation logic for PM as a function definition (check whether patterns for all function parameters are provided) is corrected. It didn't recognize errorneous situations in some cases.
0.7.20.122:Change:Guards expressions (PM without patterns and 'match with' block) are (probably temporary) decomissioned.
0.7.20.121:Fix:A bug in compilation logic of head/tail pattern was fixed. This bug could cause stack corruption (unused data could be left on a stack).
0.7.20.120:Change:Do/end expression decomissioned. One shoudl use sequencing operator '$' instead.
0.7.20.119:Change:Cycles now no longer can be used as the comprehension syntax.
0.7.20.118:Change:Mutable variable declaration syntax changed from "var x = ..." to "let mutable x = ...".
0.7.20.117:Change:The 'or' pattern (written using '||' operator) is now decomissioned. One can use closures to achieve the similar effect.
0.7.20.116:New:Now it is possible to use string literals when specifying record field names in record pattern.
0.7.20.115:Fix:A bug fixed in code for cloning external function (an array that holds partially applied parameters wasn't cloned and a new function copy used the pointer to the same array).
0.7.20.114:Fix:A bug fixed in compilation logic of 'if' expression (wrong lexical scoping, both 'if' and 'else' clauses had the same lexical scope which could cause VM to crush in some rare cases).
0.7.20.113:New:Now one can use string literal to specify field names in record literal if a field name doesn't comply with identifier rules, e.g. {"text-decoration"="underline"}.
0.7.20.112:Change:A 'field test' pattern (the one that doesn't binding a value of record field but simply checks if this field is present) is decomissioned.
0.7.20.111:Change:Compilation logic for record patterns is refactored.
0.7.20.110:Change:Now 'where' binding support function definition by PM and multiple binding using 'and' but has a required 'end' terminator.
0.7.20.109:New:A new 'Call' trait is implemented (this trait is supported by 'function' data type).
0.7.20.108:New:An ability to reload an opened module added to Ela linker and VM (this feature is used by interactive console).
0.7.20.107:Change:Ela VM and type system are seriously refactored to gain a better type flexibility. Also performance is tuned for certain cases.
0.7.20.106:Change:'Eq' trait now has both methods Equals and NotEquals. 'Ord' traits now have methods additional methods 'GreaterEquals' and 'LesserEquals'.
0.7.20.105:Change:Now most of trait operations return 'ElaValue' and not a concrete value, e.g. Equals, Greater, etc. return ElaValue, not a boolean value as they used to. One can use 'Bool' trait to obtain boolean.
0.7.20.104:Change:'Invalid' type is decomissioned and is no longer used internally by VM to signal an incorrect operation.
0.7.20.103:Change:The 'Show' trait is extended with extendable ShowInfo structure that can be used to provide display options.
0.7.20.102:Change:Now Ela supports only implicit conversion from int to long and from single to double, int to double, long to single, etc. are prohibited.
0.7.20.101:Change:The 'traits' system is fully refactored. Now all binary operations accept two parameters for both left and right operands - now expressions 'Foo + x' and 'x + Foo' will have the same result type.
0.7.20.100:New:A lazy list comprehension is implemented that can be used to generate lazy linked lists using the same syntax as with regular lists comprehensions.
0.7.20.99:New:Now tuples support comparisons (based on their elements), arithmetic and bitwise operations.
0.7.20.98:New:A new 'where' binding implemented (in Haskell style). This binding can be scoped to guards and can be quite useful in pattern matching.
0.7.20.97:Change:Now lambdas support guards but don't support multiple body definition.
0.7.20.96:New:Guards syntax has changed and guards are enhanced - now they can be used in PM without patterns (in such case either the previous pattern is considered or none). Match compilation logic has changed to support this.
0.7.20.95:New:A new 'Lazycall' op code added that is used to optimize lazy values creation and execution when a body of a lazy value is a function application.
0.7.20.94:Change:Op codes 'Brptr' and 'Pushptr' are removed a long with the special stack 'pointer' data type as soon as these staff is no longer needed by Ela interpreter.
0.7.20.93:New:Now it is possible to use guards in method formal parameter list.
0.7.20.92:New:Ranges in Haskell style added (including support for infinite lists).
0.7.20.91:Fix:Ela op code deserialization logic was incorrect and caused linker to crush.
0.7.20.90:Fix:A logic for verification of date stamps of Ela object files (in Ela linker) was incorrect and generated a warning when it wasn't needed.
0.7.20.89:Fix:A bug fixed in interactive mode - user defined operators didn't work at in incremental compilation mode.
0.7.20.88:New:A new 'Trait' op code is added that allow to check whether an object support provided traits.
0.7.20.87:New:A new 'Tag' trait is added that potentially allows other data types (not only records and tuples) to be 'tagged'.
0.7.20.86:Change:Implementation of polymorphic variants has changed. Now variant constructors are not literals but functions. In fact a 'tag' built-in function that accepts a string tag and an object is used for construction of variants. Older syntax is just a sugar for it - e.g. `Some (x, y) is equivalent to tag "Some" (x, y). Constructors for variants are also removed from the language. Now regular functions can be used to construct variants with the same success.
0.7.20.85:New:Compilation of simple cases for the pattern head/tail (which are the most common cases) is seriously optmized. New op codes are used for this - 'Skiptl' and 'Skiptn'.
0.7.20.84:Change:Module 'open' expressions can be used only as top level expressions.
0.7.20.83:New:An alternative (closer to Set-Builder notation) list and array comprehension syntax added.
0.7.20.82:Change:Now for expression and while expression use a do/end block as their body therefore the 'end' token is required for them.
0.7.20.81:Change:Now a global scope can either contains a single expression (can be useful in interactive mode) or only let/do expressions. All other expressions are prohibited. Semicolons are no longer used to separate declarations. The only place where semicolons can be used are do/end expressions.
0.7.20.80:Change:Do/while and until expressions are removed. Also unless expression (a version of when expression) is removed.
0.7.20.79:Change:A new do/end expression is introduced to simplify writing imperative code. Expressions inside do/end block should be separated with semicolons. This construct doesn not define a lexical scope.
0.7.20.78:New:A support for lazy lists is added. Now lists allow to have a 'thunk' as a next element. Therefore a second argument of a cons operator can simply contains a lazy value.
0.7.20.77:Change:Generator function (or so called 'static functions') are fully removed from the language along with 'Newfuns', 'Callcc', 'Checkcc', 'Yield' and many other related op codes. Also built-in functions 'iter' and 'next' are removed and for/in construct is rewritten to use 'Fold' trait.
0.7.20.76:New:Ela reflection API is refactored according to the new changes in Ela object model. Exceptions are now records with a 'Type' tag.
0.7.20.75:New:A new 'Convert' trait is added that can be used to control how objects convert to each other.
0.7.20.74:Change:Conversion routine is again refactored. Now ElaValue doesn't implement IConvertible but defines methods that exactly corresponds to Ela types and perform exact type marshalling and no conversion.
0.7.20.73:New:A new 'Show' trait that controls formatting of objects to a string added. Now string conversion and string representation are two different things.
0.7.20.72:New:ElaArray now implements 'Fold' trait and can be analysed using pattern matching (specifically head/tail pattern).
0.7.20.71:New:A new 'Fold' and 'Cons' traits are added that allow to fully similate linked lists by other data structures.
0.7.20.70:New:A new exception handling mechanism for objects that support traits is implemented. Exception handling is done through the ExecutionContext instance and allows to preserve full stack trace if an error object originates from the Ela code (e.g. executed in another worker thread).
0.7.20.69:Change:Now all virtual machine operations are based on traits, including atomic operations such as 'add', 'sub', 'del' and more complex operations.
0.7.20.68:Change:New built-in functions 'add', 'remove', 'clear' and 'insert' are added instead of built-in functions of array. These new functions however are polymorphic.
0.7.20.67:Change:Ela object model fully refactored. A new 'traits' concept is introduced. All standard functions are groups into categories (traits) and external objects can fully extend object model and can be used with Ela standard operators. Now objects don't have any built-in attributes at all.
0.7.20.66:Change:Calculation of lazy values is refactored.
0.7.20.65:Change:'Typeid' op code now checks if a value is unevaluated lazy and pushes lazy type ID, if it is an evaluated lazy and pushes ID of an actual value or acts as normal in other case.
0.7.20.64:New:A new 'force' built-in function (and corresponding 'Force' op code) added that can be used to explicitly force lazy values.
0.7.20.63:Change:Functions id, sub, key and rec are no longer built-in. They will be moved to the library.
0.7.20.62:New:An 'AmbiguousUnary' parser error added that rejects expressions in the form 'n-1' (without spaces). Previously they were considered to be function applications.
0.7.20.61:Fix:Compilation logic for list pattern is fixed (it worked correctly only for the first two elements).
0.7.20.60:Fix:Comprehension compilation logic fixed (nested comprehensions didn't work correctly).
0.7.20.59:Fix:A bug fixed in compilation logic of variants and in compilation logic of variants call.
0.7.20.58:New:A shortcut syntax for record pattern is now available, one can write '{foo}' as an equivalent to '{foo=foo}'.
0.7.20.57:Fix:A bug in indexer logic of lists is fixed.
0.7.20.56:Fix:Now compiler disallows implicit tupling of function arguments when PM is used in function definition and an irrefutable pattern (such as 'x') is specified while not providing the full argument list. This behavior could cause unintuitive runtime errors.
0.7.20.55:Fix:A bug fixed in comparison logic ('Br_eq' and 'Br_neq') of boolean values.
0.7.20.54:Change:Now each function has its own stack which size is defined statically, therefore the need to dynamically check and resize stack is eleminated which causes noticeable performance improvements.
0.7.20.53:New:Now Ela compiler statically calculates the size of the stack for functions and global scope.
0.7.20.52:Change:Linker level verification of variants is disabled (probably will be removed in future).
0.7.20.51:Change:Work with exceptions is fully redesigned, new syntax introduced ('raise' and 'fail'), new op code for rethrowing exceptions without chaing call stack ('Rethrow'), ElaError object is redesigned as well. Now polymorphic variants are used to present exceptions.
0.7.20.50:Change:Not it is not possible to skip linking stage. One should run Ela machine only after linker, not after compiler.
0.7.20.49:Change:Conversion routines rewritten for all Ela types and ElaValue. Now conversion behavior can be extended by custom types. Also lazy values acts as proxies, therefore the need to force them when passing to external methods is eliminated.
0.7.20.48:Change:'Throw' op code splitted into two op codes - 'Throw' to generate user exceptions and 'Failwith' to generate system exceptions (these two op codes have different stack behavior).
0.7.20.47:Change:Op codes 'Newfund' and 'Calld' removed. Now calling and creating a function with statically unknown number of parameters is not supported.
0.7.20.46:Change:'Newtup' op code changed. Tuple literal compilation rewritten to use new op code 'Tupcons' that allows to statically calculate stack size.
0.7.20.45:Change:'Newrec' op code changed. Record literal compilation rewritten to use new op code 'Reccons' that allows to statically calculate stack size.
0.7.20.44:Change:'Newarr' op code changed. Array literal and array comprehension compilation rewritten to use new op code 'Arrcons' that allows to statically calculate stack size.
0.7.20.43:Change:'Lgen' op code removed. List literal and list comprehension compilation rewritten to use new op codes 'Lconsr' and 'Lrev' that allow to statically calculate stack size.
0.7.20.42:New:New op codes 'Popelemi' and 'Pushelemi' added to optimize work with indexers (experimental).
0.7.20.41:Fix:A bug fixed in compilation logic for the field reference (in some cases an instruction 'Popfld' may be incorrectly generated instead of 'Pushfld' which will lead to VM crush).
0.7.20.40:Change:Compiler warnings about calling a function with incorrect number of parameters are removed - now this case cannot be verified statically.
0.7.20.39:Change:Execution and compilation logic optimized for functions with tupled parameters, e.g. f(x, y). New op code 'Tupex' is added to support that.
0.7.20.38:Fix:A bug fixed in tail recursion optimization - it could be incorrectly applied in the case if a function with the same name (but not the same function) is tail called.
0.7.20.37:Change:Now curried functions are always called with exactly one parameter, e.g. fun x y will be compiled into two function calls ((f x) y).
0.7.20.36:New:ElaSequence type removed with op codes 'Pushseq', 'Newseq' and 'Convseq'. Appropriate changes in compiler, VM and value formatter are made.
0.7.20.35:Fix:Size of 'Throw' op code was calculated incorrectly during byte code serialization.
0.7.20.34:Fix:A bug in eval stack trim procedure fixed (used in exception handling) - could cause parasite entries on eval stack.
0.7.20.33:Change:Compilation logic for pipes is optimized for the cases when builtin functions are used with pipes (functions are now inlined).
0.7.20.32:Fix:A bug fixed in compilation logic of 'try' expression - it didn't pop value when used as a left hand expression.
0.7.20.31:New:Lazy with memoization makes its return but now has a full transparency for the client code (no need to manually force lazy values).
0.7.20.30:New:Support for mutually recursive functions (using 'and' keyword in declarations) added.
0.7.20.29:Change:Now fun sym (in debug info) is generated for composition if a composition is at the right hand side of a variable declaration.
0.7.20.28:Change:Now instead of sigma '$' for arguments a dedicated argument literal is used in parser (e.g. '$ arg' is not valid anymore, but '$arg' is valid).
0.7.20.27:Change:Operator priorities are corrected for better usability (closer to Haskell).
0.7.20.26:Change:Now '+' is valid only for numeric types, for string/list, etc. concatenation a new '++' operator is used. A corresponding 'Concat' op code added.
0.7.20.25:Change:Refactoring in AST and compiler - now assignment operators ('<-' and '<->') are presented as a binary operator and not a separate AST node.
0.7.20.24:Fix:A bug fixed in tail call (Callt op code) - in certain cases it could cause VM to crush.
0.7.20.23:Change:Now Ela doesn't have unary operators (both standard and custom). 'Bitwise not' replaced with 'bitnot' function, boolean not - with 'not', etc.
0.7.20.22:New:The 'let' binding now can be used to start a lexical scope by adding 'in' after the binding (in the Haskell/OCaml style).
0.7.20.21:New:Partial application (for both left and right arguments) implemented for standard operators.
0.7.20.20:New:A flip built-in function (both regular and inline) implemented. Function flips first two parameters of a supplied functions. It works through the new op code Flip.
0.7.20.19:New:An ability to define multiple function bodies added (used for pattern matching sugar in Haskell style).
0.7.20.18:Fix:A bug fixed in optimization logic for compilation of endless cycle, e.g. 'while true'.
0.7.20.17:Fix:A bug fixed in 'as' pattern (binding was done only if a pattern was matched successfully which could cause a VM crash).
0.7.20.16:New:A new type enforcement pattern (that actually converts an object to a supplied type) implemented.
0.7.20.15:Fix:A bug in 'is' patten fixed (binding were never done correctly).
0.7.20.14:Fix:A bug fixed in refresh logic for inner state of virtual machine (could cause VM to crash when opening module in interactive session).
0.7.20.13:New:A new 'Swap' op code added that swaps two values on the top of the stack (e.g. making left right and right left).
0.7.20.12:Change:Assignment operator '<-' now yields unit instead of operation result.
0.7.20.11:Change:Now most of Ela operators are functions and can be used in the same way as regular functions (compiler tries to inline them however wherever possible).
0.7.20.10:Fix:A bug with recursive variable declaration was fixed. Now recursive references only allowed in function declarations.
0.7.20.9:Change:Formatting of types for functions changed to use notation 'a->'a->'a. Formatting also shows partial applied functions as a pair of signatures.
0.7.20.8:Change:Expressions 'typeof', 'ignore' and 'cout' are removed and replaced by special buil-in functions ('typeof' renamed to 'typeid') that can be inlined in certain cases.
0.7.20.7:Fix:Fixed an incorrect warning generation for the case when a unit type function is used in a pipe chain.
0.7.20.6:Fix:A bug fixed in error generation logic when a call to Ela function was done through virtual machine using Call method (the case for built-in object functions).
0.7.20.5:Change:Now all functions accepts at least one parameter. Function without parameters can be simulated using unit pattern '()' instead of parameters list.
0.7.20.4:Change:Increment, decrement, post increment and post decrement operators are removed.
0.7.20.3:Change:Unary minus operator is removed. Minus now has a syntax '~' is a regular function call.
0.7.20.2:Change:Boolean pattern as well as And pattern are removed from pattern matching.
0.7.20.1:Change:Full redesign of language syntax in ML style.
0.7.20.0:Release:Release of Ela 0.7.20.
0.7.19.37:Fix:A bug fixed fixed in compilation logic of custom operators (wrong parameter order for operators were used).
0.7.19.36:Fix:A bug fixed in parsing logic of the backward composition operator.
0.7.19.35:Fix:A bug fixed in parsing logic of the forward pipe operator.
0.7.19.34:Fix:A bug fixed in compilation logic of generators (execution of generators could fail because of unneccarry stack manipulation code).
0.7.19.33:Change:Implementation of pervasives (e.g. custom operators) is completely rewritten and is now much more effecient.
0.7.19.32:Fix:A bug fixed in literal pattern (it wasn't possible to use negative integers and reals).
0.7.19.31:Change:Compilation logic for automatically generated polymorphic variants fully refactored. Now it doesn't create a constructor function but generates a variant in place.
0.7.19.30:New:Now sequence pattern, list pattern and array pattern support a 'dot-dot' operator that allows to use 'relaxed' check of a corresponding sequence size (equal or greater to the number of arguments in the pattern instead of strictly equals by default).
0.7.19.29:Change:List and constructor pattern AST nodes and parsing logic refactored.
0.7.19.28:Fix:A bug fixed in a VM state refresh procedure that is used by interactive mode (the memory layouts didn't properly resize).
0.7.19.27:Fix:The 'long' data type didn't correctly convert to 'double' during implicit conversions.
0.7.19.26:Fix:A bug fixed in compilation logic of function - function handle was calculated incorrectly, different handles can be used for the same function in symbols and in byte code.
0.7.19.25:Fix:A variants related bug fixed - variants were accidentally exported as a part of visible global scope which could VM to fail through introspection.
0.7.19.24:Fix:A bug fixed in compilation logic of contructor pattern (didn't correctly process situations when formal parameter list wasn't specified at all).
0.7.19.23:Fix:A bug fixed in compilation logic of variants (incorrect variable address calculation for storing generated constructors).
0.7.19.22:Fix:A bug fixed in ElaLazy computation logic that cause unnecessary stack operations.
0.7.19.21:Fix:A bug fixed in interactive mode of VM - it didn't correctly recover after errors.
0.7.19.20:Change:StackOffset removed from the function memory frame because of redundancy.
0.7.19.19:Fix:Iteration didn't work for records (but worked for tuples).
0.7.19.18:Fix:A bug fixed in the record indexer implementation (didn't work correctly for the numeric indices).
0.7.19.17:Fix:A bug fixed in the Pushfld op code for the case a standard record attribute (such as length) was queried.
0.7.19.16:Change:Now ElaList inherits ElaIndexedObject and supports an indexer operator as well as array.
0.7.19.15:Fix:Now compiler raises an error for the casts to non-supported types, previously such situations were completely ignored.
0.7.19.14:Fix:Fixed bug in optimization of tail calls for binary operators including pipe operators.
0.7.19.13:Fix:A critical bug fixed in implementation of async calculation (the result of value of calculation was never persisted).
0.7.19.12:Fix:Error reporting for the cases when a field of an object is immutable enhanced in a virtual machine.
0.7.19.11:Fix:A bug fixed in compilation logic of function composition.
0.7.19.10:Fix:A bug fixed in tail recursion - VM crushed when a function called to itself without supplying full argument list.
0.7.19.9:Fix:A bug fixed in stack clear logic of ExecuteThrow routine in Ela VM.
0.7.19.8:Fix:A bug/design leak fixed in compilation logic for the polymorphic variants. Compilation logic fully redesigned. Also now variants are scoped as regular variables.
0.7.19.7:Fix:A bug in Callt op code fixed (bug cause VM to crash when a tail call was done to the function in another module).
0.7.19.6:New:A new setting added to linker that allows to specify a name of a standard library. Stdlib is now preloaded and it is also possible to use shorter open declarations for standard modules (expiremental).
0.7.19.5:Change:Minor clean-ups in Ela parser grammar.
0.7.19.4:Change:Exception handling logic refactored in virtual machine and parser. Now each Ela component generates its own exception type (e.g. ElaParserException).
0.7.19.3:New:Now match patterns can be used inside functions formal parameter list, e.g. \([x,y]) { ... }.
0.7.19.2:Change:A new syntax for anonymous functions implemented instead of (x, y) -> expr now \(x, y) expr.
0.7.19.1:Fix:Bug fixes in operations affinity table in virtual machine (several types such as 'int' and 'double' were always incompatible).
0.7.19.0:Release:Release of Ela 0.7.19.
0.7.18.48:Fix:A bug fixed that could cause an error when calling a function with empty body.
0.7.18.47:Fix:A bug fixed in compilation logic of variants (wrong argument order).
0.7.18.46:Fix:A bug fixed in compilation logic for short version of match expression.
0.7.18.45:Change:Now compiler supports separate 'debug' (generate debug info) and 'optimize' (perform optimizations) flags.
0.7.18.44:Change:Tail call optimization disabled inside try/catch and for generators.
0.7.18.43:Change:Function composition compilation logic optimized.
0.7.18.42:New:A tail call (non-recursive) is now optimized. A call is performed using new op code 'Callt' (experimental).
0.7.18.41:Fix:A bug fixed in currying logic in virtual machine.
0.7.18.40:New:FunctionImplicitPartial warning is now generated when a function is partially applied during composition.
0.7.18.39:Change:Minor changes in composition grammar - order of evaluation for '>>>' and '<<<' operators is exchanged.
0.7.18.38:New:Now function call verification is performed against composed functions (using function composition operators).
0.7.18.37:New:Now function call verification is performed against curried functions as well.
0.7.18.36:New:A new FunctionZeroParams warning is now generated with a function with non-zero argument list is tried to call with empty argument list.
0.7.18.35:New:A new mechanism implemented in compiler that allows expression compiler to return additional metadata about compilation results which can be used for code verification and optimization.
0.7.18.34:Fix:A bug in function composition fixed (number of arguments for the first function were incorrectly determined which caused VM to crush).
0.7.18.33:New:A shortcut syntax (e.g. fun(x, y,)) with a trailing comma added for tuple creation inside a function call expression (as an alternative to fun((x,y))).
0.7.18.32:New:A new static verification added - compiler now tries to determine if a function call operation is performed against function and generates an appropriate warning if needed.
0.7.18.31:New:A new static verification added - compiler now tries to check if a correct number of arguments are specified in a function call and generates an appropriate warning if needed.
0.7.18.30:Change:Parallel match compilation logic optimized, new diagnostic warnings added.
0.7.18.29:Change:Match compilation logic optimized for the cases when pattern matching is used in cycles.
0.7.18.28:Change:Error reporting completely refactored for parser, compiler, linker and Ela runtime.
0.7.18.27:New:A new ElaRecordInfo class added to the reflection API. This class is used to describe 'record' data types and exposes method to operate with record fields.
0.7.18.26:Change:Ela type system was refactored in the part that is responsible for the reflection support, redundant code removed.
0.7.18.25:Change:Error handling in virtual machine enhanced for all indexer related operations (Popelem, Pushelem, Popfld, Pushfld).
0.7.18.24:Change:A new ElaIndexedObject type was added Ela type system.This type is now used as a base type for all types that support indexer operation.
0.7.18.23:Change:ElaTypeInfo changes 'IsIndexed' field is removed.
0.7.18.22:Change:ElaTupleInfo changes 'IsTagged' field is replaced by the 'Tag' field that returns a tag value. Comparison logic is updated as well.
0.7.18.21:Fix:A bug fixed in the parser production for the sequence match pattern that was creating nested sequences instead of processing them a solid sequence.
0.7.18.20:New:A new 'Len' op code was added. This op code is used when compiling match instead of manually pushing "length" field.
0.7.18.19:Change:Match validation (typing of match patterns) is fully redesigned, both AST and match compilation logic have changed.
0.7.18.18:Change:Ela AST refactored in the part that represents elements of match expression.
0.7.18.17:Change:Minor refactoring in Ela code model (parser AST).
0.7.18.16:Fix:Now placeholder expression ('_') is correctly processed when used inside casts, 'typeof' and 'is' expressions.
0.7.18.15:Fix:A bug fix in functions with multiple parameters created using partial application.
0.7.18.14:Fix:Newseq op didn't correctly check the type of an argument when a sequence was created from a static function (regular function could be used with no errors).
0.7.18.13:New:ElaTupleInfo added to reflection API (can be obtained through ElaTuple and ElaRecord instances).
0.7.18.12:Change:Minor refactoring in Ela type system.
0.7.18.11:New:ElaSequenceInfo added to reflection API (can be obtained through ElaSequence instance).
0.7.18.10:Change:Minor refactorying and enhancements in ElaSequence type.
0.7.18.9:New:ElaLazyInfo added to reflection API (can be obtained through ElaLazy instance).
0.7.18.8:Change:Minor refactoring in ElaLazy type.
0.7.18.7:New:Comparison methods (that are usable from both Ela code and .NET) added to Ela reflection classes.
0.7.18.6:New:A default ToString implementation return type name in Ela notation added to all Ela types.
0.7.18.5:New:ElaVariableInfo now has a getValue method exposed to Ela code that returns a variable value.
0.7.18.4:New:ElaAssemblyInfo added to reflection API (it is accessible through ElaModuleInfo instance).
0.7.18.3:Change:Now coroutine is executed using the same Call procedure as a regular function. Also regular Call procedure is now able to correctly process static functions.
0.7.18.2:New:Currying implemented for both native and external functions (experimental for now).
0.7.18.1:Change:Minor refactoring in ElaFunctionInfo and ElaFunction object as well as in function call code in ElaMachine.
0.7.18.0:Release:Release of Ela 0.7.18.
0.7.17.11:New:A new reflection API that is usable from both Ela and .NETis implemented.
0.7.17.10:Change:Now ElaObject has a protected virtual EnumerateFields method that returns all fields exposed by an object.
0.7.17.9:Change:Now ElaObject has a GetValue(int) method that can be used by indexed derivations such as ElaTuple or ElaArray.
0.7.17.8:Change:Changes in Ela type system organization - now ElaTuple, ElaString and ElaRecord don't inherit ElaArray.
0.7.17.7:Change:Additional public constructors added to ElaList to simplify array creation from .NET code.
0.7.17.6:Change:Additional public constructors added to ElaTuple to simplify array creation from .NET code.
0.7.17.5:Change:Changes in grammar. Now it is possible to obtain fields from primitives literals, i.e. "1.getType()".
0.7.17.4:New:Now it is possible to create a tuple with one argument using (x,) notation and to match against such a tuple.
0.7.17.3:Change:Additional public constructors added to ElaArray to simplify array creation from .NET code.
0.7.17.2:Fix:A bug fixed in ElaString - it couldn't obtain the very first character through the indexer.
0.7.17.1:Fix:A bug fixed in 'ctor' and 'any ctor' patterns for the case when a variant contains only a single element.
0.7.17.0:Release:Release of Ela 0.7.17.
0.7.16.22:Change:Minor performance tweaks in ElaMachine for 64 bit.
0.7.16.21:Change:ElaFunction object refactored. Now native function is implemented through internal ElaNativeFunction class and ElaFunction is an abstract base class.
0.7.16.20:New:Now tail call optimization is done when last expression in function is a pipe (|> or <|) operator.
0.7.16.19:New:Now it is possible to create external Ela function with an unlimited number of parameters (used for String.format currently).
0.7.16.18:Fix:Minors clean-ups in runtime code.
0.7.16.17:Fix:Bug fixed in ElaLinker that was causing some error messages to be lost.
0.7.16.16:New:A new method 'ToModule' was added to the RuntimeValue structure.
0.7.16.15:Change:'Module' type is implemented through 'ElaModule' class that has a module handle and a reference to ElaMachine.
0.7.16.14:New:Scope class now has a public EnumerateNames method that allows to iterate through all variable names.
0.7.16.13:Change:Output format for the call stack is changed.
0.7.16.12:Change:Now ElaDebugger and not ElaMachine is responsible for building call stack for errors.
0.7.16.11:Fix:An unneccessary 'Cache' hint removed from compiler.
0.7.16.10:Fix:Minor fixes in error reporter for parser, enhanced error reporting for match syntax errors.
0.7.16.9:Change:Minor clean-ups in compiler code and internal compiler object model.
0.7.16.8:Change:Clean-ups in CodeFrame implementation, change work with module references.
0.7.16.7:Change:CodeAssembly, work with module names, handles and arguments was fully redesigned.
0.7.16.6:Fix:A bug fixed that was causing VM to fail if there is a return from a function from another module.
0.7.16.5:Fix:Linker didn't correctly handle situations when different modules have the same name (only one module was actually saved).
0.7.16.4:Fix:Stack wasn't cleared when an exception is raised from the VM.
0.7.16.3:Fix:Compiler now catches situations when cases of 'or' patterns don't match in number of variable declarations.
0.7.16.2:Fix:When compiling 'as' pattern an existing variable can be used instead of forcing to declare a new variable.
0.7.16.1:Fix:Fixes in parser for pattern matching - sequences, tail and head, 'as' patterns are now processed more correctly.
0.7.16.0:Release:Release of Ela 0.7.16
0.7.15.36:Fix:Minor fixes in exception handling, error messages moved to the Strings table.
0.7.15.35:New:A lookup table OpHelper.OpSize was added in order to determine the size of op codes, object file read/write logic modified to use new op code size lookup table.
0.7.15.34:Change:Call_0 op code removed.
0.7.15.33:Change:Listlen op code removed (replaced by Pushfld "length").
0.7.15.32:Change:Arrlen op code removed (replaced by Pushfld "length").
0.7.15.31:Change:Refactoring in Ela type system, better public API for interoperability with .NET.
0.7.15.30:Change:Object file format reading/writing is enabled again.
0.7.15.29:Change:Refactoring in parser (language grammar).
0.7.15.28:Change:Major refactoring in AST(now it is possible to construct AST outside of Ela library).
0.7.15.27:New:ElaExpression.SetLinePragma(int,int) public method added.
0.7.15.26:Change:CodeFrame.File made public (but with internal setter).
0.7.15.25:Change:ScopeVar structure made public (also added public read-only properties VariableAddress and VariableFlags).
0.7.15.24:Change:Methods Scope.GetVariable and Scope.Clone made public.
0.7.15.23:Change:CodeFrame.GlobalScope property made public (but with internal setter).
0.7.15.22:Change:CodeFrame.Imports property made public and changed type to IReadOnlyMap<>.
0.7.15.21:New:Map<> and IReadOnlyMap<> added for use by compiler for imports, pervasives, etc.
0.7.15.20:New:ElaTranslationException class was added (can be helpful for writing user code).
0.7.15.19:New:A protected CodeAssembly.AddModule method added. This method allows to add new CodeFrame instances to the module list.
0.7.15.18:Change:PushI4_1 and PushI4_2 op codes removed.
0.7.15.17:Change:Call_1 and Call_2 op codes removed.
0.7.15.16:Change:Throw_S op code removed. Now Throw is used for both cases (system and user exceptions).
0.7.15.15:Change:Newtup_3 op code removed.
0.7.15.14:New:Now 'is' operator can be used to check if an expression is unit using unit literal ().
0.7.15.13:Change:List_isnull op code removed and replaced by Listlen op code.
0.7.15.12:Change:Unused Cin op code removed.
0.7.15.11:Fix:Minor fix in EIL generation logic (0 was printed for opcodes without argument).
0.7.15.10:Change:Minor refactoring in op codes naming.
0.7.15.9:Change:Now 'yield' presence is determined through expression flags, not through HasYield virtual property.
0.7.15.8:Change:A syntax sugar for the generators was removed.
0.7.15.7:New:Now an empty tuple (unit literal) is recognized as a 'unit' type expression when performing static code analysis.
0.7.15.6:New:Now warning is raised when one of the expression in binary expression always returns 'unit'.
0.7.15.5:New:Now 'yield', 'return', 'break' and 'continue' are not allowed in binary expression (previously they caused 'Stack corrupted' error).
0.7.15.4:New:A new 'BreaksExecution' hint added to the AST (for 'yield', 'return', 'break', 'continue'; can be used for code analysis).
0.7.15.3:New:A new 'ReturnsUnit' hint added to the AST (can be used for static code analysis).
0.7.15.2:Change:Minor refactoring in parser.
0.7.15.1:Change:Linkers are now generic classes (compiler and parser can be specified via generic parameters).
0.7.15.0:Release:Release of Ela 0.7.15
0.7.14.4:Change:Op codes encoding/decoding (parser and vm optimization, less memory consumption).
0.7.14.3:Fix:Bug fix in record data type (unable to change values of fields).
0.7.14.2:New:Implemented until and do/until cycles (similar to while and do/while cycles).
0.7.14.1:Fix:Bug fix in while cycle (always executed as an endless cycle).
0.7.14.0:Release:Release of Ela 0.7.14

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)

Share

About the Author

Basil Voronkov
Microsoft
Russian Federation Russian Federation
Ph.D. in philosophy
Work as a software consultant, Microsoft, Russia.
Main specialization: .NET
Interested in: functional programming

| Advertise | Privacy | Mobile
Web02 | 2.8.141022.2 | Last Updated 5 Jul 2012
Article Copyright 2011 by Basil Voronkov
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid