* Notes about this changelog.
* The big headings with the -- prefixed and suffixed.
* to the version marks released versions.
* These versions are downloadable from my website.

-- Version 1.x --

10.01.2011
Complete rewrite of BlackRabbit Script.

31.12.2012
Stopped developing BlackRabbit Script.

-- Version 1.2.0 --

19.02.2015
Rewrote BlackRabbit Script using a new parser called the Zenith Engine.
Added basic print support using if return statement.
Added support for variables from the command line.

-- Version 1.2.01 --

20.02.2015
Added CLI support to BRS.
Added support for reading code in Zenith Engine.
Added file read support to BRS.
Translation process added.
Variable assignment added.
Print function added.

21.02.2015
Evaluate function added.
String support added.
Added GUI mode [experimental] to BRS.

22.02.2015
Global variables added.
Faster access to variables in Zenith Engine.
Custom commands added.
Functions added.
Call function added.

23.02.2015
Added help command to BRS.
Added type output options.
Added return output options.

24.02.2015
Added conditional statements.
Added if statements.
Added else statements.

25.02.2015
Added add, subtract, multiply, and divide functions.
Added modulo function.
Added sin, cos, and tan functions.

26.02.2015
Added variable reassignment.
Improved performance of conditional statements.

27.02.2015
Added while loops.
Fixed an issue with if statements.
Added escape characters.

28.02.2015
Added sqrt function.

01.03.2015
Added the ability to overwrite Zenith Engine functions.
Added get_char_at function.
Added get_string_length function.
Added unix_runtime function.

02.03.2015
Added get_constant function.

03.03.2015
Added power function.
Added greater_than function.
Added less_than function.

04.03.2015
Added comments.
Added set type.
Added set_contains function.
Added set_add_elements function.
Added set_get_length function.
Added set_union function.
Added set_intersection function.
Added set_difference function.

05.03.2015
While loop improvements added.

06.03.2015
Improved the speed of the interpreter.
Fixed an issue with strings.

07.03.2015
Added a function line for running a single function.

08.03.2015
Improved substitution of variables.

10.03.2015
Added format_number.

18.03.2015
Constants are now signified with an asterisk *.
Fixed a flaw in the substitution that prevented a variable being substituted if it was the last in a parameter string.
Added increment and decrement.
Added mode, median, mean, max, min, and range.
The mode, median, max, min, and range also work on both sets and numbers.

-- Version 1.3.0 --

09.05.2015
Complete redesign of core and the introduction of the Zenith Parsing Engine.
Improved parsing speed.
Redesign improves ease of creating new functionalities.
New and improved while statements.
Functions can now be nested in calls such as add(add(1, 1), 2).
Variables can be assigned to function calls.
Interpreter speed improved.
Faster substitution.
Better unix_execute function speed.

10.05.2015
Improved speed of condition testing.
Assignment of functions.
Tree parser added.
Compile feature added.

11.05.2015
Logic (if and while) now supports nested functions.
Logic supports bracketed expressions within if and while statements.
Variables can now be assigned to each other: e.g. $j = $v.
Added parameter passing to functions.

12.05.2015
Fixed a flaw in subtract which lead to the first number being removed twice.
Fixed a flaw in which conditional statements failed if a variable name is used.
Re-added file_open function.
Added file_exists function.
Re-added random_number function.
It is no longer necessary to specify an output file in compilation. If there is no output specified it defaults to out.brs.
While loops can be ended by either end while or end loop.

13.05.2015
Variables can be assigned to logical evaluations, such as $v = (true || false). All expressions must be bracketed.
Comments can be included after code on the same line (all programs need recompiled).
Added multi line comments with the /* */ representation.
Added absolute_value function.

14.05.2015
Added string_contains.
Sets are now working as definitions and as parameters.
Fixed a flaw when compiling without an output file.
There is no longer the requirement of spaces between variable declarations and comparisons.
Added elseif statements to if statements.
Added recursion restriction on functions.
Program is more friendly to files not found.

-- Version 1.3.1 --

18.05.2015
Added get_type function.
Added set_intersection function.
Added set_union function.
Added list_add function.
Added list_remove function.
Added list_contains function.
Added set_from_list function.
Added list_get_index_at function.
Added list_get_length function.
Fixed a flaw in which empty sets cannot be defined.
Conditional statements now support comparison of sets.
Added get_minimum function.
Added get_maximum function.
Added get_range function.
Added get_mean function.
Added greater_than function.
Added less_than function.
Fixed a problem in which an empty string cannot be represented.
Added get_mode function.
Fixed a flaw in which a string would be added as a name to a function.
Another flaw fixed with return function.
Another flaw fixed on the return function to exit functions.
Fixed a problem in which numeric values were surrounded by quotes within sets.
Fixed an issue with the list_remove function which would only remove numbers equal to the position to remove from.
Added list_insert_at_index.
Language checks now check for accidental semicolons at the end of lines.

19.05.2015

Added for loops for($i = 1, $i < 10, 1).
Added char_to_int to convert a character to an integer.
Added int_to_char to convert an integer to a character.

20.05.2015

Added permission mode. Levels can be defined using arguments on the -i and -r modes.
Added is_file function.
Added is_directory function.
Added directory_exists function.
Fixed an issue where parameters would be read over local variables.
For can now be assigned to another variable e.g. for($i = $j, $i < 10, 1).
For now deletes variables after the for loop.

21.05.2015

Added do until loops.
Added the round function.
Added the factorial function.
Added -m multiple line interpreter mode.
Added get_median function.
Added list_sort function.
Added list_reverse function.
Added list_swap_elements function.
If statements and loops can have empty bodies.
Minor fixes that make it easier to develop small empty statements.
Added select-when statements.

-- Version 1.3.2 --

22.05.2015

Pass parameters from function line to program.
Added is_numeric function.
Added string_split function.
Added string_find_occurrences function.
Added string_get_substring function.
Added get_os_name function.
Added string_to_lowercase function.
Added string_to_uppercase function.

25.05.2015
Added a simple graphical user interface to the engine.

05.06.2015
Changed the output of errors to stderr rather than stdout.
Added the std_error function.
Fixed a flaw with when statements that caused strings to evaluate incorrectly.

-- Version 1.3.3 --

06.06.2015
Added internal local functions (functions defined within functions).
Due to minor changes, the constant character is no longer * but #.
Added string_ends_with function.
Added string_starts_with function.
Added string_matches function.

07.06.2015
Added associative arrays.
Added associative_array_get function.
Added associative_array_put function.
Added associative_array_contains function.
Fixed the problem occurring with adding arguments to programs.

10.06.2015
Added the import function to import compiled scripts.
Changed the way scripts compile.
Boolean expressions can now be assigned to variables without bracketing.
Logical expressions can now be passed to functions.

11.06.2015
Fixed an issue with boolean expressions given to functions.
Added the invert_value function.
Fixed a flaw in which negative numbers were some times discarded as not being integers.

-- Version 1.3.4 --

12.06.2015
Error messages are more useful with the compiler and interpreter.
ZPE automatically adds all scripts found in the "libs" folder.
Fixed an issue with constants not being recognised.

13.06.2015
Fixed the arguments system.

-- Version 1.3.4.90 --

15.06.2015
Added the list_update_at_index function.
Changed the greater_than function to the greater_than_all function.
Changed the less_than function to the less_than_all function.
Added the equals_any function.
Added the to_binary function.
Added the to_octal function.
Added the to_hexadecimal function.
Added pre-increment tools.
Added pre-decrement tools.
Added post-increment tools.
Added post-decrement tools.
Certain functions cannot be overridden. More at http://www.jamiebalfour.scot/projects/zpe/.

-- Version 1.3.5 --

15.06.2015
Modified the increment and decrement tools syntaxes.
Added the file_get_size function.
Fixed a flaw in which doubles could not be incremented.

19.06.2015
Fixed a flaw in which conditions and parameters would not work correctly with post increments and post decrements.
Improved constants. Constants can also be defined if they are not already defined, but they cannot be overwritten.

-- Version 1.3.5.32 --

20.06.2015
Added support for numbers with exponents, symbolised by an E.
Fixed a flaw in which post decrement and post increment did not function as expected.

28.06.2015
Added file_open_image function.
Added limit_real function.

-- Version 1.3.5.63 --

29.06.2015
Fixed a problem with heap space.
Added recursion support again.
Added image_transform_greyscale function.
Added image_transform_sepia function.
Added Real Math Mode mathematical evaluation.

30.06.2015
Negative numbers can be included in mathematical expressions.
Fixed a flaw in which substitution did not take place.
Fixed a flaw in which variables could not be assigned to an incrementing or decrementing value.
Changed the way increment and decrement work under the hood.
Added mathematical evaluation to conditional statements.
Fixed a minor flaw that affected condition checking.
Added run_command function to run commands on the fly.
Fixed an issue with permission levels.
Added bracketed mathematical expressions.
Fixed a flaw in the bracketed expression evaluation.

-- Version 1.3.5.68 --

30.06.2015
Added modulo calculations to mathematical expressions.
Fixed another flaw in the mathematical evaluation.
Added backtracking requirement for mathematical evaluation.
Removed backtracking requirement previously added.
Fixed several more flaws in mathematical evaluation.
Fixed an issue in which numbers with decimal places would cause a crash when incremented or decremented.

01.07.2015
Added support for constants into mathematical evaluation.
Fixed a flaw in which mathematical evaluation could only be done once.
Fixed an issue with subtraction.
Cleared up a lot of bugs in the RMM evaluator.

-- Version 1.3.5.90 --

02.07.2015
Fixed a bug with pre-increment and pre-decrement.
Added increment and decrement values to math evaluation.
Fixed an issue with subtraction in mathematical evaluation.
Added the -math mode for mathematical evaluation.
Added mathematical evaluation to associative arrays and lists.
Fixed a bug with the exit function in the -math mode.

07.07.2015
Added the conversion option. It currently only supports very basic conversion to Java.
Fixed an issue with mathematical evaluation.
Updated the start up information with the new -c mode as well as the -doc mode.

-- Version 1.3.5.190 --

08.07.2015
Added the unset function for removing variables after use.

09.07.2015
Added the file_save_image function for saving images.
Fixed an issue that prevented using global variables that used lists, associative arrays, structures, and so on.

-- Version 1.3.6.0 --

10.07.2015
Added structures.
Added structure variables.
Added structure functions.

11.07.2015
Added structure variable assignment.
Added structure variable access methods.
Removed increment function.
Removed decrement function.
Added pointer evaluation to parameters, conditions, and function calls.
Fixed a flaw in which parameters of more than length 1 would not function.
Fixed an issue with associative arrays.

12.07.2015
Fixed an issue with for loops in which assignment caused a crash if the assignment was evaluated.
Added the image_transform_resize function.

15.07.2015
Added the image_transform_invert_colour function.
Added the image_transform_rotate function.
Fixed an issue with the is_set command evaluating incorrectly.
Fixed an issue with structure.
Added the start function (identical to the main function).

-- Version 1.3.7.0 --

21.07.2015
Plugin system is functioning now, Java-based plugins can be written.
Removed the add function.
Removed the subtract function.
Removed the multiply function.
Removed the divide function.
Removed the modulo function.

22.07.2015
Added handle_of function to obtain a function handle from the function name.
Return no longer requires brackets around the value, this is optional.

-- Version 1.3.7.25 --

25.07.2015
Added library support.
Added support for semi-colons in for loops as well as commas.

26.07.2015
Fixed a flaw in which variables would be incorrectly updated.
Added the list_is_a_set function.
Added the associative_array_flip function.
Fixed an issue with substitution of variables and associative arrays.
Added the string_is_uppercase function.
Added the string_is_lowercase function.
Added the significant_figures function.
Added another minor fix to the unset and is_set functions.

27.07.2015
Added an optional parameter to the directory_list_files function to find only specific file types.
By specifying no directory, ie. "" to the directory_list_files function, it uses the current directory.

-- Version 1.3.7.44 --

04.08.2015
Added lambda functions that can be assigned to variables: e.g. $foo = function($bar){return $bar * $bar}.
Added pointer support to evaluation.
Added pointer support to function parameter evaluation.
Fixed a flaw that stopped increment and decrement working.

-- Version 1.3.7.89 --

05.08.2015
Made a few changes to the workings of lambda functions.
Lambda functions can be passed as parameters to functions and conditions.
Fixed a flaw with variable storage.
Variables can now be assigned to other variables which themselves are lambda functions.
Added lambda functions to for each loops.
Added lambda functions to for loops.

11.08.2015

Fixed a minor flaw with lambda calls.
Added the Function type to the get_type command.
Added the list_local_variables function.
Added the list_parameters function.
Added the list_global_variables function.

13.08.2015
Added the screen_grab function.

15.08.2015
Added the image_get_width function.
Added the image_get_height function.
Added the image_get_pixel function.
Added the image_set_pixel function.

18.08.2015
Added the all_true function.
Added the all_false function.
Added the any_true function.
Added the any_false function.

19.08.2015
Changed the type:$language requirement on the -c mode to $language.

20.08.2015
Added the global function to push a local variable to a global.
Added several new constants.
Added the mysql_connect function.

-- Version 1.3.7.100 --

27.08.2015
Fixed a flaw in which lambda functions would not function if they were the first parameter.
Fixed an issue with returning lambda functions.
All list and associative array functions now copy the original list or array before modification.
Fixed an issue with logical comparisons.
Added logical comparison evaluation to parameter checker.

