* 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, structure 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 initalised 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 NonExectuableFile 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