如何在little lisper 1974版中使用lisp方言定义函数
1974年版Little Lisper中的第一个函数定义如下所示:如何在little lisper 1974版中使用lisp方言定义函数,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,1974年版Little Lisper中的第一个函数定义如下所示: (ISLAT (LAMBDA (L) (COND ((NULL L) T) ((ATOM (CAR L))(ISLAT (CDR L))) (T F) ) )) 这看起来不像是一个正确的函数定义,也不会像SBCL 1.3.14中那样运行。它会产生两个错误: 未定义的函数: 伊斯拉特 未定义变量: F 事实上,T也是未定义的,尽管Friedman在大多数函数示
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F)
) ))
这看起来不像是一个正确的函数定义,也不会像SBCL 1.3.14中那样运行。它会产生两个错误:
未定义的函数:
伊斯拉特
未定义变量:
F
事实上,T也是未定义的,尽管Friedman在大多数函数示例中都像真值谓词一样使用它。据我所知,在这个定义中,只有LAMBDA、COND、NULL、ATOM、CAR、CDR在sbcl中有效
这个定义是1974年的Lisp特有的函数规范,还是Friedman只是在他的定义中遗漏了(定义)或(失效)?如果你看一下旧的Lisp定义,如Lisp 1.5,它们的源代码可能类似于
DEFINE ((
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F))))
))
DEFINE ((
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F))))
))
ISLAT
是函数名DEFINE
是一个伪函数,允许定义一个或多个函数
LISP1.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代码转换为通用Lisp:必须将
替换为一个或多个DEFINE
DEFUN
DEFINE ((
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F))))
))
DEFINE ((
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F))))
))
是
如果您查看旧的Lisp定义,如Lisp1.5中的定义,它们的源代码可能类似于
DEFINE ((
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F))))
))
DEFINE ((
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F))))
))
ISLAT
是函数名DEFINE
是一个伪函数,允许定义一个或多个函数
LISP1.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代码转换为通用Lisp:必须将
替换为一个或多个DEFINE
DEFUN
DEFINE ((
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F))))
))
DEFINE ((
(ISLAT (LAMBDA (L)
(COND
((NULL L) T)
((ATOM (CAR L))(ISLAT (CDR L)))
(T F))))
))
是