-- Version 1.4.0 --

29.08.2015
Major restructure of internal core of interpreter for better hash functions.
Internal aliases are now fully implemented and much easier to execute.
Internal documentation is built-in to core functions.
Internal documentation is required on extension functions and libraries.
Minimum parameter requirement is now built-in to extension functions and libraries.
Minimum permission level requirement is now built-in to extension functions and libraries.

30.08.2015
Added the echo alias.
Re-added the round command.
Negation can now be applied through the ! function.

-- Version 1.4.0.83 --

12.09.2015
Added compare_dates function to compare two dates.

-- Version 1.4.1 --

21.10.2015
A few minor updates.

29.11.2015
Added the range function to generate a list of numbers in a range.
Memory usage lowered slightly.

04.12.2015
Added the counter function to generate an associative array of counts of items in a list.
Added the object function to generate a new Object.
Added the dotted expressions. $x.$y = 10 and print($x.$y).

06.12.2015
Out of order arguments can now be passed to the application. The only change is now that they require an argument name before.
The new clean arguments system works with application arguments better.
Functions can be made private or public.
ZPE programs are now compiled to ZEX (Zenith Engine Executable) files.

09.12.2015
Fixed a bug with the is_set command which would always return false.
Fixed a bug that stopped the return function working.
Anonymous functions have been improved.
Major improvement to lambda functions that makes them function better.
Fixed a bug with condition compilation.
Lambda functions now have scope to read global and parent variables.
Fixed a flaw that made the get_input function the same as the print function.

11.12.2015
Added publicly accessible isFunction and isObject methods to the JAR as requested.

14.12.2015
Images can now be compared using the equals sign, e.g. $img1 == $img2
Removed dotted expressions in favour of using the pointer. E.g. $x = object() $x => $y = 10
Added lambda functions to variables in structures.
Improved modularity of ZPE.
The file_create_directory function is now the directory_create function.

15.12.2015
Function chaining is now supported. E.g. range(0, 40).list_get_length().
Fixed a bug where the . would break strings.
Added the length function which will work on strings, lists, and associative arrays.
Added the get function which will work on strings, lists, and associative arrays.
Fixed an issue with conditions being evaluated incorrectly.
New -experimental mode.
Added a compiler_version number to compiled scripts.

-- Version 1.4.2 --

16.12.2015
Improved efficiency with structure variable assignment.
Scripts without any functions at all can be run as a single program.

20.12.2015
Added compiler type checking when using the typed system.
Added the string, integer, boolean, structure, lambda, object, and image types.
Types are always case insensitive.
Finally added the configuration file for setting options.

22.12.2015
The range function now can take numbers with decimal places in them, e.g. range (99.1, 1000.4).
Added an increment parameter to range function, e.g. range(99, 1000, 0.3).

14.05.2016
Added the new list_pop and list_dequeue functions.

28.05.2016
Added lazy evaluation to condition evaluation.

31.05.2016
Fixed a flaw with the random_number function that added the minimum as a string.

05.06.2016
Conditional words like and, or, and xor are compiled as their logical counterparts (&&, || and **).

07.06.2016
The echo command does not need brackets around parameters, but it will only take a single parameter. e.g. echo "Hello".
Fixed a flaw in which functions compiled under the case insensitive compile option would not function correctly.
Added the config option to the -h mode to display all the user's configurations (or properties).

16.06.2016
Fixed an issue that meant that true at the end of a statement would not be evaluated. E.g. '(10 < 15 && (15 > 15 || 20 > 20)) || true' would return false.

18.06.2016
Added set_cartesian_product function.

27.06.2016
Compiler improvements.
Updated manual command for get_type.
Updated website information to jamiebalfour.scot/projects/zpe/.
The put, length, and get commands are no longer experimental but fully implemented. They work as [43, 22].length() which will give 2.

01.07.2016
Added the ternary condition operation. E.g: $x = 10 > 20 || 20 > 10 ? "Yes" || "No" will set the value of $x to "Yes".

-- Version 1.4.3 --

13.07.2016
The biggest change in ZPE history has begun: rewriting the original condition and mathematical parsers and evaluators.

16.07.2016
The mathematical parser has been rewritten into the same parser as the logical one.
Resurrected the ternary (?) operator and operation on logic.
Added a compiler failure on the ternary operator on mathematical expressions.

17.07.2016
Added the improved evaluator for comparison. This works around 3 times as efficiently as the previous one on larger statements.
The new evaluator is flaky and not fully tested, so use this version with caution.
Major fix with chaining.

19.07.2016
XOR has been removed, but a function has been added in its stead.
Fixed an issue whereby the compiler seeing a comparator (==, > etc.) would force it to read only one symbol ahead.
Fixed an issue where comparison and mathematics mixed together, e.g. 5 > 2 + 1, would crash the interpreter.
Fixed an issue within LAMP where a bracket expression would return a number. E.g. (true == false) would return 0
Fixed an issue that prevented return functions from working properly.
Function chaining has been fixed.

20.07.2016
Fixed an issue in which bracket expressions were incorrectly tested.

21.07.2016
Fixed a few minor issues that caused compile issues.
Improved the LAMP compiler.

-- Version 1.4.3.10 --

22.07.2016
Improved the security of certain functions.
Reduced possibility of a memory leak in some functions.
Added the break function.

24.07.2016
Added scopes (private, public, and friendly) support to variables.
Added the scopes to constants as well.

25.07.2016
Improved the efficiency of the compiler.

27.07.2016
Merged structures and object types into one larger type.
Fixed issues with structures that prevented them from functioning.
Fixed an issue with boolean variables in a logical statement.
Minor fix with lambda functions within objects.

28.07.2016
Changed the way in which the interpreter functions (less recursion) - leading to better performance and memory usage.

29.07.2016
Fixed a small issue that caused lambda functions to crash.

30.07.2016
Fixed an issue in which lists and associative arrays would not be evaluated properly in a comparison.

01.08.2016
Fixed an issue with the ternary operator on single expressions.

-- Version 1.4.3.40 --

02.08.2016
Fixed an issue with lambda functions that prevented them from being evaluated when given parameters on declaration.
Modularised the for loop.
Added the sha1, sha256, and md5 hashing algorithms.

03.08.2016
Added the try and catch clause to catch errors.
Better error handling and few Java like errors.
Another fix with the ternary operator makes them function better.

04.08.2016
Better error messages from the compiler.

05.08.2016
Added the plus equals (+=) and the minus equals (-=) increment and decrement operators.
Added the concatenation operator, & and deprecated the string_concatenate command.

06.08.2016
Fixed an issue with variables and increment and decrement values.
Fixed an issue with anonymous functions and return functions without brackets.

-- Version 1.4.4.0 --

07.08.2016
Focuses on external implementation of language converters.

12.08.2016
Expressions can now be negated by simply putting the ! in front of them without bracketing it. E.g. !false.
Added the list_get_at_random_index and the generate_alphabet methods.

14.08.2016
Fixed an issue with the += and -= increment and decrement values that only allowed numbers to be used.
Fixed an issue with the += and -= increment and decrement values that meant that values were rounded to integers not left as reals.

-- Version 1.5.0 --

08.12.2016
Fixed an issue with the LAMP compiler.
Fixed an issue with the LAMP interpreter.
Fixed an issue with the ternary operator, that stopped it functioning on the false value.

10.12.2016
Added the Google GSON library to parse JSON.
Added json_to_map function.

11.12.2016
Added interpreter warnings.

17.12.2016
LAMP parser memory consumption improved considerably.
Fixed an issue with lambda functions not evaluating correctly in LAMP expressions.
Added the 'this' keyword for pointers. E.g. $x => $y = function(){ print (this => $z) }.

21.12.2016
Fixed an issue in which the ceiling command would round down.
Added the aes_encrypt and aes_decrypt functions.

07.01.2017
Improved server and client communication and functionality.

-- Version 1.5.0.1 --

08.01.2017
Further improved server and client communication, now allowing the server to execute a script on the input.
Added the string_cut function that cuts a string from start to finish.
Added the string_divide function to split a string multiple times.

10.01.2017
Added threaded lambda functions. $v = threaded function() { for ($i = 0; $i < 100000; $i++) print($i) end for }.

11.01.2017
Fixed an issue in which lambda calls were not called in a LAMP expression.
Fixed an issue in which the global #SCRIPT constant is not defined a associative array properly.

-- Version 1.5.1 --

14.01.2017
Added the includes statement. This will include non-compiled code before compilation. E.g. include "file.txt". This code will execute as though it were in the main program.

16.01.2017
Added the publicly available PublicMethods class and the built in ExternalMethods variable to access it which allows access to a bunch of useful functions to access internals of ZPE.
Changed the plugin interface slightly, it now sends a 'parent' ZenithEngine object to the MainMethod of an interface.
Improved performance and fixed a flaw in which plugins could not be executed.
Added the for-to loop e.g. for($i = 0 to 10). Works the same way underneath.

21.01.2017
Added compiler improvements that make compiled applications run faster.
The name parameter in the compiler is now fully optional.

22.01.2017
A huge number of changes designed to make it easier to use ZPE within the Java language by organising ZPE into packages jamiebalfour.ZPE.

31.01.2017
Fixed an issue with concatenation.
Added do while loops.

-- Version 1.5.2 --

07.02.2017
Added custom keyword plugin feature. This allows custom parsing of symbols and words.

13.02.2017
Added the serialise and deserialise functions to object $v = object() $v => $x = 10 $v.serialise("Test").
Improved the serialise and deserialise functions to now support functions, objects within objects, lists, and associative arrays.

14.02.2017
Structures can now be initialised through a constructor function called _construct.
Fixed an issue where objects within objects could not be used.

-- Version 1.5.3 --

14.02.2017
Added the get_object_definition function, designed to identify which structure this object inherits it's format from.
Added the wait method which waits a specified number of milliseconds.

15.02.2017
Improved server stability.
Pointers have been renamed accessors. The accessor symbol is still =>.

21.02.2017
Added a new feature that allows function declaration within objects. $x => f = function() print("Test") end function.
Added the _output core method to objects. Any object declaring an _output method will call this when cast to a string.

22.02.2017
Fixed an issue in which foo = function() { print("bar") } would be a valid function.
Objects are better inlined with structures, the 'object()' function is removed and replaced with the 'new object()' syntax.
Chainable functions can be used on accessors such as $people => $list.get(1). This is a minor fix.

23.02.2017
Fixed an issue within the compiler, whereby all inner compiled strings would be case insensitive.

24.02.2017
Fixed a couple of minor issues in regards to scope.
Completely redesigned the parser, making it separate to the main compiler.
Introduced the new ZenithParser, the underlying parser that powers the whole ZPE.
Added JBSON, my own JSON parser.
Fixed an issue that has been around for a long time with string quotes not being removed by moving this to the parser.

26.02.2017
Continuing with the idea of a reusable parser, the CSV parser has been redesigned from the bottom up.

21.03.2017
Associative arrays no longer use braces {} but [] similarly to lists.
To access an internal method of an object the -> is used instead of => (=> is used for associative arrays only).

26.03.2017
Added the option to ignore new lines in the ZPE Parser.
Fixed a flaw that prevented objects from being parsed properly.

28.03.2017
Added the index of an array through square brackets $v[1] for access only.
Minor performance improvements and further refactoring.

29.03.2017
Added ZPE to a Git repository for better backtracking.

30.03.2017
Added the new index assignment through $v[2] = "Hello".
Added index support for associative arrays.
Added index setting support for associative arrays $v["Tom"] = "Allan".
Improved the way the compiler works, improving performance.
Improved the shell command to now return the return value of the command.
Added the sprintf function to format a string fairly quickly.

-- Version 1.5.4 --

31.03.2017
Added the new object declaration format similar to JSON or JavaScript: $v = {first_name : "Jamie", surname : "Balfour"}.

01.04.2017
Improved the parser to support any third-party subsequent character array.

02.04.2017
Redesign of the way objects are accessed that makes them a little unstable.
Fixed the issue with accessors and objects, making them stable again.

05.04.2017
Added a fix to concatenation that will need to reviewed ASAP.

06.04.2017
Fixed a performance issue.
Fixed an issue when using accessors on keyword 'this'.

07.04.2017
Compiler keeps track of constants that have been assigned and throws an error on reassignment.

18.05.2017
Fixed an issue with ZACs.

19.06.2017
Server threads now share Zenith Engine consumers where they can.

04.10.2017
Added the switch statement, a rewrite of when-is statements.

-- Version 1.6.0 --

01.02.2018
Added the --colour option.

28.02.2018
Added the force_colour option.

30.05.2018
Added the new -w web parser mode to parse web pages.

31.05.2018
Fixed an issue in which the get_median function was actually using the same code as the get_range function.

-- Version 1.6.1 --

24.07.2018
Renamed Zenith Parsing Engine to ZPE Programming Environment.
Fixed an issue in which the parse_json function would only return an associative array, never a list.
Fixed an issue when comparing integers, double, and strings that looked similar e.g. 1 == "1" would be true.
Fixed a LAMP issue in which less than was improperly parsed, causing a memory leak and eventually a stack overflow.

-- Version 1.6.2 --

30.07.2018
Major fix to indexing of variables e.g. $v[0] = 10 now works perfectly.
Added a padding of nulls when an item is inserted at an index that doesn't exist.
Major improvements to the is_set method.
Fixed concatenation (small bug causing a huge problem).
The shell command now adds line breaks at the end of each line.
Fixed an issue in which adding an escape \ before a quote would be ignored.

