作者: Peter Norvig 原文連結: http://norvig.com/lispy.html 這篇文章有兩個目的:描述直譯器通常是如何實作出來,以及展示如何用 Python 去完成 Scheme 的子集,Scheme是Lisp的一種方言。我將我的直譯器叫作 Lispy ( lis.py )。幾年前,我曾展現過如何 用Java寫一個Scheme直譯器 ,類似的Scheme直譯器也曾經以 Common Lisp實作過 。這次的目的則是為了儘可能地證明 Alan Kay曾宣示 的 "軟體的馬克斯威爾方程式" 。 Scheme子集,Lispy的語法及語意 大部份的電腦語言有多樣化的句法規則(關鍵字、中序運算子、大括號、運算子順序、點的表示、分號...等等)。然而,身為Lisp家族的一員,Scheme所有的語法都是根基於括號的list的前置表示法。這或許會不太令人習慣,但這會有簡單與一致性的好處。(有人開玩笑地說,"Lisp"表示"一堆惹人生氣的智障括號( Lots of Irritating Silly Parentheses )",我認為Lisp是表示"Lisp是純淨的句法( Lisp Is Syntactically Pure )")。考慮一下: Java Scheme if ( x.val() > 0 ) { z = f(a * x.val() + b); } (if (> (val x) 0) (set! z (f (+ (* a (val x)) b)))) 注意,驚嘆號並不是Scheme中的特殊字元,它只是"set!"這個名字的一部份。只有小括號才是特別的。一個像(set! x y)這樣有著關鍵字在第一個位置的list,在Scheme中稱呼為special form,這個語言美麗之處就在於只需要6個special form,加上3個可建立句法的組件-variables, constant,以及procedure call。 型式 語法 語意和範例 variable reference var 一個符號會被解釋為一個變數名稱,其值就是該變