source files are always encoded in utf-8 identifiers for variables not special may include any unicode characters in groups Lu, Ll, Lt, Lm, Lo, Nd, as well as _ a token comprised only of digits is never treated as an identifier eight registers are available as variables special variables include >v (VVAR), >x (FTx), >y, >z, >c, ma (TMa), >mb, ... >ml, >0 (register 0), ... >7 operation summary: (register manipulation) set v x - set v to immediate (floating-point) value x copy d s - set d to contents of s swap v w - switch contents of v and w (is this actually useful?) (binary operators) add d v w - set d to v+w sub d v w - set d to v-w mul d v w - set d to v*w div d v w - set d to v/w mod d v w - set d to v%w polar r t x y - set r to hypot(y, x) and t to atan2(y, x) rect x y r t - set x to r*cos(t) and y to r*sin(t) pow d v w - set d to pow(v, w) atan2 d v w - set d to atan2(w, v) hypot d v w - set d to hypot(v, w) (ternary) spherical r t p x y z - set r to sqrt(x*x+y*y+z*z), t to atan2(y, x), and p to acos(z/sqrt(x*x+y*y+z*z)) rect3d x y z r t p - set x to r*cos(t)*sin(p), y to r*sin(t)*sin(p), and z to r*cos(p) fma d x y z - set d to x*y+z (unary) neg d v - d = -v acos d v - d = acos(v) asin d v - arcsine atan d v - arctangent cos d v - cosine cosh d v - hyperbolic cosine sin d v - sine sinh d v - hyperbolic sine tan d v - tangent tanh d v - hyperbolic tangent exp d v - exponential (e to the power of v) ln d v - natural logarithm sqrt d v - square root ceil d v - ceiling abs d v - absolute value floor d v - floor (shortcuts) addtoxy v w - add v to v * {v, w} into v * {u, v, w} into w ble v w n - v <= w bge v w n - v >= w blt v w n - v < w end - exit the function (randomness) randint d - set d to a random integer in [0, RAND_MAX] random d - set d to a random real in [0, 1) randintr d v w - set d to a random integer in [v, w] randomr d v w - set d to a random real in [v, w) it is guaranteed that for each operation, the assignment to the destination register(s) is the last thing to occur. particular dot directives include: .name - set the name of the variation; same rules as for identifiers .3d - indicate that the variation writes to FPx .dc - indicate that the variation writes to TC .vars {int | real | range | cyclic} [, ...] - list variables .privs {int | real | gauss} [= ] [...] - private vars .prep - indicate an init() method .case - use the following to the next .case or .calc as the calc() method when expr evaluates to true. a .calc section must exist if any .case sections do. .calc - indicate start of calc() method. this is used as the default case; if the interpreter does not understand expressions, it will treat all cases as false and therefore always use .calc. private gaussian variables may not be destination variables. new (approximately) gaussian-distributed random values automatically are assigned to them each iteration. .name spherivoid // variation name is spherivoid .3d // 3d variation .vars real spherivoid_radius 0 // like VAR_REAL(spherivoid_radius, 0.0) .calc // calculate method spherical >0 >1 >2 >x >y >z // set registers 0-2 to spherical coordinates of input add >0 >0 spherivoid_radius // add spherivoid_radius to radius in-place rect3d >0 >1 >2 >0 >1 >2 // convert spherical coordinates to rectangular in-place vaddtoxyz >0 >1 >2 // add coordinates scaled by >v to output end .name julian .vars int julian_power 2, real julian_dist 1 .privs int absn, real cn .prep // init() method abs absn julian_power div >0 julian_dist julian_power set >1 0.5 mul cn >0 >1 end .calc atan2 >0 >x >y set >1 0 randintr >1 >1 absn set >2 6.283185308 // 2pi fma >0 >1 >2 >0 // 2pi * randint + theta div >0 julian_power >0 // (2pi * randint + theta) / power mul >1 >x >x // sqr(x) fma >1 >y >y >1 // sqr(x) + sqr(y) pow >1 >1 cn // pow(sqr(x)+sqr(y), cn) mul >1 >1 >v // vvar * pow(sqr(x)+sqr(y), cn) rect >0 >1 >0 >1 addtoxy >0 >1 end