Skip to content

Instantly share code, notes, and snippets.

@WillNess
Last active February 28, 2018 00:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save WillNess/545421c0bd9a98f2ac17ed65c66830e7 to your computer and use it in GitHub Desktop.
Save WillNess/545421c0bd9a98f2ac17ed65c66830e7 to your computer and use it in GitHub Desktop.
apply f args = eval [f, ...[[QUOTE, a] | a <- args]...] [] % McCarthy-original-LISP-paper
eval e a | atom e = case [v | [n, v] <- a, n == e] of {[v, ...] -> v} % first matching name's value
| otherwise =
case e of
[QUOTE, x] -> x % "expression"
[FUNCTION, x] -> [FUNARG, x, a] % closure (new)
[ATOM, x] -> atom (eval x a)
[EQ, x, y] -> eval x a == eval y a
[CONS, x, y] -> [eval x a, ...eval y a...]
[CAR, x] -> case eval x a of {[v, ...] -> v } % "expression", "value"
[CDR, x] -> case eval x a of {[_, ...vs...] -> vs} % "values"
[COND, ...xs...] -> case [eval c a | [t, c] <- xs, eval t a] of {[v, ...] -> v} % "test", "consequent"
[[LAMBDA, b, c], ...xs...] -> eval c [...[[n, eval x a] | n <- b | x <- xs]..., ...a...] % "binds", "code"
[[LABEL, n, x], ...xs...] -> eval [x, ...xs...] [[n, [LABEL, n, x]], ...a...] % "name"
[[FUNARG, f, d], ...xs...] -> eval [f, ...[[QUOTE, eval x a] | x <- xs]...] d % closure (new)
[x, ...xs...] -> eval [eval x a, ...xs...] a % fix the bug,
%% eval [eval x a, ...[eval x a | x <- xs]...] a % args twice eval'd
apply [LAMBDA, [X,Y], [CONS, [CAR, X], Y]] [[A,B],[C,D]] =
eval [[LAMBDA, [X,Y], [CONS, [CAR, X], Y]], [QUOTE, [A,B]], [QUOTE, [C,D]]] [] =
eval [CONS, [CAR, X], Y] [ [X, eval [QUOTE, [A,B]] []], [Y, eval [QUOTE, [C,D]] []], ...[]...] =
eval [CONS, [CAR, X], Y] [ [X, [A,B]], [Y, eval [QUOTE, [C,D]] []], ...[]...] =
eval [CONS, [CAR, X], Y] [ [X, [A,B]], [Y, [C,D]], ...[]...] =
eval [CONS, [CAR, X], Y] [ [X, [A,B]], [Y, [C,D]]] =
[eval [CAR, X] [ [X, [A,B]], [Y, [C,D]]], ...eval Y [ [X, [A,B]], [Y, [C,D]]]...] =
[eval [CAR, X] [ [X, [A,B]], [Y, [C,D]]], ...[C,D]...] =
[eval [CAR, X] [ [X, [A,B]], [Y, [C,D]]], C, D] =
[case eval X [ [X, [A,B]], [Y, [C,D]]] of [v, ...] -> v, C, D ] =
[case [A,B] of [v, ...] -> v, C, D ] =
[case [A, ...[B]...] of [A, ...] -> A, C, D ] =
[A, C, D]. %%%% YES!!!
eval e = \a -> case e of [QUOTE, x] -> x
compile e = case e of [QUOTE, x] -> \a -> x
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment