diff options
-rw-r--r-- | README.md | 4 | ||||
-rw-r--r-- | meta.rip | 64 | ||||
-rw-r--r-- | rip.hs | 4 | ||||
-rw-r--r-- | stdlib.rip | 14 | ||||
-rw-r--r-- | test.rip | 4 |
5 files changed, 84 insertions, 6 deletions
@@ -9,8 +9,8 @@ All stack items are signed bigints. - `D`: duplicate - `i`: increment - `d`: decrement -- `r`: pops the number of items to rotate anti-clockwise -- `R`: pops the number of items to rotate clockwise +- `r`: pops the number of items to rotate anti-clockwise ("insert") +- `R`: pops the number of items to rotate clockwise ("extract") - `l`: push length of stack (before this push) - `a` `s` `m` `q` `M` `p`: `+` `-` `*` `/` `%` `^` (add, subtract, multiply, quotient (integer), modulo, power) - `G` `L` `E`: greater, less, equal; booleans are 1 and 0, as you expect diff --git a/meta.rip b/meta.rip new file mode 100644 index 0000000..9f5107b --- /dev/null +++ b/meta.rip @@ -0,0 +1,64 @@ +#<stdlib.rip> +<varinit> + +'l 0 <varstore> 0I[stack length storage] +F<add_l>['l<varhaulup>3Ra<varstore>] +F<sub_l>['l<varhaulup>3Rs<varstore>] +F<inc_l>[1<add_l>] +F<dec_l>[1<sub_l>] +F<get_l>['l<varget>] + +0I[executes a piece of rip code, potentially recursively calling itself] +0I[TODO: [], <>, 'c, #<>, IWCwtcF$] +F<execrip>[ + DW[ + D<strlast>S<strinit>S + DD'0LnS'9GnmI[ 0I[0-9] + '0sS + <inc_l> + 0] + D'PEI[P SP <dec_l> 0] + D'SEI[P 3RS 0] + D'DEI[P SD3R <inc_l> 0] + D'iEI[P SiS 0] + D'dEI[P SdS 0] + D'lEI[P <get_l>S 0] + D'rEI[P lr r lR 0] + D'REI[P lr R lR 0] + D'aEI[P 3raS <dec_l> 0] + D'sEI[P 3rsS <dec_l> 0] + D'mEI[P 3rmS <dec_l> 0] + D'qEI[P 3rqS <dec_l> 0] + D'MEI[P 3rMS <dec_l> 0] + D'pEI[P 3rpS <dec_l> 0] + D'GEI[P 3rGS <dec_l> 0] + D'LEI[P 3rLS <dec_l> 0] + D'EEI[P 3rES <dec_l> 0] + D'nEI[P SnS 0] + D'oEI[P So <dec_l> 0] + D'OEI[P SO <dec_l> 0] + D'gEI[P gS <inc_l> 0] + D''EI[P D<strlast> S <strinit> 0] + D<isspace>I[P 0] + DI[ + 'ro 'io 'po ':o ' o $ P + 0] + P + D] +] + +0I[pushes whether argument is space, tab or newline] +F<isspace>[ + D' ESD9ES9iEaann +] + + +0I[Read all the code in a string] +0 +gDiW[ + <strpush> +gDi] +P + +<strrev> +<execrip> @@ -19,7 +19,7 @@ type Stackelem = Integer c_ripmode :: Bool -c_ripmode = True +c_ripmode = False c_debugmode :: Bool c_debugmode = False @@ -332,7 +332,7 @@ rip' code@(x:xs) fns conns st = do '\'' -> rip' (tail xs) fns conns $ ordI (head xs) : st '$' -> do - (putStrLn . intercalate " " . map show . reverse) st + putStrLn $ '[' : ((intercalate " " . map show . reverse) st) ++ "]" rip' xs fns conns st c | isSpace c -> @@ -8,6 +8,16 @@ F<strprint>[ PP ] +0I[gets last character of string; destructive] +F<strlast>[ + 28pM +] + +0I[drops last character of string; destructive] +F<strinit>[ + 28pq +] + 0I[takes string char; returns string+char] F<strpush>[ S28pma @@ -61,8 +71,8 @@ F<varinit>[ 0lr 0lr 0lr 0I[guard] ] -0I[INTERNAL FUNCTION - hauls variable by name in argument to top of stack; pushes 0 0 if non-existent] +0I[hauls variable by name in argument to top of stack (result: name value); + pushes 0 0 if non-existent] F<varhaulup>[ 00 0I[guard] lRlR diff --git a/test.rip b/test.rip new file mode 100644 index 0000000..8e74f98 --- /dev/null +++ b/test.rip @@ -0,0 +1,4 @@ +1DO '+o +2DO '=o +aO +9io |