Little Lisper 1974 年版中的第一个函数定义如下:
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F)
) ))
这看起来不像是一个正确的函数定义,它不会像在 SBCL 1.3.14 中那样运行。它会产生两个错误: 未定义的功能: 国际语文学院 undefined variable : F
事实上 T 也是未定义的,尽管弗里德曼在大多数函数示例中将其用作真值谓词。据我所知,在这个定义中,只有 LAMBDA、COND、NULL、ATOM、CAR、CDR 在 sbcl 中有效。
这个定义是特定于 1974 年时代的 lisp 的一些函数规范,还是弗里德曼只是从他的定义中遗漏了 (define) 或 (defunc)?
最佳答案
如果您查看 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)))
关于lisp - little lisper 1974 版中如何使用 lisp 方言中定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035379/