August 2023
Python 3.11.4 (main, Jun 20 2023, 17:23:00) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> (d:=(lambda s:s.replace('(',' ( ').replace(')',' ) ').split()),p:=(lambda toks:(v:=(lambda toks,x:(toks,x)if not toks else(toks[1:],x)if toks[0]==')' else(t:=p(toks[1:]),v(t[0],x+[t[1]]))[-1]if toks[0]=='(' else v(toks[1:],x+[int(toks[0])])if toks[0].isdigit()else v(toks[1:],x+[toks[0]])),v(toks,[]))[-1]),h:=(lambda e,c:e if isinstance(e,(int,type(None)))else c[e]if isinstance(e,str)else h(e[0],c)(e[1:],c)),c:={'+':lambda k,c:sum([h(z,c)for z in k]),'-':lambda k,c:__import__('functools').reduce(int.__sub__,[h(z,c)for z in k]),'*':lambda k,c:__import__('functools').reduce(int.__mul__,[h(z,c)for z in k]),'/':lambda k,c: __import__('functools').reduce(int.__floordiv__,[h(z,c)for z in k]),'quote':lambda k,c:k[0],'cond':lambda k,c:(rec:=lambda k:None if not k else h(k[0][1],c)if h(k[0][0],c)else rec(k[1:]),rec(k),)[-1],'lambda':lambda k,c:(ps:=k[0],bb:=k[1],lambda c_a,c_c:h(bb,__import__('collections').ChainMap(dict(zip(ps,(h(z,c_c)for z in c_a))),c),),)[-1],'car':lambda k,c:h(k[0],c)[0],'cdr':lambda k,c:h(k[0],c)[1:],'cons':lambda k,c:[h(k[0],c)] +h(k[1],c),'define':lambda k,c:c.__setitem__(k[0],h(k[1],c)),'eq':lambda k,c:int(h(k[0],c)==h(k[1],c))}, repl:=(lambda:(print('lisp> ',end=''),s:=input(),None if s=='quit' else(t:=p(d(s)),print(h(t[1][0],c)),repl()))))[-1]()
lisp> (define fact (lambda (n) (cond ((eq n 0) 1) ((eq 1 1) (* n (fact (- n 1)))))))
None
lisp> (fact 5)
120
lisp> (define fib (lambda (n) (cond ((eq n 1) 1) ((eq n 2) 1) ((eq 1 1) (+ (fib (- n 1)) (fib (- n 2)))))))
None
lisp> (fib 5)
5
lisp> (fib 10)
55
Or, formatted more nicely:
(
d := (lambda s: s.replace("(", " ( ").replace(")", " ) ").split()),
p := (
lambda toks: (
v := (
lambda toks, x: (toks, x)
if not toks
else (toks[1:], x)
if toks[0] == ")"
else (t := p(toks[1:]), v(t[0], x + [t[1]]))[-1]
if toks[0] == "("
else v(toks[1:], x + [int(toks[0])])
if toks[0].isdigit()
else v(toks[1:], x + [toks[0]])
),
v(toks, []),
)[-1]
),
h := (
lambda e, c: e
if isinstance(e, (int, type(None)))
else c[e]
if isinstance(e, str)
else h(e[0], c)(e[1:], c)
),
c := {
"+": lambda k, c: sum([h(z, c) for z in k]),
"-": lambda k, c: __import__("functools").reduce(
int.__sub__, [h(z, c) for z in k]
),
"*": lambda k, c: __import__("functools").reduce(
int.__mul__, [h(z, c) for z in k]
),
"/": lambda k, c: __import__("functools").reduce(
int.__floordiv__, [h(z, c) for z in k]
),
"quote": lambda k, c: k[0],
"cond": lambda k, c: (
rec := lambda k: None
if not k
else h(k[0][1], c)
if h(k[0][0], c)
else rec(k[1:]),
rec(k),
)[-1],
"lambda": lambda k, c: (
ps := k[0],
bb := k[1],
lambda c_a, c_c: h(
bb,
__import__("collections").ChainMap(
dict(zip(ps, (h(z, c_c) for z in c_a))), c
),
),
)[-1],
"car": lambda k, c: h(k[0], c)[0],
"cdr": lambda k, c: h(k[0], c)[1:],
"cons": lambda k, c: [h(k[0], c)] + h(k[1], c),
"define": lambda k, c: c.__setitem__(k[0], h(k[1], c)),
"eq": lambda k, c: int(h(k[0], c) == h(k[1], c)),
},
repl := (
lambda: (
print("lisp> ", end=""),
s := input(),
None if s == "quit" else (t := p(d(s)), print(h(t[1][0], c)), repl()),
)
),
)[-1]()