LispKit Lisp
外觀
| 編程範型 | 純函數式 |
|---|---|
| 語言家族 | LISP |
| 設計者 | Peter Henderson |
| 面市時間 | 1980年 |
| 作用域 | 詞法 |
| 實作語言 | ALGOL, Pascal, C |
| 受影響於 | |
| ALGOL, LISP | |
LispKit Lisp是詞法作用域的純函數式的Lisp語言子集,它是作為函數式編程概念的測試台而開發的。它首先使用了對惰性求值的早期經驗。在1980年開發者Peter Henderson,出版了用一種變體ALGOL語言寫的基於SECD抽象機的實現[1]。它的編譯器和虛擬機都是高度可移植的,並已經在多種機器上實現[2]。
基本函數
[編輯]基本語言只提供了下列函數,但在Henderson的書中討論了明確支持惰性求值和非確定性編程的擴展。
(quote <exp>):接受一個表達式,返回這個表達式為一個值。(eq <exp1> <exp2>):接受二個表達式,如果它們的值相等,則返回符號T,否則返回符號F。(atom <exp>):接受一個表達式,如果它的值是原子,則返回符號T,否則返回符號F。(if <exp1> <exp2> <exp3>):接受三個表達式,如果第一個表達式為符號T,則返回第二個表達式的值,否則返回第三個表達式的值。(cons <exp1> <exp2>):接受二個表達式,返回由它們的值構成的一個值點對。(car <exp>):也寫為head,接受其值為點對的一個表達式,返回這個點對的第一個值。(cdr <exp>):也寫為tail,接受其值為點對的一個表達式,返回這個點對的第二個值。(let <exp> (<name1>.<exp1>) (<name2>.<exp2>)……):接受一個表達式和它所具有的一個聲明類表,它包含在這個表達式中可見的諸命名表達式,這個函數返回這個表達式的值。(lambda (<name1> <name2>……) <exp>):接受一個參數列表和一個表達式,將它們返回為函數。(letrec <exp> (<name1>.<exp1>) (<name2>.<exp2>)……):類似於let,但是在聲明中被命名的表達式比如<exp1>之中,出現的名字比如<name1>也代表著對應的值。(add <exp1> <exp2>):接受二個表達式,返回它們的數值的和。(sub <exp1> <exp2>):接受二個表達式,返回它們的數值的差。(mul <exp1> <exp2>):接受二個表達式,返回它們的數值的積。(div <exp1> <exp2>):接受二個表達式,返回它們的數值的商。(rem <exp1> <exp2>):也寫為mod,接受二個表達式,返回它們的數值的餘數。(leq <exp1> <exp2>):接受二個表達式,如果第一個數值小於或等於第二個,則返回符號T,否則返回符號F。
綁定
[編輯]函數let和letrec有著類似的用處,但是在名字綁定機制即處理命名變量的方式上有著微妙的區別。
(let e (x₁.e₁) (x₂.e₂)……) ≡ ((lambda (x₁ x₂……) e) e₁ e₂……):let在聲明列表中,將諸表達式的值綁定到諸變量名字。lambda定義並返回一個函數,在後續的函數應用之時,將諸實際參數表達式的值綁定到諸形式參數名字。(letrec e (x₁.e₁) (x₂.y₂)……):letrec本質上類似於let,但是它允許遞歸的定義函數和值。
例如下面表達式的值是無限列表(1 1 1 ……):
(letrec i
(i.(cons (quote 1) i)))
上面例子採用點對表示法,指示出了對S-表達式的匹配方式,程序代碼通常採用列表表示法寫為:
(letrec e
(f lambda y₁ e₁)
(g lambda y₂ e₂))
這裡的y是綁定變量的列表(x₁ x₂……)。
引用
[編輯]- ^ 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 (頁面存檔備份,存於網際網路檔案館)
- Documentation and source of Lispkit
- 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 (頁面存檔備份,存於網際網路檔案館)