2017-02-04 1 views
0

次のようにリトルLisperの1974年版の最初の関数の定義が表示されます:は、どのように少しlisperで使用されるLispの方言で定義された関数であり1974年版

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

は、これは適切な機能のように見えませんSBCL 1.3.14のように実行されません。フリードマンは、関数の例のほとんどで真理述語のようにそれを使用しているが、実際にはT F

も定義されていません: 未定義の関数:: 未定義の変数が ISLATそれは2つのエラーを生成します。限り、私は、この定義では、ラムダ、COND、NULL、ATOM、CAR、CDRだけがsbclで有効であることがわかります。

この定義は、1974年の時代に特有の機能仕様ですか、あるいはフリードマンが彼の定義から除外(定義)したものか(defunc)でしたか?

答えて

2

あなたはLispの1.5におけるような古いLispの定義を見れば、彼らは

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

ISLATのようなソース探して何かが関数名である可能性があります。 DEFINEは、疑似関数であり、1つ以上の関数を定義することができます。

のLisp 1.5マニュアルは、この例DEFINE三の機能MEMBERUNIONINTERSECTIONを定義

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 (...)が解析され、翻訳されるように、シンプルなフロントエンドを書くことができます。

  • 手動でLisp 1.5のコードをCommon Lispに翻訳する場合:DEFINEDEFUNに置き換える必要があります。

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))) 
ある
関連する問題