1974年版Little Lisper中的第一个函数定义如下:
(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年代lisps的函数规范还是弗里德曼从他的定义中忽略(定义)或(defunc)?
答案 0 :(得分:2)
如果你看一下Lisp 1.5中的旧Lisp定义,他们可能会看到类似
的源代码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
定义了三个函数MEMBER
,UNION
和INTERSECTION
。
如何处理?
如果您有源代码,可以编写一个简单的前端,以便解析和翻译DEFINE (...)
。
如果您手动将Lisp 1.5代码翻译为Common Lisp:您必须将DEFINE
替换为或更多DEFUN
。
像
这样的东西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)))