Difference between revisions of "LavishScript:Release Notes"
Jump to navigation
Jump to search
Line 30: | Line 30: | ||
- Atoms not added as part of script context (e.g. embedded scripts) are now correctly | - Atoms not added as part of script context (e.g. embedded scripts) are now correctly | ||
optimized | optimized | ||
+ | - Fixed crash when the current script ends during execution of an atom | ||
+ | - Added proper variable creation syntax, available inside or outside of functions. The | ||
+ | DeclareVariable command is still useful for dynamic creation of variables, but no | ||
+ | longer the preferable way to create variables. Variables are created in one of the | ||
+ | following forms: | ||
+ | * variable type name | ||
+ | * variable(scope) type name | ||
+ | * variable type name = Default | ||
+ | * variable(scope) type name = Default | ||
+ | Arrays can still be created by adding dimensions to the name, such as name[50]. Object | ||
+ | variables can still be declared with the "property" keyword, which uses the same syntax. | ||
- Added object types: | - Added object types: | ||
* index | * index | ||
Line 39: | Line 50: | ||
part of LavishScript, but with source still available as a module for an example) | part of LavishScript, but with source still available as a module for an example) | ||
- Added object type members: | - Added object type members: | ||
− | string point3f.XYZ | + | * string point3f.XYZ |
− | uint system.MemoryUsage | + | * uint system.MemoryUsage |
- Added commands: | - Added commands: | ||
* cp | * cp |
Revision as of 21:33, 3 April 2006
LavishScript Version 1.87 (c) 2004-2005 Lavish Software --------------------------------- 1.87 - LSModule v15 - point3f's "To Text" is now the same as point3f.XYZ - Fixed bug with whitepace when setting function or object property default values - Added internal support for object subtypes, for object types such as "collection" which is a collection *of* another object type. Object subtypes can be used for types that support it by appending a colon : and the name of the subtype, such as collection:int or collection:string. Subtypes may contain additional subtypes, meaning that collection:collection:string is a collection of collections of strings. Subtypes are not allowed by all object types -- only those that specifically support them. - Current Working Directory is now checked BEFORE the default folders for file search paths - Added memory usage to script profiling - QueuedCommands TLO now accepts a parameter to look for specific queued commands - mutablestring (string variable type) now operates on the utf8string class - Removed "noparse" command - Major optimizations to the LavishScript parser (faster command parsing speed). Complex aliases are temporarily unavailable as a result - Data sequences now get compiled when used with commands and control structures - Blech-based trigger system moved directly into LavishScript, instead of in individual LavishScript-enabled applications - Improved resolution of functions for Call command - Improved parser behavior for escaped quotes - Atoms not added as part of script context (e.g. embedded scripts) are now correctly optimized - Fixed crash when the current script ends during execution of an atom - Added proper variable creation syntax, available inside or outside of functions. The DeclareVariable command is still useful for dynamic creation of variables, but no longer the preferable way to create variables. Variables are created in one of the following forms: * variable type name * variable(scope) type name * variable type name = Default * variable(scope) type name = Default Arrays can still be created by adding dimensions to the name, such as name[50]. Object variables can still be declared with the "property" keyword, which uses the same syntax. - Added object types: * index * collection * queue * stack * set (note: collection, queue and stack are from the ExtTypes module, which is now directly part of LavishScript, but with source still available as a module for an example) - Added object type members: * string point3f.XYZ * uint system.MemoryUsage - Added commands: * cp 1.86 - math.Rand now supports formulae - Old objectdef "members" have been renamed to "properties". All member variable declarations should now use the property keyword, isntead of member. - Objectdef member and method declarations can now be used to create member and method atoms, used like members and methods of any other object. Note that properties will override members of the same name. - Objectdefs now support constructor and deconstructor methods, named Initialize and Shutdown, which are automatically executed if available when an object is created. Parameters can be passed to Initialize by adding extra parameters in the DeclareVariable line, such as 'DeclareVariable MyObject myobject param1 param2 param3'. Due to this flexibility, **Initialize routines of inherited types are NOT automatically executed, and should be explicitly executed by the descendant object type.** This can be done by casting This to the given type, such as 'This(myinheritedtype):Initialize[a,b,c]'. Shutdown routines ARE automatically executed in order of inheritance from the descendant up to the base type, when the object leaves scope or is otherwise deleted. - Objectdefs now support a ToText member, which is applied when a data sequence ends with an object of that type. The return value of the member will be the resulting text. - "object" scope is now available to objectdef members and methods - Casting a variable declared as an objectdef type to "type" will now give the name of the objectdef instead of "scriptobject" (note that casting to type has always given the type of the object cast) - Added optional parameter to "This" when used with script-defined objects. This[parent] will be the same as casting the object to its inherited type, if any. This[parent]:Initialize will automatically execute the parent type's Initialize method, regardless of the parent type's name. - Added data type members: string script.ExecuteAtom[name,...] string lavishscript.ExecuteAtom[name,...] ** These versions are in addition to the existing methods, which do not allow return values. Members do. filepath lavishscript.Executable - Added data type methods: file:Flush - Added file system commands: rename <old filename> <new filename> rm <directory> rmdir <filename> - Fixed bug in calculator that caused a minus to be treated as a negation operator instead of subtraction when following a parenthesis and a space. For example, "18 - 1" was 17, but "(18) - 1" was -1. - Fixed small memory leak in function calls - Functions (and atoms) now support variable numbers of arguments. The final parameter in the function definition can use ... as the type, and any remaining parameters passed to the function when called will be placed in an array of strings with the name given. For example: function vararg(string Something, ... Params) { ; Params is an array echo ${Params.Size} extra arguments } function main() { call vararg "This is the normal parameter 'Something'" These will be put in Params } - Fixed crash in filelist.File 1.85 - Fixed bugs in complex aliases - script.Variable now supports arrays 1.84 - Added "variablecase" to switches. If no normal case matches, each variable case will be processed and checked for a match, from top to bottom. If no variable case exists or matches, the flow continues to the "default" if it exists, otherwise skipping past the switch. - Fixed bug that prevented logical AND from being properly optimized in if and while statements - File system operations now support UTF-8 filenames 1.83 - The variable datatype now works correctly for arrays - mkdir command should now work properly with UTF-8 1.82 - The Variable Top-Level Object now supports arrays 1.81 - LSModule v14 - Fixed crash in embedded script errors - FromString and ToString functions in LSTypeDefinition have been changed to FromText and ToText to reduce confusion with the string datatype. The old names are deprecated, and should be changed in your code - Various enumeration functions have been added - LavishScript events added: Alias Added Alias Removed Command Added Command Removed Datatype Added Datatype Removed Top-Level Object Added Top-Level Object Removed 1.80 - Fixed script-defined object bug with inherited functions - Fixed crash on division or modulus by zero 1.79 - Added data type members: float math.DistancePointLine[x,y,ax,ay,bx,by] 1.78 - Optimized command and alias resolution - Fixed LSType command crash - Fixed transference of This object in function calls 1.77 - LSModule v13 - LSTypeDefinition has changed a bit. The changes make it possible to modify an existing data type by adding or removing methods and/or members. This slightly changes the development of types that use inheritance. To do so, overriding the new "GetInheritedMember" and "GetInheritedMethod" functions will be required. We have provided convenience macros INHERITDIRECT and INHERITINDIRECT to do this easily for single-inheritance. Multiple inheritance must be done the old-fashioned way. For types that require no special conversion, inheritance can be implemented by using the INHERITDIRECT macro in your type definition class, like so: INHERITDIRECT(pIntType); For types that require special conversion, inheritance can be implemented by using the INHERITINDIRECT macro in your type definition class, like so: INHERITINDIRECT(pStringType,Temp.Ptr=((string*)ObjectData.Ptr)->c_str(),((string*)ObjectData.Ptr)->assign(Temp.CharPtr)) Note that the second parameter of the macro converts from the current type to the inherited type. The third parameter converts from the inherited type back to the current type. In most cases, the third parameter may simply be 0. Converting back is ONLY necessary when inherited methods can change the value stored by the object. For example, if the object is a pointer to some other type being inherited (e.g. a boolptr, pointing to a bool), then an inherited method of bool operates only on a temporary copy of the data *** OLD INHERITANCE WILL NOT WORK AND SHOULD BE REMOVED FROM YOUR GETMEMBER AND GETMETHOD FUNCTIONS! *** Additionally, the efficiency of the old GetMember/GetMethod functions is slightly lessened. They are guaranteed to have a valid member when called, so determining if the member is valid can be removed. Any GetMember/GetMethod functions should be replaced with the new version, which uses PLSTYPEMEMBER and PLSTYPEMETHOD directly instead of char * to pass the member or method information. Without overriding these new versions of the function, the old GetMember/GetMethod will be called. - Fixed problem with #include not using the current input file's directory by default - Fixed script-defined object inheritance 1.76 - Relevant parts of LavishScript are now converted to use UTF-8 instead of ASCII. 1.75 - Fixed order of operation issue in short circuiting 1.74 - Fixed issue with elseif 1.73 - Fixed issue with short circuiting 1.72 - Fixed issue with while loops and the new short circuiting functionality 1.71 - LSModule v12 - Each LavishScript data type now keeps a record of variables created with that type. When the type is removed, all of those variables are now deleted automatically to prevent crashes (though scripts containing these variables may not function correctly, they should not subsequently crash) - If and While control structures (all forms) now support short circuiting. This is an internal optimization that automatically breaks conditions containing logical AND or OR operators into separate portions, such that data sequences on the right side of a && or || are not processed if the left side of the && is 0 or the left side of the || is non-zero. This means that developers no longer need to manually split these control structures into several pieces to prevent data sequences from being processed when unnecessary. - Fixed string.Replace - mkdir command is now properly active - Added data types: filelist filelistentry - math.Atan[#,#] now performs atan2 - Fixed filepath:Set[new path] - Added data type methods: filepath:MakeSubdirectory[subdir] 1.70 - Added commands: mkdir 1.69 - Fixed script:End used in atexit 1.68 - Call is now valid within atoms 1.67 - LSModule v11 - Fixed #includeoptional, which wasnt acting very optional - Improved script context switching. Scripts that take an excessive amount of time will be interrupted. - "atexit" is now atomic. If it is defined as a function, it will automatically be converted to an atom. EndScript and script:End now complete in the current frame, rather than a following frame. - Escaping strings (with string.Escape for example) now includes escaping data sequences - Methods used as commands should no longer following text, assuming the command list character (;) is used - Added a script profiling system. When enabled, each line will be profiled and information will be stored about number of executions and total time spent. This can be used to determine which parts of a script should be targeted for optimization. - Added -time switch to the Execute command - Scripts can now be explicitly set to not provide explicit debugging information. With this set, script stack dumps will be crippled to not show the function name or command, and some other information such as profiling will also be unavailable. - Added events system. A LavishScript event is a list of atoms that will be executed in arbitrary order, when the event itself is executed. Executing an event may involve passing a set of parameters and a "This" object, which in turn will be passed to each atom. - Added datatypes: event - Added Top-Level Object forms: event Event[name] event Event[#] - Added datatype members and methods: string lavishscript.LSModule bool script.Profiling bool script.AllowDebug script:EnableProfiling script:DisableProfiling script:DisableDebugging script:DumpStack script:DumpProfiling lavishscript:RegisterEvent[name] 1.66 - Fixed rgb members Red, Green and Blue (they were reversed) 1.65 - Fixed crash issue with atoms that result in a script error 1.64 - LSModule v9 - Updated Atoms internally to allow for return values 1.63 - Added "ElseIf" to the If..Else control structure. - New "atom" concept added to the engine. An atom is basically a script function that executes as if it were a single command. It is allowed to have control structures, but NOT "wait" commands and cannot call a function (but can execute other atoms). Atoms do not need to be (but can be) associated with a script. - Added commands: * ExecuteAtom * AddAtom * DeleteAtom - Added data type members and methods: * script:ExecuteAtom[name] - \ at the end of a line now assumes the \ should be a \, instead of escaping the NULL terminator for the command string (i.e. \ at the end of a line no longer does weird things) 1.62 - Fixed bugs with atexit not executing sometimes due to recent optimizations - Added data type members: filepath lavishscript.HomeDirectory - Fixed bug with multiline ANSI-C comments 1.61 - Current Working Directory for scripts now default to the script's path. This means interface files, other scripts or other files can be used relative to the script's path instead of having to hard-code a path into the script - Fixed crash error with Script:End in such used in atexit 1.60 - LSModule v7 - Optimized script flow. The following changes are a direct result: * EndSwitch is now deprecated. Switch now goes by the code block following the command * While loops can be created without Do by putting a command or code block on the following line * Certain types of flow errors are now detected before the script executes 1.55 - Fixed issues with arrays - Added "object" scope in DeclareVariable 1.54 - Fixed stability issue with 1.53 1.53 - Methods used as commands will now result in script errors where appropriate (such as where there is no member or method to match an access) - Function parameters and script object members can now supply default values using "=", such as function main(int Size=10) and member int Size=10 1.52 - Fixed issue with global variable auto-deletion 1.51 - Fixed an issue with variable existence checking that checked ALL available scopes (e.g. global, script and local) instead of just the current scope (e.g. local) - Declaring a global variable twice will now destroy the first and successfully create the new one - DeleteVariable no longer accepts "* global", but still accepts the name of a single script- or global-scope variable - When global variables are declared in a script, the script will now automatically clean them up when it ends. If you wish to keep global variables AFTER the script has ended, use "globalkeep" as the scope name (only valid in scripts) 1.50 - Added "OSExecute" command, which can be used to run programs and such - "variable" datatype no longer has its own members, but now accepts the name of an in-scope variable upon variable creation. For example: declare MyVariable int 1 declare Test variable MyVariable ${Test} is equal to 1 This CAN be used to pass local variables to functions by reference. Please report any issues with using referenced variables - Scripts can now create objects which can have members and functions (but not methods) - Added datatype members: * bool script.Paused - Added datatype methods: * script:Pause * script:Resume - Declaring variables twice within the same scope is now detected and considered an error 1.47 - LSModule v6 - Added datatypes: * uint, uintptr, int64, int64ptr, filepath, file, buffer Note: LavishScript is currently 32-bit. Extensions to LavishScript (such as LSModules, Inner Space extensions or Fury plugins) cannot directly use int64, they must use int64ptr. int64 is a dummy type for creating variables, which gets redirected to int64ptr. - Added data type members: * uint int.Unsigned * int uint.Signed * int64ptr math.Calc64 - Things that use or display file paths in LavishScript should as of now be using / so that escaping is unnecessary. Please report any instances where this is not true - system.CurrentDirectory, script.CurrentDirectory and lavishscript.CurrentDirectory now use the filepath type - Added WaitScript command, available only to scripts. This is logically the same as RunScript, followed by a wait until the script ends - DataParse is now updated for secure buffers 1.46 - Fixed issue with temporary buffer system 1.45 - LSModule v5 - LSType now has a new virtual function so that data types can automatically use to cause DeclareVariable to use a different type instead (for example, "string" returns the mutablestring type). Return 0 to prevent variables from being created with a given type. - Implemented temporary buffer system which can be used in the object system (TLOs and data types). This corrects some rare string-related issues. 1.44 - Fixed a sometimes convenient bug with absolute file paths working as relative paths 1.43 - Fixed issue with syntactically valid methods used as commands causing errant "Error parsing data sequence" messages 1.42 - Fixed issue with scripts ending themselves via EndScript or Script:End 1.41 - Fixed crash issue with triggers + EndScript during "atexit" 1.40 - EndScript will now forcefully end "atexit" execution 1.39 - Fixed crash when "main" function of script used an illegally-named parameter 1.38 - LSModule v4 1.37 - Math.Rand is now seeded differently 1.36 - LSModule v3 - Fixed crash bugs with string.Escape and string.EscapeQuotes - Added data type members: * string.Replace[character,with,...] * script:QueueCommand[command] - More complex aliases are now supported, but still work like before if the new features are not used. 1.35 * Fixed EndScript command requiring a full path under some conditions 1.34 - Added Top-Level Objects: * int Select[value,...] 1.33 - Fixed float:Inc and float:Dec when not using indices - Added data type members: * float.Ceil * float.Round - Fixed EndScript command so using a full path and/or file extension is allowed 1.32 - Added data type methods: * string.EscapeQuotes * string.Escape - Scripts missing a closing brace } after a function will report the error and not load 1.31 - Fixed issue with recursive functions 1.30 - Fixed Continue command - Added per-script squelching in addition to the existing global squelching - Added data type methods: * script:Squelch * script:Unsquelch - Commands VarCalc, VarData and VarSet, previously marked deprecated have been removed 1.29 - Added data type methods: * rgb:Set[rrggbb] - rgb.Red, rgb.Green, rgb.Blue are now byteptr type instead of int type, thus allowing rgb.Red:Set[#] and so on - Added Top-Level Objects: * int Execute[command] 1.28 - Added #includeoptional preprocessor directive. This will include a file if it exists, otherwise continue as if it never saw anything. 1.27 - Fixed script.RunningTime - Added script.CurrentDirectory - All functionality based on LavishScript CurrentDirectory now automatically uses per-script CurrentDirectory if one is running 1.26 - Fixed issue with modules not unloading correctly 1.25 - Fixed issue with aliases not being applied correctly 1.24 - Added data type members: * string int.LeadingZeroes[desired length] * int script.RunningTime 1.23 - Switch, when used with no parameters, will now look for an empty "case" line. Previously, it would show the syntax, and execute the first case. 1.22 - Removed \ parsing from the Preprocessor (this was not supposed to be there, and inconveniently required double escaping in scripts) 1.21 - Added data type members: * variable script.Variable[name] - Restructured variable data type. Now acts exactly like the variable it views, but with Name and Type members. 1.20 - Added Top-Level Objects: * script Script * script Script[name] - Preprocessor #include now checks directory of current script file first - Empty commands no longer resolve to the first command alphabetically - ExecuteQueued will now accept an optional parameter for a case-sensitive substring search to execute the next command in line that contains the given substring - VarSet, VarCalc and VarData will now give a "deprecated" warning message. Please switch to using the :Set method for these variables Examples: "VarCalc x ${x}+1" becomes "x:Inc" or "x:Set[${x}+1]" "VarData x y" becomes "x:Set[${y}]" "VarSet x ${y}" becomes "x:Set[${y}]" - Added "mutablestring" datatype, which inherits string. This type adds methods which should only be used on variables (like mutablestring:Set). Any variables declared with the "string" type will automatically use the "mutablestring" type (no changes to existing scripts or extensions are generally necessary) - To promote general simplicity, the I/O redirection operators < | > and >> have been removed. Subsequently, most mathematical formulae no longer need to be quoted (e.g. If and While condition expressions) - Added command to replace output redirection operator: Redirect [-append] <filename> <command> - Scripts can now use ANSI-C comments which look like /* this */ (but C++ programmers dont get too excited, the non-ANSI // comments will not be added) 1.19 - LSModule v2 1.18 - Updated "time" type with new methods and members, changed the type of some of its members to pointers, and allowed "time" variables to be set by a timestamp (standard unix timestamp), to make time-based calculations involving dates and times easier 1.17 - Fixed bugs with modules - Added "exists" type, which always gives TRUE - Added auto-execution of command file and script named "LavishScript" on startup 1.16 - Fixed Calculation issues - Fixed variable casting - Implemented current working directory independent of Windows. If something still goes to the game directory by default let us know. - Redirected input/output uses the LavishScript current working directory - Added data type members: * string system.CurrentDirectory * string lavishscript.CurrentDirectory * int lavishscript.RunningTime - New command: cd 1.14 - Fixed bug in point3f type - Added column rendering to list functions 1.13 - Fixed several scripting bugs 1.12 - Fixed bug in script parsing when function parameters had no spacing 1.11 - New Modules system provides product-independent system for adding LavishScript commands, Top-Level objects and data types - Added "Modules" command Syntax: Modules -list|-add <name>|-remove <name>|-require <name> The -require option is meant for use in scripts -- if the module is not and cannot be loaded, the script ends with an error message.