RosettaCodeData/Lang/Evaldraw/00-LANG.txt
2023-09-01 09:35:06 -07:00

102 lines
No EOL
4.4 KiB
Text

{{language
|exec=machine
|gc=no
|safety=unsafe
|parampass=value
|checking=static
|strength=weak
|tags=c
}}{{language programming paradigm|Imperative}}
'''EVALDRAW''' is a quirky little programming tool that can be used to make small applications and games, or even do 1D, 2D or 3D graphs, or create custom musical instruments.
Evaldraw is technically a tool and not the language, however, since RSCRIPT and Evaldraw are tied together, we can consider Evaldraw a programming language in itself. From this point, this article will refer to the capabilities of RSCRIPT and Evaldraw together.
==Compiler modes==
* '''EVAL''' the initially bundled compiler, developed by Ken Silverman. Had only doubles and arrays of doubles.
* '''RSCRIPT''' added in 2010 and created by Robert Rodgers. Added support for structs, making entities to handle. Easier to translate to C.
==Overview==
Evaldraw has syntax similar to C.
===Curly Braces===
EVALDRAW supports grouping multiple statements in curly braces. They are not needed for single statements.
===Semicolons===
All statements, except for the last statement in a function must end with a semicolon;
===Functions===
Functions all return an implicit double value from the last statement in the function.
Parameters passed to functions can be doubles, arrays or structs.
===Statements===
The following statements are supported:
* IF and IF-ELSE (but no SWITCH-case)
* Loop constructs such as DO{ codeblock }WHILE(condition); WHILE(cond){ block } and the FOR-loop as in C.
* goto label and label: declaration similar to C.
* a RETURN statement can at any point in a function return a floating point number. The last value is implicitly returned.
* BREAK and CONTINUE statements. Loops can be exited with BREAK, or remainder of code body can be skipped with CONTINUE.
* ENUMs allow the programmer to give numerical constants names. Dependencies between enum values are possible, allowing the programmer to make one enum a calculation based on previous enum values.
* Variables can be declared automatically on the local stack, or using the STATIC modifier to make a variable global.
===Case insensitive===
All names and keywords are case insensitive. This can create some confusion when porting from- or to C.
===All you need is 64-bit float===
All variables, also those declared in structs are double. If no type is supplied, double is assumed.
All functions return a double.
===Arrays===
Arrays that are power of two are wrapped, non power-of-two arrays set index zero if accessed out of bounds.
For example, if we define static xcoords[4]; and try to access xcoords[5] we the returned value is at index 5%4 which is xcoords[1].
===Structs===
Structs can be declared and be passed as function parameters.
A struct may doubles, arrays of doubles and other structs.
For example struct vec{x,y,z;}; defines a struct with 3 fields.
struct boid_t{ vec pos; vec dir; } defines a struct that contains substructs pos and dir.
===Pass by value or pass by ref===
Doubles are passed by value, but can be passed by ref by prefixing a & symbol.
All other variables, arrays and structs are passed by ref.
===Builtins===
There are many built in functions.
The EVAL and RSCRIPT compiler modes support the following 1-param functions:
* ABS - gives the absolute value. Same as fabs in C.
* ACOS - arcos in radians
* ASIN - arsin in radians
* ATAN - arctan in radians
* ATN - alias for atan
* CEIL - round a value up to nearest integer.
* COS - cosine in radians
* EXP - raise Eulers number to some power. EXP(1) = 2.718281
* FABS - alias for ABS
* FACT - factorial. FACT(5) = 5!
* FLOOR - round a value down to nearest integer.
* INT - different from floor, truncates (removes decimals).
* LOG - returns the natural logarithm of x. LOG(x) = ln(x)
* SGN - returns the sign of a number. -1, 0 or +1
* SIN - sine in radians
* SQRT - square root
* TAN - tan in radians
* UNIT - returns the unit function of x. Returns 0.0 for x<0, 0.5 for x==0 and 1.0 for x>0.
And the following two param functions:
* ATAN2(x,y) - gives angle in radians from positive x-axis to some point x,y.
* FADD - eval and rscript compatibility.
* FMOD - alternative to modulus % operator.
* LOG(x,b) - return log of x with base b.
* MIN(a,b) - return smallest
* MAX(a,b) - return largest
* POW(a,b) - raise a to power b
There is no concept of include statements or libraries. It is assumed evaldraw programs are small scripts to try out ideas that later will be integrated into a professional programming language such as C.