跳至內容

LispKit Lisp

維基百科,自由的百科全書
Lispkit Lisp
編程範型純函數式
語言家族LISP
設計者Peter Henderson
面市時間1980年,​45年前​(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

綁定

[編輯]

函數letletrec有著類似的用處,但是在名字綁定機制即處理命名變量的方式上有著微妙的區別。

  • (let e (x₁.e₁) (x₂.e₂)……) ((lambda (x₁ x₂……) e) e₁ e₂……)let在聲明列表中,將諸表達式的值綁定到諸變量名字。lambda定義並返回一個函數,在後續的函數應用英語Function application之時,將諸實際參數表達式的值綁定到諸形式參數名字。
  • (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₂……)

引用

[編輯]

擴展閱讀

[編輯]
  • Peter Henderson, Geraint A. Jones, and Simon B. Jones, "The LispKit Manual" (ISBN 0-902928-18-X)

外部連結

[編輯]