-- Version 1.6.3 --

01.08.2018
Major update and complete rewrite of the way objects and structures work, making them faster and more efficient than before.
Accessibility within public, private, and friendly objects is now checked at runtime.
Objects can now have functions that set internal values.
Improved the way that a break call bubbles.
02.08.2018
Added the variable index to ACCESSOR e.g.
  $a->$b[0] = 10
Better compatibility with libraries.
Probably released a fix for issues #4 and #7
03.08.2018
Functions can now be indexed using [] e.g. getNames()[0].
Functions within objects can now also be accessed with the index notation e.g. $person->getNames()[0].
When a function is incorrectly called it no longer returns !error as a string but an actual Error object.
Negation is now compiled differently and the not function has been removed.
Improved the way in which chained (.) functions work. E.g. $v = [44, 55] $x = $v.get(0).

-- Version 1.6.4 --

05.08.2018
It's been a long time coming, but 64 bit integers (longs) are now used instead of 32 bit.
Fixed the problem occurring with constant definition.
Constants are now defined using the define keyword (lowercase).
ZPEObjects now expose an addNativeMethod method that allows executable Java code to be used in an object.
Native methods can now be run as Java based programs within objects.
When an ZPEObject is printed, it no longer exposes the values of the object (for safety and security reasons).
Fixed downloading in ZULE.

06.08.2018
Both the server side and the client side of ZULE have been improved.
Infinite indexes for variables are now possible.
New undefined() function returns an undefined value.

07.08.2018
remove_at has now been added to strings as a chainable function.
Added a fix that allows objects to contain non-prefixed variables, e.g.
  $v = {"name" : "Jamie"} print($v->name) would work.

09.08.2018
Fixed single bracketed expression problem e.g. return (5 + 5) would not work.
Fixed an issue with concatenation.
Fixed an issue with FOR EACH loops with object and the this keyword.

11.08.2018
Fixed an issue where associative arrays would not print with a comma.

13.08.2018
Big change to the way that images are used in ZPE as they are no longer a native type but are now stored in an object.
The image() method now returns an image_object object - a simple object with multiple native methods on it.
Several built in image methods have been removed in favour of the image_object.
The single apostrophe quote is now parsed properly.
Fixed performance of parser.
Improved the ZenithParser's method of finding multiline comments.
Small performance improvements in compilation.

-- Version 1.6.5 --

27.08.2018
Syntax change for pre-increment and pre-decrement from $++x to ++$x.

02.09.2018
Added the FOR EACH IN loop to complement the FOR EACH AS loop (it works the reverse to this).
Fixed an issue in the CSV parser where single line CSV files parsed incorrectly.
Fixed an issue in the feedback command that prevented it from sending when given just one argument.

-- Version 1.6.6 --

03.09.2018
Fixed an issue with for loops.
Added the circumflex syntax for power e.g.
  5^2 is 25 (five squared) and 5^3 is 125
Added the variable mode to the -r ZAC. This mode is like single line mode except that variables and their values are persisted.
Removed the Program read mode and the Multi line read mode.
Fixed with comments in the Zenith Parser.
Fixed an issue in for loop with reading lists.
Fixed an issue that caused negative numbers to convert to strings when parsed.
Added binary parsing into the compiler e.g. $v = 0b0101. Binary values always start with a 0b.
Added the to_decimal method to convert a string of binary, octal, or hexadecimal characters to an integer.
Command line arguments are now separated from program arguments using a -args command line.

08.09.2018
Added object inheritance.

09.09.2018
New if statement optional syntax using the THEN keyword: $x = 10 if $x == 11 then print("Yes") end if.
Added the built-in object methods `inherit`, `serialise` and `get_definition`. Removed the general serialise and object_get_definition methods.

10.09.2018
Fixed an issue where in the single line interpreter variable values were not actually retained properly.
The single line interpreter no longer exits on an error but displays an error and continues.

11.09.2018
Fixed an issue in which new ZPEObject would set their values and variables to the FRIENDLY only access.

14.09.2018
Added the optional 'code' parameter to the exit method.
Small performance improvement with the LAMP parser.

15.09.2018
Added the cache_value and read_cache_value methods which read a value from a special secured file.

16.09.2018
Added the get_version method which obtains the version number of the ZPE instance it is running within.
Added an option to disable methods from the runtime environment (using the properties file).

19.09.2018
Added negation of variables such as -$v and improved the method of negative values being used.
Improved the way in which negative values are evaluated.

-- Version 1.6.7 --

19.09.2018
Added the new alternative lambda function syntax that uses the fat arrow syntax: $v = () => print("Hello") end function and $v = () { print("Hello") }.
Added the new alternative syntax to the for each loop similar to 'for each ($v) print ($pos++) end for'.

24.09.2018
TYPO is now available within ZPE 1.6.7! Finally, type checking can be done with ZPE!.

25.09.2018
Fixed an issue with dotted (reference) expressions.
Added the sublist method to the list type.

26.09.2018
Added the new --typed argument that forces type checking in assignment.
Further engine cleanup means that built in methods are now completely separate from the compiler and interpreter.

01.10.2018
The print method no longer runs variables containing functions but simply leaves them as a reference.
Minor performance improvements through a hopeful trial.

11.10.2018
New Python inspired fixed arrays defined as.
  $v = [] * 4 or $v = ["Hello"] * 4

12.10.2018
Added support for else if as well as elseif in if statements.

15.10.2018
Added the get_call_stack method.

19.10.2018
Added the input alias for std_in.
Assignment within statements is now possible, e.g. if(($v = 10) == 10) print($v) end if.

-- Version 1.6.8 --

21.10.2018
The GUI mode now handles errors and does not quit on an error.

22.10.2018
Command line now accepts negative values correctly.
Added the associative_array_create_ordered method which generates a new ordered associative array.


25.12.2018
Further to the expansion of everything is a function in YASS, the ZPE global function is now the main place for functions.
Internal functions (nested functions) have been improved and now perform better.
New feature to -r ZAC, functions are now retained after being defined.

-- Version 1.6.8.1 --

28.12.2018
Added the built-in internal update program. Just running the --update ZAC will update ZPE.

-- Version 1.7.0 --

29.12.2018
Fixed a long standing issue with concatenation.
Fixed an issue which would result in the string_get_length function returning a string value.
Fixed an issue which would cause ZPELists to recursively call their own remove function.
Fixed an issue that caused quotes to be added to strings after being inserted using the older list_add_element method.

30.12.2018
Fixed an issue with index access within an object context when assigning values (major bug).

05.01.2019
Added assertion tools for unit testing. Assertion can be true or false.
Fixed a ZenithParser flaw that meant that when lexing whitespace no check was made for comments after.

09.01.2019
Added by reference variables, list_set_at_index already implements this.

-- Version 1.7.1 --

10.01.2019
A huge overhaul to the design and performance of ZPE both in the interpreter and the compiler.
Compiler and runtime have now been separated, which allows the compiler to run more efficiently.

11.01.2019
Added support for by reference variable assignment, e.g. &$y = 10 will change the original $y.

13.01.2019
Threaded functions are now written as function threaded x() instead of threaded function x(). The latter has not been removed but deprecated.

15.01.2019
Major improvement to ZenithParser which makes it perform 10% faster than before.


16.01.2019
Added the ZPEWebServer that can act as a basic web server and can serve ZPE-HTML pages (zhtml).
ZenithParser now features custom whitespace tokens.
Improved performance.

18.01.2019
Added the index.zhtml handler to the ZPEWebServer so that if no file is specified but an index file exist it will read this.
Further improvements to whitespace within the ZenithParser.
Better memory usage within the runtime interpreter.

26.01.2019
Bug fix for object index access in comparison e.g. if($x->$v[0] > 9) print("Yes") end if would not work if $x = {$v : [34, 35]}.

27.01.2019
Added the bound word exception to the ZenithEngine. E.g. $ must be bound to a name, so the parser will not accept when it is written as $ x = 10 but will accept $x = 10

30.01.2019
Replaced the LAMP with LAME, a much faster and more accurate evaluator for logic and maths.

-- Version 1.7.2 --

02.02.2019
Compiler constants are now moved to the compiler away from the interpreter. This offers better performance.
Compiler constants can now only be one single value and cannot be expressions.

03.02.2019
Compiler constants remain in play in the interactive interpreter between lines.
Fixed a flaw which prevented concatenation of doubles or integers (LAME only).
Fixed a flaw which prevented access to variables defined using strong typing.

12.02.2019
If the JAR is opened by double clicking rather than command line, the GFX editor will show.
Updated the GFX editor which will soon replace the GUI editor.

13.02.2019
The normal Swing based editor has been removed and the GFX editor has taken its place. It is now accessed with the -g ZAC.
Added the list_to_associative_array function.

14.02.2019
Fixed an issue which prevented the _construct method from being created on an object.

-- Version 1.7.3 --

14.02.2019
Added the get_password_input function.

25.02.2019
Further improvements to LAME performance.

27.02.2019
New data types ZPEOrderedAssociativeArray and ZPEArray which replace the older is_ordered and is_fixed_size methods on their super classes.
Added the input_validate function.
Added the list_populate function.

01.03.2019
Fixed a bug in concatenation that prevented the concatenation of integer values.
The to_json function is now the json_encode function.
The parse_csv, parse_json, and parse_xml functions have been renamed csv_decode, json_decode, and xml_decode respectively.
Minor performance tweaks that help stabilise LAME.
Added the csv_encode function.
list_add_element no longer functions on arrays only on lists.
list_remove now works differently on arrays. It will now set the value in the array to a Null value.

03.03.2019
Changed the way binary, hex, and octal values are inserted.
Binary has a signed bit so 0b111 would be 7 and 1b111 would be -7
Octal now uses the format of 0o17 where the o is the feature that lets us know it is an octal value.
Octal has a signed bit so 0o17 is 15 and 1o17 is -15
Hexadecimal numbers now have a signed bit so 0xa is 10 and 1xa is -10

05.03.2019
Structures are no longer just the same as objects and are now restricted to their original definition.
Major fix that fixes ZPE private access.

06.03.2019
Added more @ documentation features.

08.03.2019
Fixed an issue with index access in an evaluation.

-- Version 1.7.4 --

10.03.2019

Added short circuit evaluation of logic.
Logic parser completely rewritten which allows complex conditions to be evaluated quicker.

11.03.2019
Fixed an issue with the is_set function not correctly accessing indexes.
Index safety is no longer built-in to the language by default but enabled using the properties file.
Removed an old hack that fixed an issue but actually broke the compiler later.
Fixed an issue within lambda functions due to a hack that was put in.

12.03.2019
Added type checking option to the GUI.
Added the web server option to the GUI.
Fixed an issue in which objects were not correctly evaluated by the get_type function.

13.03.2019
Complete rewrite of both structures and objects to make them more consistent.
Nested structures/classes are now available.

17.03.2019
Added the implies and iff functions.
Added the nor function.

22.03.2019
Added the http_post method, allowing requests to be made to any URL.
Added the new ZPE Online (codenamed Munro Top) registration and cloud storage of ZPE programs.

23.03.2019
Added more online features.

-- Version 1.7.5 --

24.03.2019
GUI now remembers the last state it was in.
Fixed an issue with the date conversion in which the month and minute were muddle up.
A new feature now means that built-in language objects are now available. E.g. the ZPEUI object can now be accessed with new ZPEUI().
Certain object generation methods: generate_image, generate_ui, file_open_sequentially, and get_time have now been removed in favour of pure objects.

25.03.2019
Native methods can now be constructors in objects.
The new file option in the GUI now creates a simple program with a main function.
Several constants have been removed in favour of a new global variable called $_SYSTEM, similar to PHP's superglobal $_SERVER.

08.04.2019
Moved the output from the compiler from the internal method.
General performance improvements.

-- Version 1.7.6 --

09.04.2019
Added the new console window for output for the GUI mode.
GUI console has a much cleaner look.

13.04.2019
Fixed an issue in which the floor and ceiling functions returned a double instead of an integer.

15.04.2019
Added support for larger numbers.

19.04.2019
Added the list_process function.
Added the array_to_list function.
Added the list_to_array function.
Added the list_auto_populate function.

20.04.2019
Added the for each...break when...is loop.
Changed the file_open function to use the ZPESequentialFile object.
Added a file_get_contents function.

21.04.2019
Fixed an issue that prevented functions being declared without a main function.
Added the password_hash function.
Added password_verify function.
Added password encryption to compiled files.

-- Version 1.7.7 --

01.05.2019
Added the EXACTLY EQUAL === comparison.
Added the --json option to the -v (version) ZAC.

04.05.2019
Added the boolean comparison that 0 == false is true.
Fixed an issue that meant that short circuit evaluation only happened if it was true.

05.05.2019
The display of objects when printed is now much more like PHP.

-- Version 1.7.8 --

10.05.2019
Fixed an issue with functions declared on anonymous objects being inaccessible.

12.05.2019
Added the list_find_duplicates function.

17.05.2019
New compiler optimisations mean that compiled programs run even faster.

06.06.2019
Variables are now shared across chunks in the web parser mode.

16.06.2019
Added the self keyword which has the same functionality as the this keyword.
The returnInteger function on the LAME parser has been removed. This means that an integer value such as 10 will now be displayed as it's decimal equivalent of 10.0

29.06.2019
Added the ZPEHTMLBuilder object.

-- Version 1.7.9 --

