2017-02-04 29 views
0

出現在1974年版的小利斯佩爾的第一個函數定義如下:如何在小利斯佩爾使用Lisp的方言定義函數1974年版

(ISLAT (LAMBDA (L) 
    (COND 
    ((NULL L) T) 
    ((ATOM (CAR L))(ISLAT (CDR L))) 
    (T F) 
       ) )) 

這看起來並不像一個正常功能定義,它不會像SBCL 1.3.14中那樣運行。它產生兩個錯誤: 未定義的函數: ISLAT 未定義變量: ˚F

事實上T也是未定義的,雖然弗裏德曼使用它象在大多數的功能示例的真理謂詞。據我所知,在這個定義中,只有LAMBDA,COND,NULL,ATOM,CAR,CDR在sbcl中有效。

這個定義是一些函數說明,特定於1974年時代的說法還是弗裏德曼從他的定義中忽略了(定義)或(defunc)?

回答

2

如果你看看舊的Lisp的定義,像Lisp的1.5,他們可能有源看起來像

DEFINE ((
(ISLAT (LAMBDA (L) 
(COND 
((NULL L) T) 
((ATOM (CAR L))(ISLAT (CDR L))) 
(T F)))) 
)) 

ISLAT是函數名稱。 DEFINE是一個僞函數並允許定義一個或多個函數。

Lisp的1.5手冊有這個例子

DEFINE ((
(MEMBER (LAMBDA (A X) (COND ((NULL X) F) 
    ((EQ A (CAR X)) T) (T (MEMBER A (CDR X)))))) 
(UNION (LAMBDA (X Y) (COND ((NULL X) Y) ((MEMBER 
    (CAR X) Y) (UNION (CDR X) Y)) (T (CONS (CAR X) 
    (UNION (CDR X) Y)))))) 
(INTERSECTION (LAMBDA (X Y) (COND ((NULL X) NIL) 
    ((MEMBER (CAR X) Y) (CONS (CAR X) (INTERSECTION 
    (CDR X) Y))) (T (INTERSECTION (CDR X) Y))))) 
)) 

其中DEFINE定義了三個功能MEMBERUNIONINTERSECTION

如何處理?

  • 如果你的源代碼,你可以寫一個簡單的前端,從而DEFINE (...)被解析並翻譯。

  • 如果您手動將Lisp 1.5代碼轉換爲Common Lisp:您必須用012或更多DEFUN替換DEFINE

喜歡的東西

DEFINE ((
(ISLAT (LAMBDA (L) 
(COND 
((NULL L) T) 
((ATOM (CAR L))(ISLAT (CDR L))) 
(T F)))) 
)) 

(DEFUN ISLAT (L) 
    (COND 
    ((NULL L) T) 
    ((ATOM (CAR L))(ISLAT (CDR L))) 
    (T F)))