aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2012-12-30 14:39:45 +0100
committerDrahflow <drahflow@gmx.de>2012-12-30 14:39:45 +0100
commit047fb919e7a08c7daa5ec4581fc5ab8cf5f25a6f (patch)
tree9e9fac15c1e2c0714467048ae52a90344b9f4522
parentd74d19aee738ba60f584899e9530e9aa98845be2 (diff)
-, _, * now normal functions
-rw-r--r--examples/working/arrays.ey2
-rw-r--r--examples/working/exec.ey2
-rw-r--r--examples/working/fib.ey6
-rw-r--r--examples/working/fold.ey2
-rw-r--r--examples/working/grep.ey4
-rw-r--r--examples/working/macro.ey18
-rw-r--r--examples/working/qsort.ey4
-rw-r--r--examples/working/scope.ey8
-rw-r--r--examples/working/stackops.ey3
-rw-r--r--interpreter/Elymas.pm57
-rw-r--r--interpreter/ElymasGlobal.pm39
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) = @_;