diff options
| author | Drahflow <drahflow@gmx.de> | 2012-12-30 14:39:45 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2012-12-30 14:39:45 +0100 |
| commit | 047fb919e7a08c7daa5ec4581fc5ab8cf5f25a6f (patch) | |
| tree | 9e9fac15c1e2c0714467048ae52a90344b9f4522 | |
| parent | d74d19aee738ba60f584899e9530e9aa98845be2 (diff) | |
-, _, * now normal functions
| -rw-r--r-- | examples/working/arrays.ey | 2 | ||||
| -rw-r--r-- | examples/working/exec.ey | 2 | ||||
| -rw-r--r-- | examples/working/fib.ey | 6 | ||||
| -rw-r--r-- | examples/working/fold.ey | 2 | ||||
| -rw-r--r-- | examples/working/grep.ey | 4 | ||||
| -rw-r--r-- | examples/working/macro.ey | 18 | ||||
| -rw-r--r-- | examples/working/qsort.ey | 4 | ||||
| -rw-r--r-- | examples/working/scope.ey | 8 | ||||
| -rw-r--r-- | examples/working/stackops.ey | 3 | ||||
| -rw-r--r-- | interpreter/Elymas.pm | 57 | ||||
| -rw-r--r-- | interpreter/ElymasGlobal.pm | 39 |
11 files changed, 67 insertions, 78 deletions
diff --git a/examples/working/arrays.ey b/examples/working/arrays.ey index 2bf2431..4f314e2 100644 --- a/examples/working/arrays.ey +++ b/examples/working/arrays.ey @@ -23,7 +23,7 @@ -00 0 -01 * 7 eq test 1 -01 * 10 eq test -[ 1 2 3 ] _0 add +[ 1 2 3 ] _ add -000 0 -01 * 2 eq test 1 -01 * 4 eq test diff --git a/examples/working/exec.ey b/examples/working/exec.ey index a88ccae..6977e86 100644 --- a/examples/working/exec.ey +++ b/examples/working/exec.ey @@ -1,4 +1,4 @@ #!/usr/bin/env elymas -1 1 |dump *0 add dump +1 1 |dump -110 * add dump 4 3 { 1 add } rep dump diff --git a/examples/working/fib.ey b/examples/working/fib.ey index 96e8b38..ad4f38c 100644 --- a/examples/working/fib.ey +++ b/examples/working/fib.ey @@ -3,10 +3,10 @@ { ? * } /if deff { - _0 0 eq _1 1 eq add - { - 1 } + _ 0 eq -101 1 eq add + { -- 1 } { - _0 1 sub "fib" | * + _ 1 sub "fib" | * -01 2 sub "fib" | * add } diff --git a/examples/working/fold.ey b/examples/working/fold.ey index fd42f11..9ae19d5 100644 --- a/examples/working/fold.ey +++ b/examples/working/fold.ey @@ -14,4 +14,4 @@ _ |add fold dump _ |add foldshort dump _ |add enfold * dump -- +-- diff --git a/examples/working/grep.ey b/examples/working/grep.ey index 2c94847..eede7e8 100644 --- a/examples/working/grep.ey +++ b/examples/working/grep.ey @@ -1,5 +1,5 @@ { /p deff { - [ -01 { _ p { } { - } ? * } each ] + [ -01 { _ p { } { -- } ? * } each ] } } /engrep deff { engrep * } /grep deff @@ -13,7 +13,7 @@ } { _ a p { _ =r } { } ? * 1 add - } loop - + } loop -- r } /index deff diff --git a/examples/working/macro.ey b/examples/working/macro.ey index fdaf0cf..10c7d3b 100644 --- a/examples/working/macro.ey +++ b/examples/working/macro.ey @@ -6,19 +6,19 @@ { /f deff /x defv { x f } } quoted { } { * } ? * -} "}0" defq +} "}_" defq -5 { { dump }0 } * /dumpfive deff -5 { dump }0 /dumpfivetwo deff +5 { { dump }_ } * /dumpfive deff +5 { dump }_ /dumpfivetwo deff -7 dumpfive - -7 dumpfivetwo - +7 dumpfive -- +7 dumpfivetwo -- # import members of other objects into local scope { - "_" | "-021" | ".|" | "-01" | |deff + "_" | "021" | "-" | ".|" | "01" | "-" | |deff } /usef defq @@ -33,14 +33,14 @@ exe /walkelem deff { sys .out .writestr } /out deff - _ { { " " out } rep }0 /indent deff - { 2 add walkelem }0 /walk deff + _ { { " " out } rep }_ /indent deff + { 2 add walkelem }_ /walk deff _ code [ { indent [ "\"" -102 "\"\n" ] |out each } { indent _ sym _ out - "{" streq { 0 =cont |lol } { - } ? * + "{" streq { 0 =cont |lol } { -- } ? * "\n" out } { blk |walk each diff --git a/examples/working/qsort.ey b/examples/working/qsort.ey index c7bf93c..79e9f4c 100644 --- a/examples/working/qsort.ey +++ b/examples/working/qsort.ey @@ -14,8 +14,8 @@ } each store _ end a swap - _ 1 sub start -0101 lt { a qsort } { -- } ? * - 1 add end -1010 lt { a qsort } { -- } ? * + _ 1 sub start -0101 lt { a qsort } { -2 } ? * + 1 add end -1010 lt { a qsort } { -2 } ? * } /qsort deff { _ len _ 0 gt { 1 sub 0 -012 qsort } rep } /sort deff diff --git a/examples/working/scope.ey b/examples/working/scope.ey index b3d57dc..3d3a4a1 100644 --- a/examples/working/scope.ey +++ b/examples/working/scope.ey @@ -6,13 +6,13 @@ { "yes" dump } /c deff > -_00 .a dump - .b dump - .c +-000 .a dump + .b dump + .c < < "closure" /x defv { x } -> - /get deff > +> -- /get deff > .get dump diff --git a/examples/working/stackops.ey b/examples/working/stackops.ey new file mode 100644 index 0000000..6cd95af --- /dev/null +++ b/examples/working/stackops.ey @@ -0,0 +1,3 @@ +[ 1 2 3 ] dump +[ 1 2 3 -210 ] dump +[ 1 2 3 -012 ] dump diff --git a/interpreter/Elymas.pm b/interpreter/Elymas.pm index b58bffd..5938462 100644 --- a/interpreter/Elymas.pm +++ b/interpreter/Elymas.pm @@ -445,59 +445,6 @@ sub resolve { return $scope->{$name} if(exists $scope->{$name}); return resolve($scope->{' parent'}, $data, $name) if(exists $scope->{' parent'}); - - if($name =~ /^(_+)(\d*)$/s) { - my @spec = split //, $2; - @spec = (0) unless @spec; - - return [sub { - my ($data, $scope) = @_; - - my @new; - foreach my $i (@spec) { - die "Stack underflow" if @$data < $i + 1; - push @new, $data->[-$i - 1]; - } - push @$data, @new; - }, ['func', 'auto-created of ' . $name], 'active']; - } elsif($name =~ /^(-+)([0-9*]*)$/s) { - my $max = length($1) - 1; - my @spec = split //, $2; - $max = $_ > $max? $_: $max foreach grep { $_ ne '*' } @spec; - - return [sub { - my ($data, $scope) = @_; - - my @buffer; - foreach (0 .. $max) { - die "Stack underflow" unless @$data; - push @buffer, pop @$data; - } - - foreach my $i (@spec) { - if($i eq '*') { - execute($data, $scope); - } else { - push @$data, $buffer[$i]; - } - } - }, ['func', 'auto-created of ' . $name], 'active']; - } elsif($name =~ /^\*(\d*)$/s) { - my @spec = split //, $1; - - return [sub { - my ($data, $scope) = @_; - - my @buffer; - foreach my $i (@spec) { - die "Stack underflow" if @$data < $i + 2; - push @buffer, $data->[-$i - 2]; - } - execute($data, $scope); - push @$data, @buffer; - }, ['func', 'auto-created of ' . $name], 'active']; - } - return undef; } @@ -623,10 +570,10 @@ sub tokenize { } push @t, [$str, 'string']; - } elsif($line =~ /^([^a-zA-Z ]+)([a-zA-Z]+) +(.*)/s) { + } elsif($line =~ /^([^a-zA-Z0-9 ]+)([a-zA-Z0-9][^ ]*) +(.*)/s) { $line = "$1 $3"; push @t, [$2, 'string']; - } elsif($line =~ /^([a-zA-Z]+|[^a-zA-Z ]+) +(.*)/s) { + } elsif($line =~ /^([a-zA-Z0-9]+|[^a-zA-Z0-9 ]+) +(.*)/s) { $line = $2; push @t, [$1, 'tok']; } else { diff --git a/interpreter/ElymasGlobal.pm b/interpreter/ElymasGlobal.pm index 81da6f0..abd1f47 100644 --- a/interpreter/ElymasGlobal.pm +++ b/interpreter/ElymasGlobal.pm @@ -70,6 +70,45 @@ our $global = { my ($data, $scope) = @_; push @$data, [$quoted? 1: 0, 'int']; }, ['func', 'quoted'], 'active'], + '--' => [sub { + my ($data, $scope) = @_; + pop @$data; + }, ['func', '-'], 'active'], + '-' => [sub { + my ($data, $scope) = @_; + + my $spec = popString($data); + my $max = 0; + + my @spec = split //, $spec; + $max = $_ > $max? $_: $max foreach grep { $_ ne '*' } @spec; + + my @buffer; + foreach (0 .. $max) { + die "Stack underflow" unless @$data; + push @buffer, pop @$data; + } + + foreach my $i (@spec) { + if($i eq '*') { + execute($data, $scope); + } else { + push @$data, $buffer[$i]; + } + } + }, ['func', '-'], 'active'], + '_' => [sub { + my ($data, $scope) = @_; + + my $x = pop @$data or die "Stack underflow"; + push @$data, $x; + push @$data, $x; + }, ['func', '_'], 'active'], + '*' => [sub { + my ($data, $scope) = @_; + + execute($data, $scope); + }, ['func', '*'], 'active'], ';' => [sub { my ($data, $scope) = @_; |
