rslt ← {eval←1} ##.lisp expr ⍝ Evaluator for a subset of Scheme. From Nick Nikolov, this function evaluates character vector [expr], which is an expression written in a subset of the Scheme language. Special forms: lambda (alias \) quote cond else A small set of primitive functions is provided. This can be easily extended: + sum - difference * product = equal write display using ⎕← If optional left argument [eval] is set to 0, [lisp] returns the parse tree prior to evaluation. Technical note: Roughly, it follows the structure of the metacircular evaluator from SICP. See Gerald Jay Sussman's lecture: https://www.youtube.com/watch?v=0m6hoOelZH8 Lisp structures are represented as follows: Lisp APL ---- --- 123 123 atom 'atom' (x y) (x y) 'x ('quote' x) Procedures are represented as 4-vectors of: 'closure' environment parameters body Environments are two-column matrices of names and values. Examples: lisp '(+ 1 2 3)' ⍝ expression evaluation 6 lisp '((lambda(m n)(+ m n))3 4)' ⍝ lambda application 7 0 lisp '((\(m n)(+ m n))3 4)' ⍝ parse tree (AST) ┌─────────────────┬─┬─┐ │┌─┬─────┬───────┐│3│4│ ││\│┌─┬─┐│┌─┬─┬─┐││ │ │ ││ ││m│n│││+│m│n│││ │ │ ││ │└─┴─┘│└─┴─┴─┘││ │ │ │└─┴─────┴───────┘│ │ │ └─────────────────┴─┴─┘ lisp repl '→' ⍝ mini session using →repl← operator. (* 2 3 4) 24 ((\(m n)(* m n))3 4) ⍝ using "\" shorthand for "lambda" 12 (quote (+ 1 2)) ⍝ quoted list + 1 2 '(* 4 5) ⍝ using "'" shorthand * 4 5 → ⍝ Nick's example: s ← ' ((lambda (cons car cdr) ' s,← ' (car (cons 123 456))) ' s,← ' ' s,← ' (lambda (x y) (lambda (i) (cond (i x) (else y)))) ' s,← ' (lambda (xy) (xy 0)) ' s,← ' (lambda (xy) (xy 1))) ' lisp s 456 ⍝ Applicative-order Y combinator: Y←'(\(f)((\(x)(x x))(\(x)(f(\(y)((x x)y))))))' fac←'(\(f)(\(n)(cond((= n 0)1)(else(* n(f(- n 1)))))))' ⍝ factorial lisp '((',Y,fac,')4)' ⍝ !4 24 ⍝ Fibonacci: fib ← '(\(f)(\(n)(cond((= n 0)0)((= n 1)1)(else(+(f(- n 1))(f(- n 2)))))))' lisp '((',Y,fib,')8)' 21 ⍝ Ackermann: ack ← '(\(a)(\(m)(\(n)(cond((= m 0)(+ n 1))' ack ,← ' ((= n 0)((a(- m 1))1))' ack ,← ' (else((a(- m 1))((a m)(- n 1))))))))' lisp'(((',Y,ack,')3)3)' 61 rec←Y{'((',⍺⍺,⍺,')',⍵,')'} ⍝ Y applicator lisp¨ fib∘rec¨ ⎕D ⍝ fib¨ 0..9 0 1 1 2 3 5 8 13 21 34 pchk←{0 ¯1↓1 0⌽' ',⍕↑⍵(+\1 ¯1 0['()'⍳⍵])} pchk Y ⍝ handy parenthesis depth checker ( \ ( f ) ( ( \ ( x ) ( x x ) ) ( \ ( x ) ( f ( \ ( y ) ( ( x x ) y ) ) ) ) ) ) 1 1 2 2 1 2 3 3 4 4 3 4 4 4 4 3 2 3 3 4 4 3 4 4 5 5 6 6 5 6 7 7 7 7 6 6 5 4 3 2 1 See also: repl parse bf baby joy See https://github.com/ngn/only-tools-and-sources/tree/master/lib/lisp Back to: contents Back to: Workspaces