LispKit Lisp

維基百科,自由的百科全書
跳至導覽 跳至搜尋
Lispkit Lisp
編程範型純函數式
語言家族LISP
設計者Peter Henderson
釋出時間1980年,​46年前​(1980
最終版本
    Module:EditAtWikidata第29行Lua錯誤:attempt to index field 'wikibase' (a nil value)
    作用域詞法
    實作語言ALGOL, Pascal, C
    網站{{URL|example.com|可选的显示文本}}Module:EditAtWikidata第29行Lua錯誤:attempt to index field 'wikibase' (a nil value)
    受影響於
    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₂……)

    引用[編輯]

    1. ^ Henderson, Peter. Functional Programming: Application and Implementation. Prentice Hall. 1980 [2021-12-28]. ISBN 0-13-331579-7. (原始內容存檔於2021-12-28). 
    2. ^ 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)

    外部連結[編輯]