LispKit Lisp
LispKit Lisp是Lisp語言的嚴格函數式子集(「純Lisp」),它是作為函數式編程概念的測試台而開發的。它首先使用了對惰性求值的早期經驗。在1980年開發者Peter Henderson,出版了用一種變體ALGOL語言寫的基於SECD抽象機的實現[1]。編譯器和虛擬機都是高度可移植的,並已經在多種機器上實現[2]。
基本函數
編輯基本語言只提供了下列函數,但在Henderson的書中討論了明確支持惰性求值和非確定性編程的擴展。
- atom
- 接受一個表達式,如果它的值是原子則返回 True;否則返回 False。
- add
- 接受兩個表達式,返回它們的數值的和。
- car
- 接受其值為點對的一個表達式,返回這個點對的第一個值。
- cdr
- 接受其值為點對的一個表達式,返回這個點對的第二個值。
- cons
- 接受兩個表達式,返回由它們的值構成的一個點對值。
- div
- 接受兩個表達式,返回它們的數值的商。
- eq
- 接受兩個表達式,如果它們的值相等則返回 True;否則返回 False。
- if
- 接受三個表達式,如果第一個為 True 則返回第二個的值,否則返回第三個的值。
- lambda
- 接受一個表達式,返回這個表達式為可求值的值。
- let
- 接受命名表達式的一個列表,返回這個列表為一個單一可求值的值。
- letrec
- 接受命名表達式的一個列表,返回這個列表為一個單一可求值的值。
- leq
- 接受兩個表達式,如果第一個數值小於或等於第二個則返回 True;否則返回 False。
- rem
- 接受兩個表達式,返回它們的數值的餘數。
- mu
- 接受兩個表達式,返回它們的數值的積。
- quote
- 接受一個表達式,返回這個表達式為一個值。
- sub
- 接受兩個表達式,返回它們的數值的差。
函數lambda、let和letrec是類似的,但是在處理命名變量的方式上有著微妙的區別,故有不同的用處。lambda定義並返回一個函數,let把表達式賦值給變量名,而letrec本質上類似於let,除了它允許遞歸函數的定義之外。
引用
編輯- ^ Henderson, Peter. Functional Programming: Application and Implementation. Prentice Hall. 1980 [2021-12-28]. ISBN 0-13-331579-7. (原始內容存檔於2021-12-28).
- ^ An implementation of the Lispkit described in the book "FUNCTIONAL PROGRAMMING: Application and Implementation", by Peter Henderson. [2021-12-28]. (原始內容存檔於2021-12-30).
進一步閱讀
編輯- Peter Henderson, Geraint A. Jones, and Simon B. Jones, "The LispKit Manual" (ISBN 0-902928-18-X)
外部連結
編輯- The LispKit Manual, Volume 1 (頁面存檔備份,存於網際網路檔案館), Volume 2 (頁面存檔備份,存於網際網路檔案館)
- Implementation of Lispkit (頁面存檔備份,存於網際網路檔案館)
- GNU Pascal LispKit port (頁面存檔備份,存於網際網路檔案館)
- Archive of old LispKit LISP code and files, plus C implementation of SECD machine
- Paper about a LispKit LISP implementation in Java (頁面存檔備份,存於網際網路檔案館), and the implementation itself (頁面存檔備份,存於網際網路檔案館)