]> git.mxchange.org Git - simgear.git/commit
Sync with Nasal upstream (Melchior already had a chance to test this,
authorandy <andy>
Fri, 26 Sep 2008 18:22:12 +0000 (18:22 +0000)
committerandy <andy>
Fri, 26 Sep 2008 18:22:12 +0000 (18:22 +0000)
commitdd1ea541ecc4403bcea2ca8c60c03971d1f4338f
tree82688098bc6c91275725dcf8ac7310128a4ba4e8
parent19aac5b14c5d5adcb56009f0f5dbe3bfe7adc4a4
Sync with Nasal upstream (Melchior already had a chance to test this,
so hopefully not too much breaks).  New syntax features:

1. Call-by-name function arguments.  You can specify a hash literal in
place of ordered function arguments, and it will become the local
variable namespace for the called function, making functions with many
arguments more readable.  Ex:

   view_manager.lookat(heading:180, pitch:20, roll:0, x:X0, y:Y0, z:Z0,
                       time:now, fov:55);

Declared arguments are checked and defaulted as would be expected:
it's an error if you fail to pass a value for an undefaulted argument,
missing default arguments get assigned, and any rest parameter
(e.g. "func(a,b=2,rest...){}") will be assigned with an empty vector.

2. Vector slicing.  Vectors (lists) can now be created from others
using an ordered list of indexes and ranges.  For example:

   var v1 = ["a","b","c","d","e"]

   var v2 = v1[3,2];   # == ["d","c"];
   var v3 = v1[1:3];   # i.e. range from 1 to 3: ["b","c","d"];
   var v4 = v1[1:];    # no value means "to the end": ["b","c","d","e"]
   var i = 2;
   var v5 = v1[i];     # runtime expressions are fine: ["c"]
   var v6 = v1[-2,-1]; # negative indexes are relative to end: ["d","e"]

The range values can be computed at runtime (e.g. i=1; v5=v1[i:]).
Negative indices work the same way the do with the vector functions
(-1 is the last element, -2 is 2nd to last, etc...).

3. Multi-assignment expressions.  You can assign more than one
variable (or lvalue) at a time by putting them in a parenthesized
list:

   (var a, var b) = (1, 2);
   var (a, b) = (1, 2);               # Shorthand for (var a, var b)
   (var a, v[0], obj.field) = (1,2,3) # Any assignable lvalue works

   var color = [1, 1, 0.5];
   var (r, g, b) = color;  # works with runtime vectors too
19 files changed:
simgear/nasal/bitslib.c
simgear/nasal/code.c
simgear/nasal/code.h
simgear/nasal/codegen.c
simgear/nasal/data.h
simgear/nasal/gc.c
simgear/nasal/hash.c
simgear/nasal/iolib.c
simgear/nasal/lex.c
simgear/nasal/lib.c
simgear/nasal/misc.c
simgear/nasal/naref.h
simgear/nasal/nasal.h
simgear/nasal/parse.c
simgear/nasal/parse.h
simgear/nasal/string.c
simgear/nasal/threadlib.c
simgear/nasal/utf8lib.c
simgear/nasal/vector.c