lisp-workshop
Bu repo, Lisp Interpreter workshop'ının hazırlık materyallerini, kaynaklarını ve ortaya çıkan kodlarını barındırır.
Amacımız sıfırdan bir Lisp Interpreter yazarak tokenizer, parser, AST, interpreter ve compiler gibi kavramları pratikte öğrenmektir. Uygulama dili olarak Python (veya tercih edilen başka bir dil) kullanılacaktır. Neden Lisp?
Lisp, S-Expression (Symbolic Expression) yapısını kullanır. Her şey parantezlerle ifade edilen listeler (ağaçlar) halindedir. Diğer dillerdeki gibi operatör önceliği, girinti (indentation) veya blok yapıları gibi karmaşık syntax kuralları yoktur. Sadece parantezleri ve içindekileri ayrıştıran bir kod yazmak parser oluşturmak için yeterlidir.
Örnek Karşılaştırma:
Python
print(2 * 5)
if 5 > 3:
print("Büyük")
else:
print("Küçük")Lisp
(display (* 2 5))
(display (if (> 5 3) "Büyük" "Küçük"))S-Expression Zaten Bir AST'dir
Python'da basit bir 5 * 3 işleminin arkada oluşturduğu AST (Abstract Syntax Tree) yapısı aşağıdaki gibi uzundur:
# print(ast.dump(ast.parse('5 * 3'), indent=2))
Module(
body=[
Expr(
value=BinOp(
left=Constant(value=5),
op=Mult(),
right=Constant(value=3)))])Aynı işlemin Lisp karşılığı olan (* 5 3) zaten kendi başına bir AST formundadır. Bu yapısal sadelik, tokenizer ve parser yazma sürecini basitleştirir.
Kapsam ve Hedefler
1950'lere dayanan Lisp'in (Common Lisp, Scheme, Racket vb. birçok lehçesi vardır) en temel dialektlerinden biri olan Scheme'i baz alacağız. Ana referansımız Peter Norvig'in "Lispy" makalesi olacak, ancak implementasyonu daha modern bir Python syntax'ıyla gerçekleştireceğiz.
Workshop'ın sabit bir süresi veya tekrar sayısı yoktur; her oturumun sonunda gidişata göre bir sonraki adımlara karar verilecektir.
İlk Workshop Hedefi:
Temel veri tiplerinin işlenmesi
Built-in fonksiyonlar
define ve if gibi temel formlar
Çalışan bir REPL (Read-Eval-Print Loop)
İleriki Aşama Hedefleri:
Gelişmiş tipler (String, Boolean, Array vb.)
Standard Library oluşturma
Tail Call Optimization (TCO)
#### Kaynaklar
Lisp in Python (Norvig): Lispy 1 | Lispy 2
Build your own Lisp: buildyourownlisp.com/contents
#### Lisp 101
WIP -> Buraya basit bir Lisp tutorial'ı eklenecektir.