Releases: ArkScript-lang/Ark
Releases · ArkScript-lang/Ark
Release list
ArkScript v4.0.0-17
Added
GET_CURRENT_PAGE_ADDRESSinstruction to push the current page address to the stackCALL_CURRENT_PAGEsuper instruction, calling the current page with a given number of arguments (avoid loading a page address on the stack, then popping it to perform the call)- new data type
Dict, which can be created with(dict "key" "value" ...), and manipulated withdict:get,dict:add,dict:contains,dict:remove,dict:keysanddict:size
Changed
- the VM no longer stores a reference to the current function being called in the newly created scope
ArkScript v4.0.0-16
Added
- wasm export: we can now run ArkScript code on the web!
Changed
- renamed
string:formattoformat io:removeFilesis nowio:removeFileand works on a single file/path- renamed almost all builtins to prefix them with
builtin__, to have them proxied in the standard library (to be able to import and scope them properly) - new super instruction
CALL_BUILTIN_WITHOUT_RETURN_ADDRESSto optimize the proxied builtins, skipping the return address deletion
ArkScript v4.0.0-15
Added
LT_CONST_JUMP_IF_FALSEandLT_SYM_JUMP_IF_FALSEto compare a symbol to a const and a symbol to a symbol (respectively), then jump to an address if false (useful for while loops that check a simple(< x n)condition)LT_CONST_JUMP_IF_TRUE, counterpart ofLT_CONST_JUMP_IF_FALSEGT_CONST_JUMP_IF_TRUE, counterpart ofLT_CONST_JUMP_IF_TRUEGT_CONST_JUMP_IF_FALSE, counterpart ofLT_CONST_JUMP_IF_FALSEGT_SYM_JUMP_IF_FALSE, counterpart ofLT_SYM_JUMP_IF_FALSECALL_SYMBOLsuper instruction to load and call a symbol in a single instructionGET_FIELD_FROM_SYMBOLandGET_FIELD_FROM_SYMBOL_INDEXsuper instructions to get a field from a closure and push it to the stackEQ_CONST_JUMP_IF_TRUEandEQ_SYM_INDEX_JUMP_IF_TRUEto compare a symbol to a const and a symbol to a symbol (respectively), then jump to an address if true (useful for conditions that check a simple(= x n)condition)NEQ_CONST_JUMP_IF_TRUEas a super instruction counterpart toEQ_CONST_JUMP_IF_TRUENEQ_SYM_JUMP_IF_FALSE, counterpart ofLT_SYM_JUMP_IF_FALSEfor inequalityAT_SYM_SYMandAT_SYM_INDEX_SYM_INDEXsuper instructions, to get an element from a list in a single instruction, avoiding 2 push and 2 popCHECK_TYPE_OFandCHECK_TYPE_OF_BY_INDEXsuper instructions, to check the type of variable against a constant in a single instructionINCREMENT_STOREandDECREMENT_STOREsuper instructions, to update a value in place when incrementing/decrementing it by a set amountAPPEND_IN_PLACE_SYMandAPPEND_IN_PLACE_SYM_INDEXsuper instructionsPUSH_RETURN_ADDRESSinstruction now replaces the VM auto push of IP/PP- remove the stack swapping by pushing arguments in the reverse order by which they are loaded
Changed
- macros are now defined like
(macro name value)/(macro name (args args args) body)/($if cond then else)
ArkScript v4.0.0-14
Added
- instruction source location ; two new bytecode tables were added: one for filenames, another for (page pointer, instruction pointer, file id, line), allowing the VM to display better error messages when the source is available
- show source location when a runtime error is thrown in the VM
Changed
- VM stack size is now 4096 instead of 8192
Ark::CodeErrornow takes aCodeErrorContextto store the source (filename, line, column, expression) of an error
Removed
- removed
Value VM::resolve(const Value* val, Args&&... args), which has been deprecated in ArkScript v3.4.0
ArkScript v4.0.0-13
Added
$as-isto paste a node inside a maro without evaluating it further ; useful to stop recursive evaluation of nodes inside function macrosLOAD_SYMBOL_BY_INDEXinstruction, loading a local from the current scope by an index (0 being the last element added to the scope)STORE_FROM_INDEXandSET_VAL_FROM_INDEXinstructions for parity with the super instructions not using load by indexINCREMENT_BY_INDEXandDECREMENT_BY_INDEXinstructions for parity with the super instructions not using load by indexSTORE_TAIL_BY_INDEX,STORE_HEAD_BY_INDEX,SET_VAL_TAIL_BY_INDEX,SET_VAL_HEAD_BY_INDEXsuper instructions added for parity with the super instructions not using load by indexRESET_SCOPEinstruction emitted at the end of a while loop to reset a scope so that we can create multiple variables and useLOAD_SYMBOL_BY_INDEX
Changed
-bcroption can be given a source file, it will then be compiled before its bytecode is shown- magic numbers for tables start in bytecode files have been changed from 0x01, 0x02, 0x03 to 0xA1, 0xA2, 0xA3 (symbols, values, code) to make them stand out in hex editors
- magic numbers for value types in bytecode files have been changed from 0x01, 0x02, 0x03 to 0xF1, 0xF2, 0xF3 (number, string, function)
- numbers in the values table in bytecode files are no longer stringified but their IEEE754 representation is now encoded on 12 bytes (4 for the exponent, 8 for the mantissa)
- changed how scopes are stored inside the VM to enhance performances. All scope data are now contiguous!
- when possible, accessing variables from the current scope is compiled to a new instruction
LOAD_SYMBOL_BY_INDEX, to avoid the sometimes expansive lookup by id- this works inside normal scopes (introduced by while loops) and functions scopes, but not for closures
ArkScript v4.0.0-12
Added
- new builtin
random, returning a random number between INT_MIN and INT_MAX, or in a custom range $as-isto paste a node inside a maro without evaluating it further ; useful to stop recursive evaluation of nodes inside function macros
Changed
- upgraded fmtlib to 11.1.3-13
- allow capture in nested scope (before it was targeting only the current scope)
ArkScript v4.0.0-11
Added
- new operator
@@to get elements in list of lists / list of strings
Changed
- loops have their own scope: variables created inside a loop won't leak outside it
ArkScript v4.0.0-10
Added
- the name & scope resolution pass now checks for mutability errors
- compile time checks for mutability errors with
append!,concat!andpop! - new
MAKE_CLOSURE <page addr>instruction, generated in place of aLOAD_CONSTwhen a closure is made - added
-fdump-irto dump the IR entities to a file named{file}.ark.ir - added 11 super instructions and their implementation to the VM
- support for the glob import syntax and symbol import syntax
- modify list and return a copy
(string:setAt string index char)(bound checked) - added in place list mutation:
(@= list|string index new_value),(@@= list|list<string> index1 index2 new_value|char)(bound checked) - compile time argument count check for
andandor - basic dead code elimination in the AST optimizer
Changed
- the
Ark::VMclass is nowfinal - the
STOREinstruction has been renamedSET_VAL - the
STOREinstruction is emitted in place of theLETandMUTinstructions, without any mutability checking now io:writeFileno longer takes a mode and has been split intoio:writeFileandio:appendToFile- instructions are now positioned like this:
inst byte1 byte2 byte3- byte1 is 0 if the instruction takes a single argument on 16 bits, split on byte2 and byte3
- if the instruction takes two arguments, they each have 12 bits ; the second one is on byte1 and upper half of byte2, the first on lower half of byte2 and then byte3
- ast-to-json dump now supports macros
- the parser can detect ill-formed macros (that are seen as function macros while being value macros)
- adding a
CALL_BUILTIN <builtin> <arg count>super instruction - fixed formatting of comments after the last symbol in an import node
- renamed
str:xyzbuiltins tostring:xyzfor uniformity with the standard library string:findtakes an optional third argument, startIndex (where to start the lookup from, default 0list:setAtcan work with negative indexes, and is now bound checked- re-enabled the AST optimizer, only used for the main
arkscriptexecutable (not enabled when embedding arkscript, so that one can grab variables from the VM)
Removed
- removed
LETandMUTinstructions in favor of a single newSTOREinstruction - removed
SAVE_ENVinstruction
ArkScript v4.0.0-9
Changed
- formatted ArkScript examples
- better variable formatting in the ArkScript code formatter
ArkScript v4.0.0-8
Added
- introduced
Ark::internal::Passto describe compiler passes: they all output an AST (parser, import solver, macro processor, and optimizer for now) - add
-f(no-)importsolver,-f(no-)macroprocessorand-f(no-)optimizerto toggle on and off those compiler passes - added resolving
empty?as a macro when possible - added short-circuiting to
andandorimplementation - added
--checkto the formatter as an option: returns 0 if the code is correctly formatted, 1 otherwise
Changed
- added a max macro evaluation depth
- introduced
internal::listInstructionswith the different instructions, to be used by the compiler and name resolution pass - checking for forbidden variable/constant name in the name & scope resolution pass, to give errors to the user before compiling some weird code
- repl completion and colors are now generated automatically from the builtins, keywords & operators
- fixed formating of comments inside function declarations
- renamed the macros
symcatandargcountto$symcatand$argcountfor uniformity
Removed
- removed
termcolordependency to rely onfmtfor coloring outputs - removed
andandorinstructions in favor of a better implementation to support short-circuiting