02.07.2019
The ZPEHTMLBuilder object internal function list_to_html_list now works recursively on lists.
Native methods are now declared with a public scope in objects.

08.07.2019
Added the string_text_compare function.
Renamed the cache_value command to write_cache_value.
Added the count keyword. E.g. count ($v). This is not a function and takes advantage of compiler speed.

09.07.2019
A change to the web parser - pages now end with ywp instead of zhtml.
The opening tag for web pages is now <?ywp and ywp?>.

10.07.2019
Fixed an issue where some whitespace characters were ignored by the parser (e.g. ASCII 160).

13.07.2019
Performance improvements.

14.07.2019
Fixed an issue with public declared values in a structure.
Removed the threaded function.
Added the run_in_thread function, this can also run lambda functions in a thread.
Fixed an issue within objects that prevented inner functions being given the correct parent object.
Added for loop compiler optimisations.

-- Version 1.7.10 --

28.07.2019
Fixed an issue with quotes in quotes when escaping them.

30.07.2019
Added type checking on array data types.
Added the array_get_data_type function, which will return the data type of all elements within the array.

31.07.2019
Replaced the menubar in macOS with the system menu bar for consistency.

01.08.2019
Added the tkmenu library to give macOS editors the macOS menu bar instead of the in window version.

02.08.2019
ZPE now set the DOCUMENT_ROOT property to a public_html folder in the users home directory by default.
Added a button to stop a running web server in the GUI.

-- Version 1.7.11 --

07.08.2019
The is_set method now works on object properties, including object properties containing objects.
Added the write function.

25.08.2019
If the import function does not find the file initially, it will search the library path for the file next.
The password_hash function now throws a warning if the number of rounds is > 30 and resets it to 30

30.08.2019
Added the ZenithParser object.

02.09.2019
More changes to the GUI including a new dark mode (only on macOS currently).

13.09.2019
Added the alternative value syntax, e.g.
  $x = null $v = $x ?? "James" will evaluate to "James".
Potential fix for Bug #9 - global traverse now marks traversed FASTs as complete.

28.09.2019
Fixed a long standing bug that caused objects to not update when a reference was updated when no main function was provided.

29.09.2019
For loops with the syntax x = n to y can now use variable references as the y value.
The same for loops now loop from x to y non-inclusive of y.

-- Version 1.7.12 --

26.10.2019
The if...then statement is now a single expression based if statement.
The if...then statement can also have a single expression based else statement.
Improved performance of When-Is statement by using a hash map to store values.

10.11.2019
Fixed an issue in which quotes were removed from a string if used inside another string.

02.12.2019
Library imports are no longer done by the interpreter on startup but are now done with import command, thus taking away some of the startup time.
Minor performance updates.

05.12.2019
Importing is now done with the import keyword and is no longer a function.

-- Version 1.7.13 --

07.12.2019
Minor performance improvements.
Fix made to the way plug ins work.
MySQL connector plug in now available.

22.12.2019
Added create_list to the ZPEUI object.

30.12.2019
Added the wake_on_lan function.

-- Version 1.8.1 --

01.01.2020
Changes to the way in which the ZPEClient and ZPEServer work, making them much more stable.
ZPEClient is now the ZENClient and ZPEServer is now the ZENServer.
ZENClient and ZENServer no longer feature message mode.
ZPEWebParser has been renamed ZENWebParser.
Tidied up internal packages so ZEN related files are now in the zen package.

03.01.2020
Major improvements to way the ZENClient and ZENServer communicate.
Public and private key encryption is now used to encrypt all information between server and client unless no password is given.

04.01.2020
Added a new option to the shutdown command that allows a time to be specified from the current time to shutdown at.

05.01.2020
Made a major fix to the way bigger (long or double) numbers are handled.
Added the time function which gets the current number of milliseconds since 1st January 1970 (epoch time).
Added the run_at command, which runs a background daemon thread until a certain time arrives and executes that function using it's handle.

06.01.2020
Certain functionalities have been moved to primary native libraries that will offer to be installed on first run.
Fix made to ZULE repository that make it perform better.
Moved the generate_alphabet function to String functions.
Moved the send_zpe_server_request to Networking functions.
ZULE has been moved to a separate static class.

-- Version 1.8.2 --

06.01.2020
Added the list_object_properties function which lists all properties of a given object.
Added the get_object_property function which will get a value from an object property.
Added the is_function function.
Reduced the delay on the interactive interpreter.

11.01.2020
Added the list_zpe_functions function which will create an ordered associative array of functions.
Added the list_structures function which will create an array of structures.
Changed the way in which the JSON parser deals with ordered associative arrays, ensuring order is maintained.
Fixed an issue in which functions were not evaluated in concatenation.

12.01.2020
The -r and -i modes have been switched. -i is now the interactive interpreter and -r is the runtime.

24.01.2020
Added the -j option to the main ZPE package for JSON commands (more information coming soon).
ZPEExceptions are now accessible as ZPEObjects and can be returned from a function.

10.02.2020
Major fix for an issue that caused object functions to not see the same call stack as their object owners.
Added the list_shuffle function.

15.02.2020
Added the speak function, however, this function is currently experimental and works only on a Mac.

-- Version 1.8.3 --

08.03.2020
Fixed an issue that meant that ZPEObject values would sometimes not save correctly when cached.

18.03.2020
Added the list_count_occurrences function.
Added the list_count_if function.

22.03.2020
Added support for null values in the JSON parser.

24.03.2020
Added the inline documents syntax.

25.03.2020
Fixed an issue in which imported libraries were not accessible in all cases.
Added the say alias for the speak function.

-- Version 1.8.4 --

29.03.2020
Improved the in-line document syntax by supporting variables.

02.04.2020
Changed the domain for the installer to jamiebalfour.scot.

26.04.2020
Fixed an issue in which the list_parameters function required at least one parameter.
Improved the way objects, associative arrays, lists etc are iterated and made it more flexible.

-- Version 1.8.5 --

27.04.2020
ZENServer now searches for updates automatically when set in the properties file to do so.

28.04.2020
Fixed an issue in which object comparison through the _compare method didn't work.

10.05.2020
The --client argument is no longer required to specify a ZENClient, as the -h argument informs the application of this.

11.05.2020
Added the file_get_bytes function.
Removed the type parameter from the file_get_contents function, making it only read text.

20.05.2020
Added the play_audio function which plays an audio stream.

23.05.2020
Changed the play_audio function to open_audio_stream which returns a ZPEAudioStream object.

-- Version 1.8.6 --

26.05.2020
Added the extends keyword as an alternative to inherits for inheritance of classes or structures.
Added the option to create a constructor with the name of the class, like C or Java, e.g class Animal { function Animal() { } }.

02.06.2020
Added index ranges e.g. $x[1:3] similar to Python.
Added in negative index support, e.g. $x[-1] which will work in reverse, again similar to Python.

04.06.2020
Added the list_drives function which lists all root drives.

06.06.2020
ZENServer is now interactive, meaning declared functions and variables are stored.
ZENServer is now threaded - I hadn't even noticed this wasn't done! :O.

07.06.2020
Added support for the Velocity Web Server through the Velocity Module.
Added the update_zpe function which attempts to run the ZPE updater.

08.06.2020
Added the the set_header function which will set a web header.
Added the set_http_status function which will set the HTTP response code header.

09.06.2020
Deprecated the ZENWebServer.
Added the get_ip_address function which will return the current system's IP address.

10.06.2020
Added the create_temporary_file function which can be used to create a temporary file.
Added the file_put_bytes function to write bytes to a file.

-- Version 1.8.7 --

16.06.2020
Added the list_plugins function which returns all active plugin functions.
Added the get_function_information function which returns information from the function manual (see --man for more information).

17.06.2020
list_pop and list_dequeue had the wrong implementation and manual entry: pop would remove from the start of a list and dequeue from the end, this has been fixed.
Fixed an issue with the --man command and mixed types being displayed as an object.

19.06.2020
Added the ZPECalculator object, which contains an expression compiler used to evaluate an expression.

21.06.2020
All ZPEObjects included such as the ZPEImage are no longer prefixed with ZPE, so the ZPEImage is now the Image and can be declared as $x = new Image().
The ZPEUI object is now the UIBuilder object.

22.06.2020
Introduction of ZPEKit (pronounced zippy kit) means that the YASSCompiler is not accessible publicly but can be accessed through ZPEKit.

06.07.2020
Improved the way in which replacements are done in the graphical editor.

10.07.2020
Improved the to_binary function which can now accept a string of characters which will be converted to their binary equivalent.
Added the list_combine function which can combine a list into a string very quickly.

-- Version 1.8.8 --

15.07.2020
Programs compiled with a passcode are now encrypted.
Fixed a few bugs that seemed to occur within the GUI mode.

18.07.2020
Numbers with a negative exponent e.g. 5E-5 can now be represented - this is a long standing bug within the Zenith Parsing Engine parser. I can't believe it's been here this long  :L.

19.07.2020
Added in a simple send> command to the ZENClient that allows the sending of files via the client to the ZENServer.

20.07.2020
Fixed an issue and improved performance of the new send> command within the ZENClient and ZENServer.

22.07.2020
Fixed an issue in ZPE 1.8.7 that meant that it could not be executed with JavaFX and therefore some openJDK versions did not execute it at all.

-- Version 1.8.9 --

24.07.2020
Fixed the issue with http_post and ZPE Online and made POST requests function correctly again.
Added the command documentation feature to the GUI editor.

27.07.2020
Added the require keyword as an alternative for import.

01.08.2020
Separated the compilation of parameters and arguments in the compile_parameters compiler function to compile_parameters and compile_arguments so $y = function($m, [50]) { $m = $m + 5 } is no longer valid.
Default values can now be assigned to parameters. E.g. function foo($arg1, $arg2 = 10, $arg3 = "Jack").
Providing too many arguments to a function no longer stop the program with a -2 error but simply throws a ZPE WARNING.
Added the list_compress function which compresses a list, for example: list_compress([11, 22, 33, 44, 55, 66, 77], 3) returns [11, 22, 33].
New Recent Cloud Files option in GUI.

02.08.2020
The GUI ZPE Online now connects via HTTPS.
Properties are now uppercase.
Since my unfortunate shift from macOS to Windows for the time being, I focused the development on adding an icon to the editor. It now has the new ZPE logo.
Fixed the broken tray icon in GUI.
Added the ability to run a ZENServer from the GUI.
Removed the option to show server messages in a GUI mode from ZENServer (it may come back but better designed).
The new ZPE folder is ~/.zpe instead of ~/.zpe_tools.
Added the ONLINE_PATH and ZULE_PATH properties to the properties file.
Created a new .exe file for Windows.

