如何在little lisper 1974版中使用lisp方言定义函数

如何在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在大多数函数示

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在大多数函数示例中都像真值谓词一样使用它。据我所知,在这个定义中,只有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))))
))