Egy újabb Lisp a nulláról

Egy csomó embernek megfordult már a fejében, hogy minimális Lisp interpretert írjon otthon csak úgy hobbiból [1, 2, 3, 4]. Hát nekem is ez a hóbortom támadt, ezért beállok (n+1)-ediknek.

Ez a blogbejegyzés azt a győzedelmes pillanatot hivatott megörökíteni, midőn először futott az általam írt eval-apply ciklus.

Az eddig megírt C kód 309 sorban implementálja az environment modelt, nincs benne ugyanakkor GC, aritmetika, tömbök, sztringek, tail-call optimization. Szimbólumok vannak, listák (üres lista + pair),

quote

, valamint logikai típus. Primitív függvények hamarosan lesznek. Majd később elágazás,

set!

,

set-car!

,

set-cdr!

és GC is.

Ízelítőnek álljon itt egy pici REPL:


> #f
#f
> #t
#t
> (quote #t)
#t
> (quote #f)
#f
> (quote x)
x
> (quote ())
()
> (quote (+ 1 2))
(+ 1 2)
> (lambda () (quote ()))
#<lambda>
> ((lambda () (quote ())))
()
> ((lambda (a b) a) (quote x) (quote y))
x
> ((lambda (f x) (f x)) (lambda (x) x) #t)
#t

Amit látni kell, hogy a lambdák mennek szépen (már amennyire ez eddig tesztelhető).

Hozzászólások

szuper, a forras elerheto lesz?
ha jol latom, a linkelt megoldasok a nyelv beepitett veremkezeleset hasznaljak (rekurziv eval fv.), vajon a tail-call optimization megoldaho igy is, vagy a vermet kulon implementalni kell majd hozza?

Gondolkodom még rajta. Végülis ha van igény rá, lehet csinálok egy a linkeltekhez hasonló szösszenetet a forrás lényegének magyarázatáról.

Tail-call optimizationt legfeljebb akkor fogok implementálni, ha netalán eljut odáig a projekt, hogy Lisp compilert készítek. Ez most sokadrangú dolog, először legyen rekurzió (ez nincs messze, csak if és set! kell hozzá), GC (berakom alá a Boehm GC-t), makrók (ez kicsit összetettebb rész lesz), számok (egyelőre csak egész számokat tervezek, GMP alapon).

Közben megírtam C-ben néhány procedúrát: null?, pair?, boolean?, symbol?, procedure?, eqv?, cons, car, cdr, not.

cool, az egyik kollegam ugyanerre az elhatarozasra jutott par honapja, ha gondolod megemlitem neki hetfon.. Par hete hosszasan magyarazta a GC-t, ha gondolod osszehozlak vele.. A repo - azt hiszem - https://github.com/74AC153/paren