05.08.2020
Better console colouring thanks to JANSI library.
File encryption when sending data to an passworded server is now standard.
Added the ls command to the ZENClient (e.g. ls or ls Documents).
Cleaned up the directory_list_files function when working with the empty string (the current working directory will be listed).
Added the rls shorthand to the ZENClient which will run `return beautify(directory_list_files(""))`. Much like ls, this can accept a parameter filename.
Added the get command to obtain a file from the server (it's the direct reverse of the send command).

-- Version 1.8.10 --

06.08.2020
Added the file_encrypt and file_decrypt functions.
Fixed an issue in which compiled applications given a -level argument could not be given arguments.
Added the file_get_path function which will obtain the absolute path of a file or directory.
Added the file_get_parent_path function will obtain the absolute path of the parent directory of a file or directory.

07.08.2020
Added several SSH-like commands ls, cd, pwd, and cat to the ZENServer and ZENClient.
ZENServer has its own root path.
The ZENServer rls command is now ls and the local version is lls.
Added real Unix style file paths using my own version of the .. in a path to the ZENServer.

08.08.2020
Added the mkdir and rm commands to ZENServer and ZENClient.
Added the supports feature to the server.
The list of server commands now comes from the server to the client so that the client can have an up to date list of server commands supported.
Changed the logo in the command line.
The -d debug mode has been changed to the -m mode and improved. Now it acts like a watch command and informs of any changes to a variable within a function, including private functions.

09.08.2020
Added the --install ZAC which will now replace the -h install and the --configure command.
get> and put> become get and put in client.
Fixed a few issues with the installer package to make it work more in a more seamless way.

11.08.2020
The -p mode now supports inserting a property value from the command line by leaving out the -v argument.

28.08.2020
Added the list_zpe_aliases function.

02.09.2020
Added support for ZPEObjects to the JSON parser.

04.09.2020
Added native sandboxing to the engine providing further sandbox support linked to the permission level system.
Added the USE_FILE_SANDBOX property to the properties file.

-- Version 1.8.11 --

26.09.2020
Compiler issues are now handled better.
Fixed an issue that threw infinite errors in the -a mode when there was a compile issue.

01.10.2020
Added infinite parameters to functions.

14.10.2020
ZPE now detects headless systems before launching the GUI.

21.10.2020
Better management of reference functions and objects.
General tidy up of the native method objects.
Better integration of Objects and Structures.
Fixed an issue where an empty file list in compilation would cause an error and crash the compiler.
Removed the old serialise and serialize, save_object_to_file aliases from the predefined function list (they should have been removed previously).
Removed the open_object_from_file alias for the deserialise function.

-- Version 1.8.12 --

28.10.2020
Added the create_variable command to create local variables on the fly.
Added the -flush command to interactive interpreter to clear all global variables.
Added the say command to ZENServer/ZENClient.

29.10.2020
Stricter variable name checking.

30.10.2020
The interactive interpreter no longer adds variables back into the global function but instead the main function.

07.11.2020
Added the ZPEString data type replacing the standard string.
String values can now be passed by reference.
String values are now chainable/reference types.

-- Version 1.8.13 --

13.11.2020
Fixed an issue with the ZPEString used as a key in an associative array.
Fixed an issue with assertion and comparing strings.

04.12.2020
Added the ZENClient object that allows the client to run in pure YASS code.

-- Version 1.9.1 --

31.12.2020

Fixed empty lists in the ZenithJSONParser.
Replaced a few references to the ZENJSONParser with ZenithJSONParser.
Added support for empty associative arrays to JSON parser.

16.01.2021
Fixed an issue that caused parameters to always be set even if they weren't.
Fixed a bug that caused undefined == undefined not to always work.

23.01.2021
Fixed an issue that meant that negative binary numbers (using two's compliment) padded with 0s and were excessively long.

09.02.2021
Added the match statement, similar to the case statement.
Added the else option in the match statement.

-- Version 1.9.2 --

16.02.2021
Created a ZPE settings file type.
ZPE now stores local settings such as a unique ID in a settings file.
Added the get_unique_id predefined function.

17.02.2021
Added the generate_random_string predefined function.

23.03.2021
Added the *=, /= and ^= operators.
Updated the increment/decrement operators to use long values rather than integer.

-- Version 1.9.3 --

04.04.2021
Minor performance improvements.

08.04.2021

Added the new optional let keyword, e.g. let $x = 10

11.04.2021

Added in a new syntax for declaring variables without a dollar in front i.e. let x = 10
Added support for new variables with lambda functions, e.g. let x = function(y) print(y) end function x("Hello").
Added the var keyword which can be used in place of let.
All these years later I have made print a class 1 predefined function, making it perform slightly better.
Improved the quality of the output when a native object function cannot be run due to permission levels required.
Fixed an issue that meant that fixed loops didn't work correctly on an initial value (e.g. for (-2 to 10) would start on 0).

-- Version 1.9.4 --

12.04.2021
Added a new data type, the record structure: e.g.
  $v = [x = 65].
  print($v.x).

13.04.2021
Added the new log predefined function.

15.04.2021
Fixed a major issue with else if statements. They can now only be written as elseif again.
0 now correctly resolves to false when in a comparison.

-- Version 1.9.5 --

22.04.2021
Fixed an issue that prevented strings from being serialised, and in turn any data type containing strings.
Variables defined using the let keyword can now be negated.

24.04.2021
Added the new PHP 8 style match statement e.g.
  print(match($x) {.
    5 => "Yes",.
    else => "No".
  }).
Added the DoNothing object.
The do_nothing command no longer returns null but a DoNothing object, in it's place a lambda function should be used that returns null.

25.04.2021
Changed the way in which the time thread works which makes them more reliable.
Added the ScheduledCommand object that can now allow a thread to execute a command the future to be interrupted.
Re-added the not keyword, this works identically to the ! except it requires a bracketed expression e.g. print(not(true)).

17.06.2021
Added the set_id to all UI objects.

26.06.2021
Added the get_remote_ip_address command to retrieve the IP address on the public Internet.

-- Version 1.9.6 --

27.06.2021
Added the be keyword, e.g. let x be 10

28.06.2021
Deeper support for non-$ bound variables.
Pre and post increment and pre and post decrement now support non-$ bound variables e.g. let x = 10 x-- print(x) let y = --x.
Fixed an issue in which increment assignment and decrement assignment values would not work.
The UPDATE_PATH property now allows the user to modify the path/URL to where to find updates.

-- Version 1.9.7 --

29.06.2021
Changes have been made to the assertion unit testing asserts true and asserts false now only take a parameter which is now compared to a true or false value respectively.
asserts equal and asserts nequal is now used to compare values. e.g. asserts equal (5 + 5, 5 * 2).
asserts equal and asserts nequal now use LAME to evaluate equality.
Record structure has been removed as it is being redesigned.
Strong typing is finally complete in ZPE/YASS! TYPO has been redesigned from the ground up to give a much better typing system.
Variables can be declared with a type using declare x as string = "Hello", string x = "Hello", declare $x as string = "Hello", string $x = "Hello" or using any other means.
Fixed an issue within the Zenith Parsing Engine that prevented double values with an exponent from evaluating correctly.

30.06.2021
Fixed a long standing issue in which FAST values weren't copied correctly.
Fixed another issue in which scope of variables and functions wasn't copied correctly from prototype to instance.

01.07.2021
Structures can now have properties defined with a data type.

-- Version 1.9.8 --

02.07.2021
Re-added support for internal/local structures within a function.

12.07.2021
Added more information about why a login hasn't worked for ZPE Online.
Fixed a long standing issue with modular arithmetic.

09.08.2021
Added the help program to the interactive interpreter.
Added the new in_range predefined function.

-- Version 1.9.9 --

20.09.2021
Fixed an issue in which the get_definition function would return an incomparable string.
Added the format_string function.

21.09.2021
Add the associative_array_remove function.
Major fix to ZPEString that means that when inserted into a map or associative array it can now be found using its hash code.
Associative arrays no longer do any late conversion (this was a temporary fix) on ZPEString data types but perform full hashing checks on all operations.
Further improved comparison between data types, with lists and associative arrays now being comparable (lists require the same order to be the same).

22.09.2021
Major comparison fixes make the runtime more stable and makes it easier to compare lists and arrays.
All associative array functions are now called map functions, with associative_array aliases.
All associative array functions now fall under the Maps category.
Updated the supports function to check all aliases as well as parent functions for support.

-- Version 1.9.10 --

25.09.2021
Changed the way in which ZPEStrings are assigned from variable to variable so that they copy the value and do not reference it. E.g. $a = "Hello" $a = $b.
Changed the null value works underneath the surface.
Further improved ZPEString comparison.
Fixed an issue in which the get_type function wouldn't return a comparable string.
An additional magic method for objects, _beautify, has been added, which allows ZPE to call it upon beautification.

04.10.2021
String comparison has now been improved to allow $a < $b to evaluate which string comes first.

06.10.2021
Added the .copy method to ZPELists.
Renamed the getc method of ZPELists to get_circular (this was a user-unfriendly name).

09.10.2021
Allows disabling of compiler includes using the properties file.

10.10.2021
Added the list_remove_all function.

14.10.2021
Fixed an issue in which http_post did not return a string correctly.
Fixed an issue in which setting a boolean or numeric value to null would cause a memory exception.

20.10.2021
Fixed an issue with the interactive interpreter that came from the fix made a few days back.

01.11.2021
Added the optional decimal_places parameter to the round function.
Fixed an issue with input reading in GUI mode.

-- Version 1.9.11 --

03.11.2021
Added the options to visit the ZPE Online website and public ZPE Online repository.

07.11.2021
New GUI console allows text input.

10.11.2021
Further improved the GUI console performance and text input.

-- Version 1.9.12 --

12.11.2021
Moved static runtime variables from the Main class to the RunningInstance class.

13.11.2021
Added the sign function which determines if a value is positive or negative.

16.11.2021
Updated the counter function manual to reflect that it works on more than just strings.

04.12.2021
ZPE now retrieves compiler constants from the constants.json file in the install path.
Constants have now been moved to the RunningInstance meaning no duplication of constants.

11.12.2021
Fixed the write function.

12.12.2021
The get_type function is now just type and the alias type is now get_type.
Another fix has been made to ZULE.

-- Version 1.9.13 --

19.12.2021
Added the new Map data type which supersedes the list data type for Maps.
Fixed an issue that prevented strings from being iterated correctly.

26.12.2021
Added the file_touch function to 'touch' a file and set its modification time.
Added the list_contains_all function which checks if list1 contains everything list2 contains.
Added the string_to_list function to split the string into a list of characters.
Added the copy_of function to make a pure copy of a value.
Added the rainbow effect to the format_string function.
The write function can now take an optional function parameter that allow a function to run after each character is written.
Changed the way that the exit function works in GUI mode.
Added the resize reference function to array data types.
Changed the way in which the write function works in the GUI editor console.

28.12.2021
Changed the way that documentation is 'bound' to fASTs.
Fixed an issue in the ZENServer that meant that when a file was put it disconnected from the client.
The ZENClient put command now accepts a second argument which is optional and can provide the file name for the file on the server.
Made it possible for external applications to run a ZPE Console and run code within it like the editor does.

-- Version 1.10.1 --

01.01.2022
Added the ZPE Online includes feature. Simply type: includes online {code} where {code} is the online code.

05.01.2022
Fixed an issue which would close the socket after a put command in the ZENClient.
Completely redesigned the way in which the update check works.

09.01.2022
Small performance improvements using cached files (not yet released).

15.01.2022
Added the list_compose function, which can help with quickly generating a list.
The UIBuilder no longer is bundled with ZPE. This will likely be a temporary change.

-- Version 1.10.2 --

15.01.2022
The beep function is now faster and more responsive.

23.01.2022
Beautification of data has been improved further, adding commas, quote marks for strings, and more indentation.
Fixed an issue in the JSON encoder that now makes it more flexible.

02.02.2022
Added the OpenJDK/JFX requirements to the class path.
ZPE now bundles the open JFX package - this makes ZPE 10x larger :(.

16.02.2022
The ZPEHelperFunctions have moved to the jamiebalfour.zpe.core package.

17.02.2022
The editor has been removed, as have all JavaFX features, and the editor has now moved entirely to Swing.
The GUI can now stop code that is running.

18.02.2022
Huge changes to the GUI that make it more functional.
New additions to the UI.

-- Version 1.10.3 --

18.02.2022
Syntax highlighting is now a feature of the editor.

19.02.2022
Added the new dark mode to the editor.
Added the option to view the changelog from the editor.
New 'function machine' creator in the GUI editor.

20.02.2022
Fixed an issue in which the compiler did not accept a function call in a for...to loop. e.g. for ($i = 0 to len($str)).
Added the ability to download files from the ZPE Online Public Repository from the editor.
Fixed an issue in which Fn keys (amongst others) would be picked up by the editor console.

21.02.2022
Added the ability to GetFunctionNames to ZPEKit which compiles and returns all functions in a program.
Added the Create code outline feature to the GUI.
Fixed an issue in which ZULE libraries would be downloaded to the incorrect location.

-- Version 1.10.4 --

15.03.2022
Big update: the by reference feature is now available and usable with ZPETypes. $x = &$y.
Changed all associative array functions to map functions, including internal documentation.

31.03.2022
Made an improvement to by value performance.

17.04.2022
Fixed an issue in which a ZEN Client would crash if the server responded that a command was not supported.

18.04.2022
Shutdown command no longer requires any arguments and by default carries out a shutdown.

21.04.2022
Changes have been made to the installer package that improve stability.
Added the --version ZAC.

-- Version 1.10.5 --

21.04.2022
Fixed an issue with when-is statements that prevented them from compiling multiple statements.
Added the -o ZAC that allows downloading from the ZPE Online public repository by it's public hash ID.

23.04.2022
Added in the new record structure, see https://www.jamiebalfour.scot/projects/zpe/documentation/data-types/record/.

05.05.2022
ZENServer can now be started from the GUI mode.

-- Version 1.10.6 --

13.05.2022
Added the timeout parameter to the ping function.

23.05.2022
Added the get_hostname function.

01.06.2022
The std_out function now only takes one parameter but works faster than the print function by asking the value to output itself.

19.06.2022
Fixes have been made to the http_post function.
ZPEMaps now have a stringify function which converts them into a URL encoded string.

-- Version 1.10.7 --

03.07.2022

Added the is_symlink function to check if a file is indeed some form of junction or link.
Added the replace_symlink function to do a direct replacement of a symlink.
Added the create_symlink function to create a symlink.
Major overhaul to the run_at function, making it more efficient.
Added the run_in function.
shutdown, get_max_memory, and get_os_name have all been moved to System functions.

05.07.2022
-m has become -d mode again for debug mode.

07.07.2022
The interactive interpreter has been moved from the YASS Runtime to it's own separate class.
The quick fire mode has had some UI changes.

13.07.2022
Added the XEN mode to ZPE, which will be used in the future for cron jobs.

17.07.2022
Removed the -v ZAC and replaced it with the --version ZAC.
Added whether or not a function can be overwritten into the manual.

18.07.2022
Added support for auto-prepending files to a ZPE program.


-- Version 1.10.8 --

19.07.2022
Added return types to functions, e.g.
  function test() {.
    return 10
  } => number.

20.07.2022
Strong typing for function returns has been added using the syntax.
  function testFunc() : number.

24.07.2022
Functions no longer accept parameters as objects but as ZPEVariables.
Infinite parameters can now be represented with the traditional triple dots (...) syntax and will be switched to this in the future.

26.07.2022
Parameters now use ZPEVariables to represent their values.
Typing is now supported in parameters.
ZPE handles incorrectly assigned data to typed variables much better.
Fixed an issue in which ZPENumber typed values would not correctly return a result.
The ZPENumber type is now the ZPEInteger and ZPEReal types respectively.
Return types are now forced onto values on return, this means integers are cast to reals on return and vice versa.

06.08.2022
When opening a compiled file, the password string is hidden as the user types it in.

07.08.2022
Minor performance improvements.

10.08.2022
Fixed an issue in which objects would be downcast. For example from ZPEDateObject to a standard Object without properties.

12.08.2022
Fixed an issue in which the csv_encode function did not return a ZPEString but return a string, causing a type error.

25.08.2022
Added the option_base_1 property allowing array access to start at 1

-- Version 1.10.9 --

04.09.2022
Changed the way in which the ZPE environment detects the install path.

10.09.2022
The Zenith Parsing Engine is now a separate module from the main ZPE package and will be maintained separately.

16.09.2022
json_decode now accepts an optional boolean value which, if true, will mean that instead of using ZPEMaps the parser will return ZPEObjects.
Fixed the evaluate function for the new syntax requirements.

-- Version 1.10.10 --

02.10.2022
Added the new MQTT object which will allow MQTT publish and subscribe functionality.

15.10.2022
Improved the MQTT object.
Added the publish functionality to the MQTT object.
Added the UI builder object back into the ZPE Core.

-- Version 1.10.11 --

17.10.2022
Added the new Socket object, which allows for easy server socket and client socket communication.
Minor performance improvements using the FOR_TO byte-code instead of compiling into a FOR loop (requires re-compilation).
Fixed an deprecation in which the ZPE compiler referred to itself as ZEN.

22.10.2022
Fixed a weird issue in which a string containing a number would type as a number.
Errors are now displayed in red text in the GUI console.

27.10.2022
Added the http_download function.

13.11.2022
Added the int function as an alias to the value function.

16.11.2022
Code must be validated before uploading to ZPE Online.
The auto_input function now recognises Boolean values true and false.

20.11.2022
Added support for short expressions in if statements e.g.
  $x > 10 and < 20

-- Version 1.10.12 --

25.11.2022
Added the AutoGUI object.

27.11.2022
Minor fix to the GUI that ensures that the user must be using Java 9 or above to use the GUI.
Fixed the issue in which Windows users had a bad looking editor.

29.11.2022
The new global keyword has been added.
The global keyword can be applied to a function declaration within a function to push it to global.
Global variables now use the global keyword, rather than the function, leading to better performance.
The global function has now been completely removed.

-- Version 1.11.1 --

21.01.2023
The first major update of the year brings type casting. Currently the main use for this is when a value needs to be stored in a typed variable: e.g.
  string $x = "10".
  integer $y = 20
  $y = cast($x, number).

22.01.2023
jANSI library bumped up to 2.1.0

-- Version 1.11.4 --

04.02.2023
Added the new inline iteration feature, e.g.
  print(from 5 to 1000).
  print(from 0 to 100 : function ($x) { return $x * 2 }).
Fixed an issue in which reference functions worked on a copy of a variable.
Added support for count in mathematical expressions e.g.
  $x = [0, 1, 2].
  $x.put($x[count($x) - 1] + 1).

08.03.2023
Added union return types.
  function foo(integer $bar) : real | integer.


01.04.2023
Changes to the record structure that mean that fields are accessed as $x.name = "Jamie" or print($x.name).

02.04.2023
Records can parameterised on construction, defining values for the record.
Real and integer data types are back as the number data type.

07.04.2023
Added a minor fix to prevent double undo in the editor (removed accelerators from the menu items).

10.04.2023
Added a new startup option called SHOW_COMPILE_COMPLETE_MESSAGE which shows a message when compilation is done with the -r ZAC.

30.04.2023
There is now a new group of functions called I/O. These functions have been moved from the Core group.

-- Version 1.11.6 --

03.06.2023
Huge performance improvements that make loading much faster due to the use of static code and reflection.

-- Version 1.11.8 --

26.08.2023
Two lines of code added support for variable declaration similar to Python, x = 10
After reconsidering the font menu, it has been condensed to only around a dozen useful fonts.
Switching to IntelliJ IDEA has allowed me to identify areas of improvement, so this version brings these.
Using 'short ifs' requires the USE_SHORT_IFS property to be used.

30.08.2023
Objects are now named 'object' rather than 'Anonymous object' when they are used inline.
Fixed an issue in the manual that meant that internal functions would not display data about them at all. This came from the move to static predefined functions.
Added the ALLOW_UNBOUND_VARIABLES property that allows the definition of unbound (e.g x = 10) inline variable declaration.

-- Version 1.11.9 --

31.08.2023
Added the list_is_empty function to check if a list is empty (since removed).

02.09.2023
Further improvements to static underlying methods mean that the ZPE takes less memory and starts faster.

03.09.2023
Function reference can now be used to assign a function's code to a variable by not using a function call (i.e. including brackets after the name).
  function m(){print("Hi")}.
  $x = m.
Build version automatically updates when the program is compiled.
Build version in the JSON --version is now build rather than build_version.

05.09.2023
Removed the errors that appear when a function is not found prior to checking aliases. This was meant as a temporary feature.
Deeper ZPEKit integration and removal of more public methods across the system.

08.09.2023
Added the empty keyword, which can be used to check if a list, map, string, or object is empty (i.e contains no elements, keys, substrings, or properties, respectively).
Compiler directives can be written into the code using @directive. These are removed once this program is compiled.
Added the compiler directive prevent_auto_include.

09.09.2023
Built the CodeEditorView which encapsulates both the line number editor and the syntax highlighter into one reusable component.
Fixed the list_insert_at_index function as it was incorrectly referenced as list_insert_at and would not run as a result.
Fixed an issue in which editors not run from the command line would have no function information.
Added the -h log feature to access and view the ZPE Log.

-- Version 1.11.10 --

06.10.2023
Added the new YASS Unfold feature.

08.10.2023
For, For To, While, Assignment, Logical Conditions, Variables, Function definitions, Function calls have all been added to YASS Unfold.

09.10.2023
The new FunctionReference object is used to encapsulate method when assigning to a function's reference, $x = print, meaning that it can be used to reference predefined-functions as well as user-defined function.
The FunctionReference object exposes a get_description reference function that will read the manual description for a predefined function or the @doc directive for a user-defined function.
The FunctionReference object also exposes a describe_code reference function that will use YASS Unfold to explain the code of the function.
Added the unfold static method to ZPEKit, allowing external access to YASS Unfold.

14.10.2023
Further improved the English syntax of the YASS Unfold feature.
Added support for exporting to HTML in YASS Unfold.

17.10.2023
The build version and time are now stored in a text file in the program to make building quicker.

-- Version 1.11.11 --

19.10.2023
The changelog is now bundled and read locally rather than from jamiebalfour.scot.
Better handling of editor start issues on headless machines.

15.11.2023
Added the list reference functions LIST.map, LIST.filter, and LIST.reduce based on the JavaScript functions.

-- Version 1.11.12 --

22.12.2023
Fixed an issue with undo not working in the editor, causing the program to crash.

30.12.2023
The array_get_data_type function is now the list_get_data_type function and now works on lists as well.
The array_get_data_type function now aliases the list_get_data_type function.
Minor changes around ZPE such as using isEmpty rather than length == 0
Added the mixed type byte code to string conversion.
Added the string_compare function, which is useful for sorting strings.
Added the -h changes option to allow easy access to the changelog for ZPE.

-- Version 1.12.1 --

05.01.2024
The Undefined and UndefinedPath have been changed to static variables.
It was also noticed whilst testing this that the undefined function doesn't work due to undefined being a keyword, so the function was removed.
Creation of the new in-order LAME expression evaluator - this is not on live tracks yet.

-- Version 1.12.3 --

17.02.2024
Fixed a bug in which ZPE would fail to start under certain circumstances down to a permission level setting not being set.

16.03.2024
LAME X2 is now ready and available in the latest version of ZPE.

-- Version 1.12.4 --

17.03.2024
Made minor changes in LAME X2 that would improve readability of code and performance of LAME.

22.03.2024
Added the jLine tool to interactive interpreter to allow line history to be accessed within the interactive interpreter (no need for rlWrap).

23.03.2024
Line history in interactive interpreter is now saved and loaded.

31.03.2024
For...To now supports mathematical expressions in the maximum (e.g. for $i = 0 to $x + 3).

01.04.2024
Improved the installer application on Linux and macOS.
jLine is now bundled with the JAR file. This also means that compiling to native works again :).

02.04.2024
Not directly ZPE, but the Zenith Parsing Engine has been changed to better support escape characters.

03.04.2024
New escape sequences \n, \r, \t are now supported in strings and inline documents.
New features have been added to the Help menu in the editor.
The Help menu's function information is now responsive to the function selected, rather than displaying a messy list of all functions.

10.04.2024
Fixed the aliases feature, e.g. function x aliases print.

11.04.2024
The is_set and unset predefined functions are no longer functions but compiler keywords.
Further to the above, the NO_PARSE_MODE (aka, special functions) have been removed, which should increase performance.

-- Version 1.12.5 --

13.04.2024
Added the const keyword, e.g. const x = 10

15.04.2024
Fixed an issue in the for...each loop that meant new changes didn't work.
Added support for $-unbound variables in for...each loops.
Undefined values can be written as either undefined or UNDEFINED to bring consistency with null values.

21.04.2024
Fixed an issue in which unbound typed parameters would not correctly be passed to the program.

24.04.2024
The compiler performers a post check on function definition declarations to check if they are actually meant to be references to variables.
Made a change to the auto_input function that means if a number is meant to be an integer, it returns it without decimal places.

25.04.2024
Fixed an issue that seemed to randomly appear with association in for...each loops.
Added support for object iteration of public properties. For example,.
  $o = {"Forename" : "Jamie", "Surname" : "Balfour"}.
  for each ($o as $prop) {.
    print($prop).
  }.

26.04.2024
Removed the ZPEIterable interface as it was no longer being used.

10.05.2024
Added an additional challenge to check if AWT is installed before trying to launch the graphical editor. This stops installations such as native images trying to launch it.

11.05.2024
Improved the transpiler system to make it easier to make transpilers.

12.05.2024
Removed the check for AWT as it was causing issues with native builds.
Removed the ConvertibleFunction class.
Transpiled programs no longer are given a function list but the whole AST.

15.05.2024
Removed the GOTO and LABEL bytecode as they were no longer needed.

-- Version 1.12.6 --

17.05.2024
Removed the MQTT object from the ZPE Programming Environment, thus reducing the size (this is now an external library).
Added the ability to transpile code from the built-in editor.

19.05.2024
Changed the plugin interface to use camel case on all exposed functions and to ensure that they begin with get. E.g. getParameters.
Removed the LAME interface, LAME is now a core part of ZPE and therefore needs no interface.

20.05.2024
Finally fixed the issue in which $x[0]->$distance did not work.
Added the -n option to --update allowing the downloading of 'nightly' builds.

21.05.2024
Added support for variables called $count, $length, $record, $default through a list of $-bound variable names that use keywords.
Removed the UIBuilder object and moved it to a plugin.

28.05.2024
Removed the BECL (Balfour's Enterprise Class Library, one of my oldest libraries that I started developing in C# 20 years ago) library as there was code duplication with the HelperFunctions library.

29.05.2024
Transpilers require a name for the transpiler itself now.

30.05.2024
Constants are now listed in the -h config option.
Changed ZPE_MAJOR_VERSION, ZPE_MINOR_VERSION, and ZPE_CLI_VERSION constants to be updated automatically with the version of ZPE they are bundled with.
Added the ZPE_VERSION_BUILD constant.

01.06.2024
Function traversal is now done in a static manner, meaning higher performance and lower memory footprints for function instantiation.
ZPE now has a stunning new logo on macOS.
Fixed an issue in which internal aliases were not working. This might actually have existed for some time now as version 1.12.5 also has this bug.
Removed the power, square, and cube functions (these were deprecated some time ago).

-- Version 1.12.7 --

08.06.2024
Another fix to FunctionReferences that means that if the function does not exist in any way, it returns undefined.

13.06.2024
Added the iif function.
Removed the iff function due to similar names and the function no longer serving a purpose.

21.06.2024
Importing libraries or other files now works completely differently (https://www.jamiebalfour.scot/blog/posts/zpe-1127-changes-to-libraries).
The stdLib file is now bundled with ZPE and will be offered during first run.

22.06.2024
Added the import lib as name, e.g. import stdLib as lib, $l = new lib.

25.06.2024
Changes to the error handling in ZPE with the addition of ZPERuntimeErrors. This paves the way for ZIDE and better error handling in ZPE.

26.06.2024
The new ExitHalt is a new means of creating an exit internally. This has paved the way for breakpoints in ZPE and ZIDE.
Fixed an issue in which PERMISSION_LEVEL wasn't read correctly unless it was lowercase in the properties file.
The -d mode is now the same as -r except with debugging turned on.
Breakpoints can now be added to code with #breakpoint# in them.

27.06.2024
Added the new Breakpoint Watch window to the ZPE editor.
Added the new Run code with debugging on option to both the editor and the console.

29.06.2024
The run_in_thread command is now deprecated scheduled for removal in ZPE 1.12.9.

01.07.2024
Added support for unescaped strings using the @ sign in front of a string. E.g.
  @"Hello \".

-- Version 1.12.8 --

02.07.2024
Fixed an issue in which ZPE would try to compile the standard library every time it starts up.

05.07.2024
Updated with the latest version of the Zenith Parsing Engine.

10.07.2024
Fixed an issue in which the shell command would return a non-ZPE compliant data typed value.
Ensured that cache_values.prop is now stored in the ZPE folder.

11.07.2024
Added simple support for namespaces in YASS and ZPE (this is the first new version of YASS in a while, known as YASS 24.7).
Added a feature to ZPEKit to list all byte codes and their definition.
Dropped the copyof keyword.
Added the bytes option to the -h ZAC to list all byte codes in ZPE.

13.07.2024
Added the new ZPERandomizer for generating random numbers and the like.
Match statements require a semi-colon at the end of each expression (part of YASS 24.7).
Brackets and other delimiters no longer format in keyword format in the editor.
The editor now correctly moves the caret back in between quotes or brackets.

14.07.2024
Added a new logs folder in the main ZPE folder where old logs are kept.
Logs are limited to just the five most recent log files.
When a file is downloaded from ZPE Online it precompiled by ZPE as a library.
The main ZPE introduction is considerably more detailed now.
Tidied up the main ZPE introduction (e.g. all instances of $file_path and $filepath are now $filepath).

15.07.2024
Fixed an issue in which string comparison was not carried out correctly.
Started to add Java documentation to functions that are exposed.
Changed the ZPE -o so that if no ZAC value is provided it will list everything.
std_out always prints to the same line.

18.07.2024
Removed the exit_on_fail parameter for the Interpret function on the runtime.
The ZenithParsingEngine now properly catches substring errors and passes to ZPE so they can be handled.
When the getIndex function is called on an non-indexed type it throws a new UnacceptableTypeException that can be handled.

19.07.2024
Added support for the null value in a JSON file.
Moved the exceptions from the package jamiebalfour.zpe.core to jamiebalfour.zpe.
The CompileError is now the CompileException and the ZPERuntimeError is now the ZPERuntimeException.
Fixed an issue in which the --man always stated that any function returned an object data type.
Fixed an issue in which the rate and voice parameters in the speak command were not optional. Also updated the manual heading for the speak command as a result of this update and bumped the command to version 1.1

21.07.2024
Updated and simplified the regexps in the byte codes.
Regexps are now precompiled.
The match expression now only supports one else statement and this must be the last statement in the match expression.
Added the NoEntryPoint and NonExecutableFile exceptions.

22.07.2024
New ZPEException class is the basis of all ZPE-based exceptions.
Handling of errors focuses more of the handling of ZPEExceptions.

23.07.2024
Handling of errors is slightly better than it was before.
Try-catch statement has been improved to handle errors better.

25.07.2024
Further removal of public methods from ZPERuntimeEnvironment, which can now only be accessed through the protection of the ZPEKit module.
Fixed an issue in the ZenithParsingEngine that meant that words were not returned when it saw a quote mark after being toggled.

28.07.2024
Updated the ZPERuntimeException to be the basis of all runtime-based exceptions.
Added support for declaring a return type with -> as well as the colon. For example:.
  function test(string x) -> string.

29.07.2024
Anonymous functions in the short form, i.e. () => {}, now support $-unbound parameters.
Added static function calls and static methods in objects.
Added support for namespaces with static methods.
There is now much stricter rules for the Exception object to be thrown and the throw_error function is now only able to throw Exception objects.
Fixed an issue in which constructors would not always be called when an object was created.

30.07.2024
Although the protected scope has been available for a long time, it is now also a keyword that can be specified for conciseness.

-- Version 1.12.9 --

01.08.2024
Deprecated the run_in_thread function.

02.08.2024
For, For Each, For To, If, While, and Loop Until statements all now support the non-bracketed, colon terminated conditions, e.g.:.
  while $x < 100:.
    print($x).
  end while.
The Do While statement now supports unbracketed conditions at the end if they are terminated with a semi-colon.

05.08.2024
Added the new TYPE keyword, identical to the TYPE function in syntax, with slightly higher performance.

11.08.2024
Added support for tuples e.g.
  $x = (string, number, number).
  $x = ("Hello world", 13, 7).
Added safety features to prevent crashes if a tuple is incorrectly defined.

17.08.2024
Added the REQUIRE_EXPLICIT_VARIABLE_DECLARATION property, which if set to true, ZPE requires variables to be typed and defined prior to use.
  string $x = "".
  $x = "Hello".
  would work but.
  $x = "Hello".
  would not.
Added the requires_explicit_declaration directive that does the same thing but can be set to on or off per script.
Removed the global RunningInstance.PERMISSION_LEVEL property and it has been moved to the ZPERuntimeEnvironment to manage its own permission levels.
Finally added support for ZPENumbers, now ZPE only has one type that is defined on a Java level, the boolean. Now the main focus is on setting all the predefined function return types to ZPETypes.

18.08.2024
One of the biggest updates to ZPE has begun to happen, everything in the ZPE Core is now defined as a ZPEType.
All predefined functions return ZPETypes.

19.08.2024
To the best of my knowledge, everything now returns a ZPEType across the whole ZPE platform. This will be tested over the next few months and further updates and deeper integration will occur with future releases.
Changed ZPEObjectNativeMethods to pass ZPEType parameters, further consolidating the ZPEType throughout the language.

22.08.2024
Added Recent files to the editor.
Fixed an issue in which the open command did not work on a SequentialFileObject as it was internally named open_file when it should just have been open.

23.08.2024
Changed the way that ELSE statements compile within an IF statement as this was causing issues within the transpilers.
Moved the code from FunctionActions to the ZPERuntimeEnvironment.
Fixed an issue that occurred because of the new data type requirements when loading data as JSON format.
Improved the scrollbars in the GUI.

24.08.2024
Detached the console from the GUI so that it can be halted during execution.
Added support for the BreakPointHalt again which had disappeared somehow.
Added the new YASS Unfold window.
The console menu now moves to the macOS Menubar.
Fixed the issue in the editor that makes the scroll position after toggling dark mode the very last character rather than the one the user was on before the change.

26.08.2024
Added the new option to the ZPEServer that allows a file to be prepended so that all YASS that is run is prepended with this content.

27.08.2024
Added the new process object, add the run_process predefined function.

31.08.2024
All compiler messsages are now called statically and inline.

01.09.2024
ZPEMaps now require ZPETypes as keys and values.

-- Version 1.12.10 --

07.09.2024
Updated the version number, date, and name for the next version.

08.09.2024
Fixed the issue in which tuples returned null when a copy was made.

15.09.2024
Added the ApacheHandler for the Apache Web Server.

27.09.2O24
Added support for multiple returns from a function. E.g.
  function multiReturn().
    return 1, 3, 5
  end function.
  ($x, $y, $z) = multiReturn().
Changed the way multiple return values works when passing as a parameter so that it is converted to a ZPEList.
Blocked Java errors from appearing in the editor console.

28.09.2024
Fixed a bug that meant that if case insensitive compile was enabled, function calls would be case insensitive.
Fixed the bug in which for loops would not properly evaluate single values.
Improved for loop structure.
Added autocomplete suggestions to the editor.

01.10.2024
Added the new ZPEKit getTypeKeywords.

03.10.2024
Added the publicly accessible ZPEMacroInterface editor.

04.10.2024
Fixed the updater and version numbers to use ZPEStrings instead of native strings to ensure they work correctly.

-- Version 1.12.11 --

05.10.2024
The function data type keyword is no longer function but fn to avoid ambiguity. Functions themselves can no longer use fn.
Added in the new function tooltips into the editor.
Removed the Function Information menu from the Help menu in the editor.
Passing variables to the runtime without being $-bound is now supported.

13.10.2024
Added the new Pair object type.
Furthered structure security to prevent adding in properties after they have been declared.
Objects no longer create duplicates, even if passed by value.
Fixed an issue with the Calculator object due to the changes made to ZPE recently.

15.10.2024
Cleaned byte codes for associative arrays, formally known now as maps.
CompileDetails is no longer a public facing class. Instead, the details of the compile are now inlined.
Redesigned the ZPE class to only contain core features, added the new ZPEMain class which is the main interface to running the application from the command line.
Fixed an issue in which exiting the interactive help in the interactive interpreter threw a warning.

26.10.2024
Further documentation added.

-- Version 1.12.12 --

16.11.2024
ZPEKit function added that converts manual information to HTML.
Function manual information tidy up fixing spelling mistakes, updating the information, and ensuring parameters are obvious.

17.11.2024
Aliases are now stored in a file in the zpe folder called aliases.properties.

18.11.2024
Fixed a serious bug that meant that unless the data used with not/! was a number it would always return null.

08.12.2024
Added ZPE Performance Enhanced Cache (ZPEC).

10.12.2024
ZPEC now uses hashes to keep track of edits.

12.12.2024
Added the list_libraries command.

20.12.2024
Fixed an issue with the syntax compilation of declare. E.g. declare x as string = "Hi" wouldn't work. This is likely down to the introduction of the new built-in typing system.

21.12.2024
Fixed an issue in which ZPE would add jamiebalfour/org to all structures when compiling only.
ZPEC is now running and does indeed improve performance.

-- Version 1.13.1 --

03.01.2025
Added support for ChatGPT.

04.01.2025
Added the AI Assistant to the editor.

05.01.2025
Added the new pipe command that takes in a value and infinite function references and applies each of the functions to the value.

26.01.2025
Added the new INIParser, currently with only the INI decode feature.
Added the ini_decode predefined function to ZPE.
Added the new TOML parser. It's similar to the INI parser, but works on the TOML language.
Added booleans to the TOML parser.
Fixed an issue in which new lines inside an array would cause an error.

-- Version 1.13.2 --

29.01.2025
Added support for comments in JSON. These should be used with caution as other parsers might not support these.
Fixed a bug in TOML where a new line inside an array before a comma might cause an issue.
Fixed an issue in which the default value for ChatGPT was null and caused the program to fault.

02.02.2025
Fixed an issue in which 031.3 was recognised as a number, specifically as a double or decimal value.

07.02.2025
Added the JBML parser.

08.02.2025
Added the jbml_decode function.
Added the new ALWAYS_BEAUTIFY_OUTPUT property that means output from the print function will always beautify the output first.
Updated the JBML format to use the new changes brought to the format such as { x : y } rather than [ x => y ].
Updated references to BalfML to JBML.

-- Version 1.13.3 --
09.02.2025
Updated the copyright information.
Added support for concatenation within JBML.
Added support for properties within JBML.
Added concatenation between properties and other properties.
ZPE now uses Binary Search Tree for functions, variables, properties, objects, and parameters.

13.02.2025
Updated the JSON parser to now use the Zenith Parsing Engine v1.5. Other uses of the engine use v1.4.2.

01.03.2025
Fixed an issue in which ZPEArrays were incorrectly calling copyMe from the ZPEList.
Updated the error message to be more thoughtful when the value data type does not match the array data type.

-- Version 1.13.4 --

20.03.2025
Updated references to the Zenith Parsing Engine to v4
Fixed an issue in which camel cased internal aliases didn't work due to trying to reference non-camel cased internal functions.

11.04.2025
Added compiler support for modules.
Added function support for accessing modules.

-- Version 1.13.5 --

13.04.2025
Added support for scope based constants.
Improved the means of accessing variables statically within modules.
Main functions now run totally statically and separate from modules.

15.04.2025
Added the immediate output window to the Macro Editor.

17.04.2025
Moved ZPE's readEncryptedObject and writeEncryptedObject helper functions to the HelperFunctions library.

20.04.2025
Updated the ZPE Macro Interface editor so that it can accept multiple hook objects that can be used in programs.
Major overhaul to the ZPE Editor interface makes it use my own custom interface.

-- Version 1.13.6 --

21.04.2025
More interface improvements including shortcut buttons on the right side of the interface (on menubar).
Added tooltips to some of the buttons across the interface.
Menubar has now been integrated with the theme in the editor.

26.04.2025
Added UI improvements, mainly to the menubar.
Added a fix that fixes the problem that prevents ZPE from starting if running in the GUI.
Added a new purple theme to ZPE since ZPE's colour is purple.

27.04.2025
Added a new splash screen to the editor.

29.04.2025
More UI improvements, including new buttons.
The glowing label on the title bar now hides as the window shrinks.

-- Version 1.13.7 --

10th year anniversary edition!.

02.05.2025
Added string_count_occurrences function to count the number of occurrences of a character or sequence of character, or multiple sequences of characters.

04.05.2025
Added the search box.
Added search box suggestions.
Added many UI improvements from the latest version of BalfLaf, particularly the new Dark Mode look and feel.

05.05.2025
Added an optional parameter to the list_zpe_functions method that if set to true produces a map containing the name.
Added new Dock positions to the editor.

06.05.2025
Fixed an issue in which the Date object used parameters.size not contains when checking to see if a type had been specified.

-- Version 1.13.8 --

06.05.2025
Fixed an issue in which the Date object used parameters.size not contains when checking to see if a type had been specified.

11.05.2025
Changed the location of the ZPE properties and files needed to the Application Support (macOS) and AppData folder on Windows.

13.05.2025
Added exception handling in the ZPEConsole if it doesn't not start the code.

14.05.2025
Changed the colours of highlights in the editor.

21.05.2025
Added new dark mode colours to the editor.

25.05.2025
Added the Simple UI feature to switch to a standard UI.
Fixed the macOS menu bar feature (if the user is using the Mac menubar it will work properly again).
Fixed the light scrollbar colour.
Added the new YASSKeywordsSet to ZPEKit.
Improved the ZPEMacroInterface to now use the ZPEKit YASSKeywordsSet and improved the look of the ZPEMacroInterface.
Redesigned the menu layout within the GUI with a new Window menu.
Fixed the issue in which the editor was called ZPE Editors.
A change made to BalfLaf keeps menu items up to date by storing pointers.
Fixed the breakpoint button in the editor which hadn't been working for a while (never implemented).

27.05.2025
Added module to the list of symbols to the symbol to string method.
Added modules to YASSUnfold.
Added the generateCodeOutline to ZPEKit and YASSCompiler.
Changed the code outline feature of the editor to use the ZPEKit generateCodeOutline.

31.05.2025
Added in a fix to the ZPE JSON parser that checks for quote marks to determine a string.

01.06.2025
Changed the ZPEConsole to feature a dark BalfMenuBar.

20.06.2025
Added labels to the language, e.g. label beginning.

21.06.2025
Added goto to the language which go to a label, e.g. goto beginning.

29.06.2025
Fixed a bug that prevented the ZPEMacroInterface from running code in some cases.
Made a fix to the goto feature.
Deeper and more useful macro interface functionality, including the ability to 'add macros' to external applications.

30.06.2025
Added the option to change the name of an existing macro or to update its code from the ZPE Macro Interface.
Added the Colour object.
Added more information on object descriptions so that functions display their parameters too.
Added the Objects menu to the ZPEMacroInterface which shows mini descriptions of these objects in a cleaner manner.

01.07.2025
Fixed a bug in which anonymous objects could not be assigned values due to a new safety check put in. This bug also occurred when they were initialised.

02.07.2025
Added a new traverseAction which is a runnable function that runs when ZPE ticks.
Based on improvements to BalfLaf, the ZPE UI colours have changed.

10.07.2025
Updated the parser to version 5. ZenithParsingEngine version 5 offers approximately 24% higher performance than before due to caching of lookaheads.
Added a new MissingParameterException.

11.07.2025
Removed the local console option.
Added support for themes, using BalfLaf's Theme package.
The built-in output console now uses ZPE Native, when it is provided, as the runtime for the running of scripts.

12.07.2025
Improved built-in support for running code from ZPE Native.
Massive improvements to the Quick Fire Command Window, mainly focused on the appearance.

13.07.2025
Removed symbols from the list of keywords.
Added the new Properties editor to the GUI.

16.07.2025
Added the option to lockdown ZPE using the lockdown file, which must be placed in a location on the system that only administrators can write but anyone can access.
Added the Colour object.
Added the Point object.
Improved the rounded look of the UI both in BalfLaf and ZPE.
Changed the icons at the top right to white icons.
New code for the beep command makes it sound more like actual frequencies.

19.07.2025
Added the new get_environment_variables predefined function.
Added syntax highlighting for objects.
ZPE now checks for an environment variable called PWD to check for the current directory then goes down the original route of using a file to find the current directory.

20.07.2025
Added the get_percentile, base64_encode, and base64_decode predefined functions.
Added the histogram and standard_deviation functions.
Objects now check whether they are anonymous (unstructured) objects before checking access (public) on values. If an object is anonymous, access to values is not restricted.

21.07.2025
Fixed a bug in which the list_zpe_functions function did not return all methods if the category had already been used.

23.07.2025
Split Mathematical functions into two separate groups; Numerical and Arithmetic and Scientific Mathematics. This just helps keep the groups under control.

26.07.2025
Fixed the issue with the GUI editor and the rogue white line.
Assertion has changed in ZPE, so it now uses assert($x == $y) rather than asserts equal ($x, $y).

27.07.2025
The System UI feature in the GUI no longer supports dark mode.
The range function now supports inclusive as an option. The third parameter, i.e. increment can be a number where it will increase the increment of the range, or a boolean where it will tell the function to act inclusively.
Added the get_linear_interpolation function.
Renamed statistical functions for consistency:.
  histogram to generate_histogram.
  standard_deviation to calculate_standard_deviation.
  get_minimum to calculate_minimum.
  get_maximum to calculate_maximum.
  get_range to calculate_range.
  get_mean to calculate_mean.
  get_mode to calculate_mode.
  get_median to calculate_median.
  get_percentile to calculate_percentile.
Removed the range_inclusive function due to the change above.

-- Version 1.13.9 --

04.08.2025
Added new sandboxing to plugins to restrict their access to certain classes.

05.08.2025
Removed the 'module' on variables and properties as this is now handled by the owner module hierarchy.

07.08.2025
The Lite service now works correctly, and works on HTTP and standard requests - no need for JSON anymore.
Fixed an issue with records not being properly constructed.

23.08.2025
Plugins must state their supported key platforms.

31.08.2025
Added the dump reference method to the ZPEString.
Reference functions are now fully static, thus improving performance.

-- Version 1.13.10 --

20.09.2025
Added the ics_encode.

02.10.2025
Fixed the 'break when' is statement in collection controlled loops (for each). ZPETypes need to be compared differently.
Added support for for each ($lst as $l, $l is 3) style loops.

04.10.2025
Added the max_value function for the maximum number representable on the system.
Added the infinity function for getting the value of positive infinity.
Re-added the get_wikipedia_reference function.

05.10.2025
The max_value function is now max_integer, and there is now a max_real function.
Added the file_zip and file_unzip functions.

-- Version 1.14.1 --

17.01.2026
Removed JNA support to prevent issues with native access restrictions.
Added tab auto completion to the interactive interpreter.
Fixed the template parser and it is now enabled.
Improved template parsing to evaluate whole expressions, including function calls.
The template parser now uses {{ and }} around expressions, rather than ${ and }.

-- Version 1.14.2 --

19.01.2026
Added template support across the language rather than just as variable values.
Updated the byte code regexps.

25.01.2026
Added block scopes, represented by the keyword block and end block, or by using the {{ and }} symbols. These blocks are executed in a separate environment.
Introduced the private keyword for function-local variables. Variables declared as private are scoped to the containing function and no longer modify parent or global variables, allowing safer encapsulation while preserving YASS’s simple scoping model.
Updated the let keyword so that it is used to declare local variables (much like in JavaScript and similar to the private keyword).

30.01.2026
Added proper debug tools that allow you to step through code and inspect variables - use the ZPE ConsoleOutputTextArea for a full package of IDE-style debugging tools.

01.02.2026
Removed port-based communication between the editor and the console, as it was causing issues with the editor not being able to connect to the console.
Breakpoints can now step over code that is not yet executed, allowing you to inspect variables and step through code that has not yet been executed.

-- Version 1.14.3 --

04.02.2026
Added the x509_pem_fingerprint predefined function.

05.02.2026
Security improvements to ZPE's plugin system ensure that trusted JARs are loaded automatically (signed by Jamie Balfour).

08.02.2026
Updated the UI of the CommandWindow (Quick Command).
Added the x509_pem_fingerprint predefined function.

16.02.2026
Support for modules in compiled applications was not complete. Modules were not bundled into compiled applications. Additionally, main functions could not be identified in modules in compiled applications. This has now been fixed.

17.02.2026
Added stricter lockdown procedures to prevent plugins from loading when the lockdown feature is enabled.

22.02.2026
ZPE checks for updates on load.
ZPE loads plugins async.
Plugins can now be loaded from import if they have not loaded async yet.
Updated the Converter object, it now has many new converters including area, power, volume, temperature, energy, mass, and speed.
Fixed some typos in the changelog.
Added a new means of using addAll with ZPELists which converts non-ZPEType values before inserting them.
Added a new -h plugins --info option to the CLI to show information about plugins in JSON format.
Fixed a glitch in which objects could be constructed multiple times.

27.02.2026
Added the file_is_child_of function.
Added support for functions with arrow pointers (->) straight after e.g. print(get_wikipedia_reference("USB")->title) will now compile and work.

01.02.2026
Ensured that plugins are loaded before the --man command is run.

-- Version 1.14.4 --

01.03.2026
Added checks for data type returns from native methods.
Added the new --tools ZAC.
Removed createInstallScript and have now made it so that ZPE will install itself.

03.03.2026
Improved the ZEN Web Parser performance and added session, cookies, post, and get parameters to it.

05.03.2026
Undefined is now internally defined as a singleton.
Further improved the ZEN Web Parser performance and how it deals with ExitHalts.
Improved ZPEC (ZPE Performance Enhanced Cache) performance considerably.
Added the -h cache to list all cached files.
ZPEC is now on by default.
ZPEKit can run cached files.

06.03.2026
Added the new Interactive Actions feature, allowing you to run interactive sessions of code.

07.03.2026
Further improved the web parser features.
Added yep files - compiled YASS webpages (YASS Executable Pages).
Added LAMEX3 - an AI improved version of LAME - this is currently in experimental mode.

08.03.2026
Added the RequestObject which changes the purpose of the ResponseObject. Request comes from the server and Response goes to the server.
Session variables can also contain any ZPEType, not just strings.
Updated the runtime to use its own standard out.
Improved ZPEC and made it more robust.
Added the --zpec ZAC to allow listing caches and purging caches.
Due to the change in which VWS now stores objects in sessions, ZPE has now changed to storing full values in sessions.


09.03.2026
Made the ZPEInstaller class due to the number of new features being added to it.
Removed object type validation (temporarily).

14.03.2026
Fixed a bug in that VWS sessions did not persist with ZPE.
Brought in considerable performance improvements to the runtime.

19.03.2026
Removed the -p ZAC for properties and moved it to --properties..
Improved the JSON parser reliability.
Added ZPE-PM - the ZPE Process Manager for running scripts over a socket.
ZPE-PM now streams the output and caches .yas files.

20.03.2026
ZPE-PM and ZPE's VelocityWebServerModule both now handle sessions. With Apache, sessions are set to ZPE-PM via the JSON request. VWS also sets passes the request across to ZPE to deal with, so that VWS no longer deals with sessions.

21.03.2026
ZPE-PM is now part of the version information for ZPE.
ZPE-PM now accepts new parameters passed to it via the JSON request.
JSON communication mode (-j) has been removed as ZPE-PM now handles this.
Added GET and POST parameters to the JSON request.
Added expiration time to sessions.
Introduced the new arrow expression: x.where(n => n % 2 == 0).

22.03.2026
The new arrow expression is now fully implemented.
The arrow expression can also be written to work on maps as well, e.g. x.where(k, v => v > 40).
Added the directory_is_empty function.
Added proper line numbers in syntax errors - it was actually a really simple fix.
Fixed a bug in the CSV parser that means that it only reads the \n character as a line break.
Fixed a recent bug in which the first argument in an executable would be ignored.
Added the list_append and append aliases for list_add_element.
Aliases are no longer part of the runtime but just part of the compiler to improve performance and compatibility (they are compiled to their actual function call).

23.03.2026
Fixed an issue in which the installer would not install on macOS contexts.

24.03.2026
Massive performance gains by moving to a cached instance runtime - i.e. internal functions are now cached when instantiated.
Finally, the grep predefined function has left experimental status and is now fully functional.
Added the is_headless predefined function.
Added the is_command_line_mode predefined function.

26.03.2026
Improved debugging - it now uses a port system to communicate with the running process.
Added DepthGuard - the new way to control recursive overflow, preventing debugging from crashing due to YASS functions constantly calling themselves.

27.03.2026
Improved compiler performance by improving the Zenith Parsing Engine.
Made the introduction message more detailed.
ZPE-PM uses the precached predefined functions, similar to ZPEX.

28.03.2026
Added the overwrite predefined function. This function is used to print to the CLI and overwrite itself continuously.
ZPE now has static objects such as CLI and HTMLBuilder (the latter used to be an object you instantiate but has been moved to static objects).

29.03.2026
Added the new --enable_all_commands, to enable all commands on this instance of ZPE.

31.03.2026
Added the option for plugins to add custom static objects to ZPE.
Updated the changelog (at last!) so that every addition ends with a period.

-- Version 1.14.5 --

01.04.2026
This is last update for ZPE...April Fools!
Changed from binary search trees back to hash maps for method parameters.

02.04.2026
I know they didn't last long, but static objects have been removed and replaced with built-in modules.
Added the Math, System, HTMLBuilder, and CLI objects.

03.04.2026
Added the new module Cryptography
Moved base64_encode and base64_decode to the Data category of predefined functions.

04.04.2026
Added a ZPEX installer. ZPE will determine which installer to use. If it's the native install of ZPE, it will use the native installer. If it the Java version of ZPE, it will use the Java installer.
System::shutdown no longer accepts strings, but System constants instead. These constants are System::SHUTDOWN and System::RESTART.
Added the HIBERNATE, SLEEP and SHUTDOWN_ABORT constants.
Fixed an issue which occurred due to changes made in predefined functions that stopped the manual command from reading function information.
Added the ability to use the --man command to get information about a function within a module. Just type it as System::shutdown for example.
The AutoGUI object is now a module called Input.
Added the new scroll method to Input.
Added the DISABLED_MODULES property to ZPE.
Made some changes to the way in which the compiler stores data, ensuring all data is primitive.

05.04.2026
Changed the when-is construct to use IASTs rather than a map (how it was prior to 1.7.12). This improves performance slightly.
ZPE can now produce native binaries. This is done with -c file -o output --native flag.

06.04.2026
Improved the manual to now support module methods.
Added support for the new --json flag on the manual.

08.04.2026
Added the string_split_lines function.

16.04.2026
Added the list_get_or_default, list_get_or_exit, and list_get_or_error functions.
Added the map_get_or_default, map_get_or_exit, and map_get_or_error functions.
The open command on the Image object now supports web URLs.

22.04.2026
Added the new ZPE plugin vetting system to check for dangerous plugins. This is done with zpe --plugins pluginName.jar --vet
Added the new file cache system, where file loads will be cached. In the properties file, this is called USE_FILE_CACHE.
Added the file_get_lines predefined function.