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

标签 lisp common-lisp sbcl

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 定义了三个函数MEMBERUNIONINTERSECTION

如何处理?

  • 如果您有源代码,您可以编写一个简单的前端,以便对 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/

相关文章:

lisp - CLISP中如何实现限时执行机制?

recursion - Scheme 中的 Mandelbrot 集实现非常慢

function - 如何在方案中重新创建申请

common-lisp - 惯用的 Lisp 方法来创建排序的随机数列表?

common-lisp - 打开一个文件,如果文件不存在则做其他事情

list - 返回和的 Lisp 函数

common-lisp - Common Lisp 符号中允许使用哪些字符?

Practical Common LISP 格式化 %10t 错误

lisp - SB-内核 :TWO-ARG - what does this mean when used in debugger backtrace?

debugging - 如何在 lisp (sbcl) 中禁用警告