Releases: ArkScript-lang/Ark
Releases · ArkScript-lang/Ark
ArkScript v4.0.0-10
Added
- more tests for the io builtins
- added lines and code coloration in the error context
- new dependency: fmtlib
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
$repr
macro to get a string representation of a given node- added boost-ext/ut to write unit tests in C++
- basic ArkScript code formatter, available through the CLI:
arkscript -f|--format
- comments are now tracked in the AST and attached to the nearest node below them
VM::forceReloadPlugins
, to be used by the REPL to force reload the plugins and be sure that their symbols are all define- added
help
,save
(save history to disk),history
(print history),reset
(reset vm and code) commands to the REPL - REPL can now show when a code block isn't terminated (prompt changes from
>
to:
) - more controls available inside the REPL
- fuzzing step in the CI
- better error reporting on unknown import
- check on number of arguments passed to
type
- warning when the formatter deletes comment(s) by mistake
- check on arguments passed to
list
,concat
,append
and friends to only push valid nodes (that produces a value) $paste
to paste a node inside a maro without evaluating it further ; useful to stop recursive evaluation of nodes inside function macros- introduced
Ark::internal::Pass
to describe compiler passes: they all output an AST (parser, import solver, macro processor, and optimizer for now) - add
-f(no-)importsolver
,-f(no-)macroprocessor
and-f(no-)optimizer
to toggle on and off those compiler passes - added resolving
empty?
as a macro when possible - added short-circuiting to
and
andor
implementation - added
--check
to the formatter as an option: returns 0 if the code is correctly formatted, 1 otherwise - 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_CONST
when a closure is made - added
-fdump-ir
to 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
and
andor
- basic dead code elimination in the AST optimizer
Changed
- instructions are on 4 bytes: 1 byte for the instruction, 1 byte of padding, 2 bytes for an immediate argument
- enhanced the bytecode reader and its command line interface
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
- fixed underline bug in the error context
- the str:format functions now expects strings following this syntax: https://fmt.dev/latest/syntax.html
- more documentation about the compiler implementation
- more documentation about the virtual machine
- closures can be now be compared field per field:
(= closure1 closure2)
will work only if they have the same fields (name) and if the values match - macros are now defined like
($ name value)
/($ name (args args args) body)
/($if cond then else)
- upgraded from C++17 to C++20
- new parser, new syntax for imports:
(import package.sub.file)
- allow nodes to be empty when dumping the AST to JSON
- macros can be declared inside a begin block within a cond macro and used in the scope surrounding the cond macro
arkscript --version
andarkscript --help
now output ArkScript version with the commit hashvoid Value::toString(std::ostream&, VM&)
now becomesstd::string Value::toString(VM&)
- removed
Node::operator<<
to replace it withNode::debugPrint
- fixed a bug in the compiler where one could pass a non symbol to
let
,mut
orset
, resulting in a compiler crash - fixed a bug in the macro processor where one could pass an unknown symbol to
argcount
and crash the processor - fixed a bug in the compiler where one could pass something other than a list to
(fun)
as the argument block, resulting in a crash - fixed a bug in the compiler generating not callable functions
- fixed a bug in the macro processor generating invalid
let
/mut
/set
nodes - fixed a bug in the macro processor allowing out of bounds access with
($ test (@ [1 2 3] -5))
- fixed a bug in the vm which wrongfully allowed self concat in place:
(concat! lst lst)
- fixed a bug in the compiler where one could "use" operators without calling them:
(print nil?)
- fixed a bug in the compiler allowing the use of operators without any argument:
(+)
- fixed a bug in the vm during error reporting when a non-function was used as a function
- refactored code inside the bytecode reader to promote code reuse
- fixed a bug in the compiler generating invalid
while
nodes - fixed a bug when passing the wrong number of arguments to a function inside an async call was crashing the VM because the function couldn't be named
- fixed a bug in the compiler generating invalid
fun
nodes - fixed a bug when generating
let
,mut
orset
nodes inside macros with an invalid node type - fixed a bug when reading invalid UTF8 codepoints in the parser caused out of bounds reads
- fixed a bug with recursive macro, exhausting the stack space due to recursive evaluation
- futures can be awaited again, they will return nil on all the tries
- checking for reused argument name in macros during parsing
- enhanced comment after node handling in macros
- adding a hard limit on package names length (255 characters, to comply with posix limits)
- disallow passing invalid nodes as arguments to functions and operators
- checking for unevaluated spread inside macros
- checking for invalid symbols when defining a function through a macro
- added a max macro unification depth
- added a max macro evaluation depth
- introduced
internal::listInstructions
with 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
symcat
andargcount
to$symcat
and$argcount
for uniformity - the
Ark::VM
class is nowfinal
- the
STORE
instruction has been renamedSET_VAL
- the
STORE
instruction is emitted in place of theLET
andMUT
instructions, without any mutability checking now io:writeFile
no longer takes a mode and has been split intoio:writeFile
andio: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:xyz
builtins tostring:xyz
for uniformity with the standard library string:find
takes an optional third argument, startIndex (where to start the lookup from, default 0list:setAt
can work with negative indexes, and is now bound checked- re-enabled the AST optimizer, only used for the main
arkscript
executable (not enabled when embedding arkscript, so that one can grab variables from the VM)
Removed
- removed unused
NodeType::Closure
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
Utils::digPlaces
andUtils::decPlaces
got removed as they were no longer needed- removed deprecated code (
list:removeAt
,ark
executable now replaced byarkscript
) - removed
VM::getUserPointer
andVM::setUserPointer
- removed
ARK_PROFILER_COUNT
define - removed useless
\0
escape in strings - removed
termcolor
dependency to rely onfmt
for coloring outputs - removed
and
andor
instructions in favor of a better implementation to support short-circuiting - removed
LET
andMUT
instructions in favor of a single newSTORE
instruction - removed
SAVE_ENV
instruction
ArkScript v4.0.0-9
Added
- more tests for the io builtins
- added lines and code coloration in the error context
- new dependency: fmtlib
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
$repr
macro to get a string representation of a given node- added boost-ext/ut to write unit tests in C++
- basic ArkScript code formatter, available through the CLI:
arkscript -f|--format
- comments are now tracked in the AST and attached to the nearest node below them
VM::forceReloadPlugins
, to be used by the REPL to force reload the plugins and be sure that their symbols are all define- added
help
,save
(save history to disk),history
(print history),reset
(reset vm and code) commands to the REPL - REPL can now show when a code block isn't terminated (prompt changes from
>
to:
) - more controls available inside the REPL
- fuzzing step in the CI
- better error reporting on unknown import
- check on number of arguments passed to
type
- warning when the formatter deletes comment(s) by mistake
- check on arguments passed to
list
,concat
,append
and friends to only push valid nodes (that produces a value) $paste
to paste a node inside a maro without evaluating it further ; useful to stop recursive evaluation of nodes inside function macros- introduced
Ark::internal::Pass
to describe compiler passes: they all output an AST (parser, import solver, macro processor, and optimizer for now) - add
-f(no-)importsolver
,-f(no-)macroprocessor
and-f(no-)optimizer
to toggle on and off those compiler passes - added resolving
empty?
as a macro when possible - added short-circuiting to
and
andor
implementation - added
--check
to the formatter as an option: returns 0 if the code is correctly formatted, 1 otherwise
Changed
- instructions are on 4 bytes: 1 byte for the instruction, 1 byte of padding, 2 bytes for an immediate argument
- enhanced the bytecode reader and its command line interface
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
- fixed underline bug in the error context
- the str:format functions now expects strings following this syntax: https://fmt.dev/latest/syntax.html
- more documentation about the compiler implementation
- more documentation about the virtual machine
- closures can be now be compared field per field:
(= closure1 closure2)
will work only if they have the same fields (name) and if the values match - macros are now defined like
($ name value)
/($ name (args args args) body)
/($if cond then else)
- upgraded from C++17 to C++20
- new parser, new syntax for imports:
(import package.sub.file)
- allow nodes to be empty when dumping the AST to JSON
- macros can be declared inside a begin block within a cond macro and used in the scope surrounding the cond macro
arkscript --version
andarkscript --help
now output ArkScript version with the commit hashvoid Value::toString(std::ostream&, VM&)
now becomesstd::string Value::toString(VM&)
- removed
Node::operator<<
to replace it withNode::debugPrint
- fixed a bug in the compiler where one could pass a non symbol to
let
,mut
orset
, resulting in a compiler crash - fixed a bug in the macro processor where one could pass an unknown symbol to
argcount
and crash the processor - fixed a bug in the compiler where one could pass something other than a list to
(fun)
as the argument block, resulting in a crash - fixed a bug in the compiler generating not callable functions
- fixed a bug in the macro processor generating invalid
let
/mut
/set
nodes - fixed a bug in the macro processor allowing out of bounds access with
($ test (@ [1 2 3] -5))
- fixed a bug in the vm which wrongfully allowed self concat in place:
(concat! lst lst)
- fixed a bug in the compiler where one could "use" operators without calling them:
(print nil?)
- fixed a bug in the compiler allowing the use of operators without any argument:
(+)
- fixed a bug in the vm during error reporting when a non-function was used as a function
- refactored code inside the bytecode reader to promote code reuse
- fixed a bug in the compiler generating invalid
while
nodes - fixed a bug when passing the wrong number of arguments to a function inside an async call was crashing the VM because the function couldn't be named
- fixed a bug in the compiler generating invalid
fun
nodes - fixed a bug when generating
let
,mut
orset
nodes inside macros with an invalid node type - fixed a bug when reading invalid UTF8 codepoints in the parser caused out of bounds reads
- fixed a bug with recursive macro, exhausting the stack space due to recursive evaluation
- futures can be awaited again, they will return nil on all the tries
- checking for reused argument name in macros during parsing
- enhanced comment after node handling in macros
- adding a hard limit on package names length (255 characters, to comply with posix limits)
- disallow passing invalid nodes as arguments to functions and operators
- checking for unevaluated spread inside macros
- checking for invalid symbols when defining a function through a macro
- added a max macro unification depth
- added a max macro evaluation depth
- introduced
internal::listInstructions
with 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
symcat
andargcount
to$symcat
and$argcount
for uniformity
Removed
- removed unused
NodeType::Closure
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
Utils::digPlaces
andUtils::decPlaces
got removed as they were no longer needed- removed deprecated code (
list:removeAt
,ark
executable now replaced byarkscript
) - removed
VM::getUserPointer
andVM::setUserPointer
- removed
ARK_PROFILER_COUNT
define - removed useless
\0
escape in strings - removed
termcolor
dependency to rely onfmt
for coloring outputs - removed
and
andor
instructions in favor of a better implementation to support short-circuiting
ArkScript v4.0.0-8
Added
- more tests for the io builtins
- added lines and code coloration in the error context
- new dependency: fmtlib
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
$repr
macro to get a string representation of a given node- added boost-ext/ut to write unit tests in C++
- basic ArkScript code formatter, available through the CLI:
arkscript -f|--format
- comments are now tracked in the AST and attached to the nearest node below them
VM::forceReloadPlugins
, to be used by the REPL to force reload the plugins and be sure that their symbols are all define- added
help
,save
(save history to disk),history
(print history),reset
(reset vm and code) commands to the REPL - REPL can now show when a code block isn't terminated (prompt changes from
>
to:
) - more controls available inside the REPL
- fuzzing step in the CI
- better error reporting on unknown import
- check on number of arguments passed to
type
- warning when the formatter deletes comment(s) by mistake
- check on arguments passed to
list
,concat
,append
and friends to only push valid nodes (that produces a value) $paste
to paste a node inside a maro without evaluating it further ; useful to stop recursive evaluation of nodes inside function macros- introduced
Ark::internal::Pass
to describe compiler passes: they all output an AST (parser, import solver, macro processor, and optimizer for now) - add
-f(no-)importsolver
,-f(no-)macroprocessor
and-f(no-)optimizer
to toggle on and off those compiler passes - added resolving
empty?
as a macro when possible - added short-circuiting to
and
andor
implementation - added
--check
to the formatter as an option: returns 0 if the code is correctly formatted, 1 otherwise
Changed
- instructions are on 4 bytes: 1 byte for the instruction, 1 byte of padding, 2 bytes for an immediate argument
- enhanced the bytecode reader and its command line interface
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
- fixed underline bug in the error context
- the str:format functions now expects strings following this syntax: https://fmt.dev/latest/syntax.html
- more documentation about the compiler implementation
- more documentation about the virtual machine
- closures can be now be compared field per field:
(= closure1 closure2)
will work only if they have the same fields (name) and if the values match - macros are now defined like
($ name value)
/($ name (args args args) body)
/($if cond then else)
- upgraded from C++17 to C++20
- new parser, new syntax for imports:
(import package.sub.file)
- allow nodes to be empty when dumping the AST to JSON
- macros can be declared inside a begin block within a cond macro and used in the scope surrounding the cond macro
arkscript --version
andarkscript --help
now output ArkScript version with the commit hashvoid Value::toString(std::ostream&, VM&)
now becomesstd::string Value::toString(VM&)
- removed
Node::operator<<
to replace it withNode::debugPrint
- fixed a bug in the compiler where one could pass a non symbol to
let
,mut
orset
, resulting in a compiler crash - fixed a bug in the macro processor where one could pass an unknown symbol to
argcount
and crash the processor - fixed a bug in the compiler where one could pass something other than a list to
(fun)
as the argument block, resulting in a crash - fixed a bug in the compiler generating not callable functions
- fixed a bug in the macro processor generating invalid
let
/mut
/set
nodes - fixed a bug in the macro processor allowing out of bounds access with
($ test (@ [1 2 3] -5))
- fixed a bug in the vm which wrongfully allowed self concat in place:
(concat! lst lst)
- fixed a bug in the compiler where one could "use" operators without calling them:
(print nil?)
- fixed a bug in the compiler allowing the use of operators without any argument:
(+)
- fixed a bug in the vm during error reporting when a non-function was used as a function
- refactored code inside the bytecode reader to promote code reuse
- fixed a bug in the compiler generating invalid
while
nodes - fixed a bug when passing the wrong number of arguments to a function inside an async call was crashing the VM because the function couldn't be named
- fixed a bug in the compiler generating invalid
fun
nodes - fixed a bug when generating
let
,mut
orset
nodes inside macros with an invalid node type - fixed a bug when reading invalid UTF8 codepoints in the parser caused out of bounds reads
- fixed a bug with recursive macro, exhausting the stack space due to recursive evaluation
- futures can be awaited again, they will return nil on all the tries
- checking for reused argument name in macros during parsing
- enhanced comment after node handling in macros
- adding a hard limit on package names length (255 characters, to comply with posix limits)
- disallow passing invalid nodes as arguments to functions and operators
- checking for unevaluated spread inside macros
- checking for invalid symbols when defining a function through a macro
- added a max macro unification depth
- added a max macro evaluation depth
- introduced
internal::listInstructions
with 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
symcat
andargcount
to$symcat
and$argcount
for uniformity
Removed
- removed unused
NodeType::Closure
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
Utils::digPlaces
andUtils::decPlaces
got removed as they were no longer needed- removed deprecated code (
list:removeAt
,ark
executable now replaced byarkscript
) - removed
VM::getUserPointer
andVM::setUserPointer
- removed
ARK_PROFILER_COUNT
define - removed useless
\0
escape in strings - removed
termcolor
dependency to rely onfmt
for coloring outputs - removed
and
andor
instructions in favor of a better implementation to support short-circuiting
ArkScript v4.0.0-rc7
Added
- more tests for the io builtins
- added lines and code coloration in the error context
- new dependency: fmtlib
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
$repr
macro to get a string representation of a given node- added boost-ext/ut to write unit tests in C++
- basic ArkScript code formatter, available through the CLI:
arkscript -f|--format
- comments are now tracked in the AST and attached to the nearest node below them
VM::forceReloadPlugins
, to be used by the REPL to force reload the plugins and be sure that their symbols are all define- added
help
,save
(save history to disk),history
(print history),reset
(reset vm and code) commands to the REPL - REPL can now show when a code block isn't terminated (prompt changes from
>
to:
) - more controls available inside the REPL
- fuzzing step in the CI
- better error reporting on unknown import
- check on number of arguments passed to
type
- warning when the formatter deletes comment(s) by mistake
- check on arguments passed to
list
,concat
,append
and friends to only push valid nodes (that produces a value) $paste
to paste a node inside a maro without evaluating it further ; useful to stop recursive evaluation of nodes inside function macros
Changed
- instructions are on 4 bytes: 1 byte for the instruction, 1 byte of padding, 2 bytes for an immediate argument
- enhanced the bytecode reader and its command line interface
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
- fixed underline bug in the error context
- the str:format functions now expects strings following this syntax: https://fmt.dev/latest/syntax.html
- more documentation about the compiler implementation
- more documentation about the virtual machine
- closures can be now be compared field per field:
(= closure1 closure2)
will work only if they have the same fields (name) and if the values match - macros are now defined like
($ name value)
/($ name (args args args) body)
/($if cond then else)
- upgraded from C++17 to C++20
- new parser, new syntax for imports:
(import package.sub.file)
- allow nodes to be empty when dumping the AST to JSON
- macros can be declared inside a begin block within a cond macro and used in the scope surrounding the cond macro
arkscript --version
andarkscript --help
now output ArkScript version with the commit hashvoid Value::toString(std::ostream&, VM&)
now becomesstd::string Value::toString(VM&)
- removed
Node::operator<<
to replace it withNode::debugPrint
- fixed a bug in the compiler where one could pass a non symbol to
let
,mut
orset
, resulting in a compiler crash - fixed a bug in the macro processor where one could pass an unknown symbol to
argcount
and crash the processor - fixed a bug in the compiler where one could pass something other than a list to
(fun)
as the argument block, resulting in a crash - fixed a bug in the compiler generating not callable functions
- fixed a bug in the macro processor generating invalid
let
/mut
/set
nodes - fixed a bug in the macro processor allowing out of bounds access with
($ test (@ [1 2 3] -5))
- fixed a bug in the vm which wrongfully allowed self concat in place:
(concat! lst lst)
- fixed a bug in the compiler where one could "use" operators without calling them:
(print nil?)
- fixed a bug in the compiler allowing the use of operators without any argument:
(+)
- fixed a bug in the vm during error reporting when a non-function was used as a function
- refactored code inside the bytecode reader to promote code reuse
- fixed a bug in the compiler generating invalid
while
nodes - fixed a bug when passing the wrong number of arguments to a function inside an async call was crashing the VM because the function couldn't be named
- fixed a bug in the compiler generating invalid
fun
nodes - fixed a bug when generating
let
,mut
orset
nodes inside macros with an invalid node type - fixed a bug when reading invalid UTF8 codepoints in the parser caused out of bounds reads
- fixed a bug with recursive macro, exhausting the stack space due to recursive evaluation
- futures can be awaited again, they will return nil on all the tries
- checking for reused argument name in macros during parsing
- enhanced comment after node handling in macros
- adding a hard limit on package names length (255 characters, to comply with posix limits)
- disallow passing invalid nodes as arguments to functions and operators
- checking for unevaluated spread inside macros
- checking for invalid symbols when defining a function through a macro
- added a max macro unification depth
Removed
- removed unused
NodeType::Closure
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
Utils::digPlaces
andUtils::decPlaces
got removed as they were no longer needed- removed deprecated code (
list:removeAt
,ark
executable now replaced byarkscript
) - removed
VM::getUserPointer
andVM::setUserPointer
- removed
ARK_PROFILER_COUNT
define - removed useless
\0
escape in strings
ArkScript v4.0.0-rc6
Added
- more tests for the io builtins
- added lines and code coloration in the error context
- new dependency: fmtlib
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
$repr
macro to get a string representation of a given node- added boost-ext/ut to write unit tests in C++
- basic ArkScript code formatter, available through the CLI:
arkscript -f|--format
- comments are now tracked in the AST and attached to the nearest node below them
VM::forceReloadPlugins
, to be used by the REPL to force reload the plugins and be sure that their symbols are all define- added
help
,save
(save history to disk),history
(print history),reset
(reset vm and code) commands to the REPL - REPL can now show when a code block isn't terminated (prompt changes from
>
to:
) - more controls available inside the REPL
- fuzzing step in the CI
- better error reporting on unknown import
- check on number of arguments passed to
type
- warning when the formatter deletes comment(s) by mistake
- check on arguments passed to
list
,concat
,append
and friends to only push valid nodes (that produces a value)
Changed
- instructions are on 4 bytes: 1 byte for the instruction, 1 byte of padding, 2 bytes for an immediate argument
- enhanced the bytecode reader and its command line interface
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
- fixed underline bug in the error context
- the str:format functions now expects strings following this syntax: https://fmt.dev/latest/syntax.html
- more documentation about the compiler implementation
- more documentation about the virtual machine
- closures can be now be compared field per field:
(= closure1 closure2)
will work only if they have the same fields (name) and if the values match - macros are now defined like
($ name value)
/($ name (args args args) body)
/($if cond then else)
- upgraded from C++17 to C++20
- new parser, new syntax for imports:
(import package.sub.file)
- allow nodes to be empty when dumping the AST to JSON
- macros can be declared inside a begin block within a cond macro and used in the scope surrounding the cond macro
arkscript --version
andarkscript --help
now output ArkScript version with the commit hashvoid Value::toString(std::ostream&, VM&)
now becomesstd::string Value::toString(VM&)
- removed
Node::operator<<
to replace it withNode::debugPrint
- fixed a bug in the compiler where one could pass a non symbol to
let
,mut
orset
, resulting in a compiler crash - fixed a bug in the macro processor where one could pass an unknown symbol to
argcount
and crash the processor - fixed a bug in the compiler where one could pass something other than a list to
(fun)
as the argument block, resulting in a crash - fixed a bug in the compiler generating not callable functions
- fixed a bug in the macro processor generating invalid
let
/mut
/set
nodes - fixed a bug in the macro processor allowing out of bounds access with
($ test (@ [1 2 3] -5))
- fixed a bug in the vm which wrongfully allowed self concat in place:
(concat! lst lst)
- fixed a bug in the compiler where one could "use" operators without calling them:
(print nil?)
- fixed a bug in the compiler allowing the use of operators without any argument:
(+)
- fixed a bug in the vm during error reporting when a non-function was used as a function
- refactored code inside the bytecode reader to promote code reuse
- fixed a bug in the compiler generating invalid
while
nodes - fixed a bug when passing the wrong number of arguments to a function inside an async call was crashing the VM because the function couldn't be named
- fixed a bug in the compiler generating invalid
fun
nodes - fixed a bug when generating
let
,mut
orset
nodes inside macros with an invalid node type - fixed a bug when reading invalid UTF8 codepoints in the parser caused out of bounds reads
- fixed a bug with recursive macro, exhausting the stack space due to recursive evaluation
- futures can be awaited again, they will return nil on all the tries
- checking for reused argument name in macros during parsing
- enhanced comment after node handling in macros
- adding a hard limit on package names length (255 characters, to comply with posix limits)
- disallow passing invalid nodes as arguments to functions and operators
- checking for unevaluated spread inside macros
- checking for invalid symbols when defining a function through a macro
- added a max macro unification depth
Removed
- removed unused
NodeType::Closure
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
Utils::digPlaces
andUtils::decPlaces
got removed as they were no longer needed- removed deprecated code (
list:removeAt
,ark
executable now replaced byarkscript
) - removed
VM::getUserPointer
andVM::setUserPointer
- removed
ARK_PROFILER_COUNT
define - removed useless
\0
escape in strings
ArkScript v4.0.0-rc5
Added
- more tests for the io builtins
- added lines and code coloration in the error context
- new dependency: fmtlib
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
$repr
macro to get a string representation of a given node- added boost-ext/ut to write unit tests in C++
- basic ArkScript code formatter, available through the CLI:
arkscript -f|--format
- comments are now tracked in the AST and attached to the nearest node below them
VM::forceReloadPlugins
, to be used by the REPL to force reload the plugins and be sure that their symbols are all define- added
help
,save
(save history to disk),history
(print history),reset
(reset vm and code) commands to the REPL - REPL can now show when a code block isn't terminated (prompt changes from
>
to:
) - more controls available inside the REPL
Changed
- instructions are on 4 bytes: 1 byte for the instruction, 1 byte of padding, 2 bytes for an immediate argument
- enhanced the bytecode reader and its command line interface
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
- fixed underline bug in the error context
- the str:format functions now expects strings following this syntax: https://fmt.dev/latest/syntax.html
- more documentation about the compiler implementation
- more documentation about the virtual machine
- closures can be now be compared field per field:
(= closure1 closure2)
will work only if they have the same fields (name) and if the values match - macros are now defined like
($ name value)
/($ name (args args args) body)
/($if cond then else)
- upgraded from C++17 to C++20
- new parser, new syntax for imports:
(import package.sub.file)
- allow nodes to be empty when dumping the AST to JSON
- macros can be declared inside a begin block within a cond macro and used in the scope surrounding the cond macro
arkscript --version
andarkscript --help
now output ArkScript version with the commit hashvoid Value::toString(std::ostream&, VM&)
now becomesstd::string Value::toString(VM&)
- removed
Node::operator<<
to replace it withNode::debugPrint
Removed
- removed unused
NodeType::Closure
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
Utils::digPlaces
andUtils::decPlaces
got removed as they were no longer needed- removed deprecated code (
list:removeAt
,ark
executable now replaced byarkscript
) - removed
VM::getUserPointer
andVM::setUserPointer
- removed
ARK_PROFILER_COUNT
define
ArkScript v4.0.0-rc4
Added
- more tests for the io builtins
- added lines and code coloration in the error context
- new dependency: fmtlib
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
$repr
macro to get a string representation of a given node- added boost-ext/ut to write unit tests in C++
- basic ArkScript code formatter, available through the CLI:
arkscript -f|--format
- comments are now tracked in the AST and attached to the nearest node below them
Changed
- instructions are on 4 bytes: 1 byte for the instruction, 1 byte of padding, 2 bytes for an immediate argument
- enhanced the bytecode reader and its command line interface
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
- fixed underline bug in the error context
- the str:format functions now expects strings following this syntax: https://fmt.dev/latest/syntax.html
- more documentation about the compiler implementation
- more documentation about the virtual machine
- closures can be now be compared field per field:
(= closure1 closure2)
will work only if they have the same fields (name) and if the values match - macros are now defined like
($ name value)
/($ name (args args args) body)
/($if cond then else)
- upgraded from C++17 to C++20
- new parser, new syntax for imports:
(import package.sub.file)
- allow nodes to be empty when dumping the AST to JSON
- macros can be declared inside a begin block within a cond macro and used in the scope surrounding the cond macro
arkscript --version
andarkscript --help
now output ArkScript version with the commit hash
Removed
- removed unused
NodeType::Closure
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
Utils::digPlaces
andUtils::decPlaces
got removed as they were no longer needed- removed deprecated code (
list:removeAt
,ark
executable now replaced byarkscript
)
ArkScript v4.0.0-0.3
Added
- more tests for the io builtins
- added lines and code coloration in the error context
- new dependency: fmtlib
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
$repr
macro to get a string representation of a given node- added boost-ext/ut to write unit tests in C++
Changed
- instructions are on 4 bytes: 1 byte for the instruction, 1 byte of padding, 2 bytes for an immediate argument
- enhanced the bytecode reader and its command line interface
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
- fixed underline bug in the error context
- the str:format functions now expects strings following this syntax: https://fmt.dev/latest/syntax.html
- more documentation about the compiler implementation
- more documentation about the virtual machine
- closures can be now be compared field per field:
(= closure1 closure2)
will work only if they have the same fields (name) and if the values match - macros are now defined like
($ name value)
/($ name (args args args) body)
/($if cond then else)
- upgraded from C++17 to C++20
- new parser, new syntax for imports:
(import package.sub.file)
Removed
- removed unused
NodeType::Closure
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
Utils::digPlaces
andUtils::decPlaces
got removed as they were no longer needed- removed deprecated code (
list:removeAt
,ark
executable now replaced byarkscript
)
ArkScript v4.0.0-0.2
Added
- more tests for the io builtins
- added lines and code coloration in the error context
- new dependency: fmtlib
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
Changed
- instructions are on 4 bytes: 1 byte for the instruction, 1 byte of padding, 2 bytes for an immediate argument
- enhanced the bytecode reader and its command line interface
- added the padding/instruction/argumentation values when displaying instructions in the bytecode reader
- fixed underline bug in the error context
- the str:format functions now expects strings following this syntax: https://fmt.dev/latest/syntax.html
- more documentation about the compiler implementation
- more documentation about the virtual machine
- closures can be now be compared field per field:
(= closure1 closure2)
will work only if they have the same fields (name) and if the values match
Removed
- removed unused
NodeType::Closure
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
- removing the custom string, replacing it with std::string (the format engine of the custom string had a lot of memory leaks)
Utils::digPlaces
andUtils::decPlaces
got removed as they were no longer needed- removed deprecated code (
list:removeAt
,ark
executable now replaced byarkscript
)
ArkScript v3.5.0
Added
- added fuzzing tools and corpus for AFL
- added some tests for errors
- added recursion limit reached detection
Changed
- plugins can be constructed from outside ArkScript lib/modules folder, easing the development process
- plugins loading now works as intended: look alongside the given file/bytecode file, then in the std lib folder
- new way to create modules, easier to use
- calling a non-callable anonymous object do not result in a segfault
- macro processor function registering now handles empty nodes
- added a fix to avoid crashes when capturing unbound variables
- checking if the given operator takes one or more arguments at compile time
- adding bound checking on operator @
- adding bound checking on operator @ when used in macros
- better arity check for macros
- fixed a bug in the macro processor where macros were deleted when they shouldn't
- fixed a bug where macro functions with no argument would crash the macro processor