Bug fixes:
- Variables always get initialized to a default value when the scope
they are defined is entered, unless the script initializes them at
time of declaration. The following two declarations are therefore now
always equivalent (and so on for all other datatypes):
int a;
int a = 0;
- Float variables now correctly coerce into strings when you are trying
to concatenate strings (for the argument to print, for example).
- The "exit" command, just like pressing the "abort" button, will stop a
script immediately, cleanly unwinding and cease execution.
New functions:
string url_encode( string text );
string url_decode( string text );
int random( int range );
int round( float arg );
int truncate( float arg );
int floor( float arg );
int ceil( float arg );
int current_mind_control_level();
New features:
- Unary minus. You can now say:
x = -1;
rather than having to workaround the lack by saying:
x = 0 - 1;
- ASH will only import a particular file once during script parsing. You
can safely import library files as often as you want and ASH will
silently ignore the second and subsequent attempts to import.
Debugging:
- If you turn on the debug log, ASH will verbosely trace the execution
of your script. I attempted to make it self explanatory to anybody
capable of writing a script...
Internal efficiency improvements. Warning: the following is quite technical, so
don't be intimidated, but they represent a huge amount of code-whackage, so
I feel like taking credit.
- Former linked-list implementations have been replaced with standard
"library" list types. This takes the pointer to the elements out of
the elements themselves and moves it to the list implementation, so
there is no memory benefit as a result, but it frees elements to
appear on more than one list, which does reduce memory usage by
allowing sharing of common constants, like "true" and "false".
Additionally, each "library" implementation provides some efficiency
improvements over the simple linked list used before"
1) Symbol tables of variables and functions are now in a SortedListModel.
Add element: O(log n) rather than O
Find element: O(log n) rather than O
Count elements: O(1) rather than O
2) Sequential lists are now in an ArrayList
Add element: O(1) rather than O
Find element: still O
Count elements: O(1) rather than O
- Symbol table of built-in functions is created only the first time you
execute an ASH script, rather than every time you do so.
Lower dynamic memory usage, better performance
- Each built-in function is now a Method, rather than code in a big
if-then-else tree of function name comparisons. The Method is found
and associated with the symbol when the built-in function symbol table
is created.
No execution time required to find method, compared to O
string
comparisons.
Improved maintainability: trivial to add new built-in functions.
- Variables always get initialized to a default value when the scope
they are defined is entered, unless the script initializes them at
time of declaration. The following two declarations are therefore now
always equivalent (and so on for all other datatypes):
int a;
int a = 0;
- Float variables now correctly coerce into strings when you are trying
to concatenate strings (for the argument to print, for example).
- The "exit" command, just like pressing the "abort" button, will stop a
script immediately, cleanly unwinding and cease execution.
New functions:
string url_encode( string text );
string url_decode( string text );
int random( int range );
int round( float arg );
int truncate( float arg );
int floor( float arg );
int ceil( float arg );
int current_mind_control_level();
New features:
- Unary minus. You can now say:
x = -1;
rather than having to workaround the lack by saying:
x = 0 - 1;
- ASH will only import a particular file once during script parsing. You
can safely import library files as often as you want and ASH will
silently ignore the second and subsequent attempts to import.
Debugging:
- If you turn on the debug log, ASH will verbosely trace the execution
of your script. I attempted to make it self explanatory to anybody
capable of writing a script...
Internal efficiency improvements. Warning: the following is quite technical, so
don't be intimidated, but they represent a huge amount of code-whackage, so
I feel like taking credit.

- Former linked-list implementations have been replaced with standard
"library" list types. This takes the pointer to the elements out of
the elements themselves and moves it to the list implementation, so
there is no memory benefit as a result, but it frees elements to
appear on more than one list, which does reduce memory usage by
allowing sharing of common constants, like "true" and "false".
Additionally, each "library" implementation provides some efficiency
improvements over the simple linked list used before"
1) Symbol tables of variables and functions are now in a SortedListModel.
Add element: O(log n) rather than O

Find element: O(log n) rather than O

Count elements: O(1) rather than O

2) Sequential lists are now in an ArrayList
Add element: O(1) rather than O

Find element: still O

Count elements: O(1) rather than O

- Symbol table of built-in functions is created only the first time you
execute an ASH script, rather than every time you do so.
Lower dynamic memory usage, better performance
- Each built-in function is now a Method, rather than code in a big
if-then-else tree of function name comparisons. The Method is found
and associated with the symbol when the built-in function symbol table
is created.
No execution time required to find method, compared to O

comparisons.
Improved maintainability: trivial to add new built-in functions.