Lisp #1#不是符号或lambda表达式

Lisp #1#不是符号或lambda表达式,lisp,common-lisp,Lisp,Common Lisp,我尝试用LISP创建Euklid的算法。 我的代码: (defun euklid( x y) (cond ((= x y) x) ((> x y) (euklid((- x y) y))) ) 我得到一个错误,形式为(#1=(-X Y)Y),#1#不是符号或lambda表达式。 如何更正此错误?我知道错误在我的代码中。Reader变量 #1=…语法()意味着您的Lisp环境正在将由…表示的任何数据绑定到读取器变量1。#1#语法()引用以前绑定到同一读卡

我尝试用LISP创建Euklid的算法。 我的代码:

(defun euklid( x y)
   (cond
     ((= x y) x)
     ((> x y) (euklid((- x y) y)))
     )
我得到一个错误
,形式为(#1=(-X Y)Y),#1#不是符号或lambda表达式。
如何更正此错误?我知道错误在我的代码中。

Reader变量
#1=…
语法()意味着您的Lisp环境正在将由
表示的任何数据绑定到读取器变量1。
#1#
语法()引用以前绑定到同一读卡器变量的数据

因此,您的Lisp环境表示表单
(-X Y)
不是符号或lambda表达式,而是通过使用指向函数中错误的子表达式的读取器变量来实现的

不是符号或lambda表达式 在正常的求值规则下(没有特殊运算符,没有宏的一部分),类似于
(f x y…
的列表是一个函数调用,其中
f
是被调用的函数,
x
y
。。。这些都是论点。唯一可能显示为
f
的值是符号,如
(mod 10 3)
,或文字lambda表达式,如
((lambda(x y)(mod x y))10 3)
。如果需要在运行时确定调用哪些函数,则使用
funcall
(例如
(funcall(alexandria:compose#'/#'+)10 20)

您在此处输入了
(-X Y)
,它既不是符号,也不是lambda表达式。 你需要改为写:

(euklid (- X Y) Y)
读取器变量
#1=…
语法()意味着您的Lisp环境正在将由
表示的任何数据绑定到读取器变量1。
#1#
语法()引用以前绑定到同一读卡器变量的数据

因此,您的Lisp环境表示表单
(-X Y)
不是符号或lambda表达式,而是通过使用指向函数中错误的子表达式的读取器变量来实现的

不是符号或lambda表达式 在正常的求值规则下(没有特殊运算符,没有宏的一部分),类似于
(f x y…
的列表是一个函数调用,其中
f
是被调用的函数,
x
y
。。。这些都是论点。唯一可能显示为
f
的值是符号,如
(mod 10 3)
,或文字lambda表达式,如
((lambda(x y)(mod x y))10 3)
。如果需要在运行时确定调用哪些函数,则使用
funcall
(例如
(funcall(alexandria:compose#'/#'+)10 20)

您在此处输入了
(-X Y)
,它既不是符号,也不是lambda表达式。 你需要改为写:

(euklid (- X Y) Y)

在函数公式中,您忘记了一个重要事实,即在代码中,输入顺序是相关的

此代码使输入顺序不相关:

;; correct version:

(defun euklid (x y)
  (let ((x (max x y))
        (y (min x y)))
    (cond
      ((= x y) x)
      ((> x y) (euklid (- x y) y)))))
首先,我更正为:

(defun euklid (x y)
   (cond
     ((= x y) x)
     ((> x y) (euklid (- x y) y))))
但我意识到输入的顺序与此功能相关:

(euklid 3 9)
;; returns NIL!

(euklid 9 3)
;; returns 3

min
/
max
分别绑定到
y
x
,这使得输入的顺序不相关,我认为这是人们希望从函数中获得的行为,比如
euklid
,不是吗?

在函数公式中,您忘记了一个重要事实,即在代码中,输入顺序是相关的

此代码使输入顺序不相关:

;; correct version:

(defun euklid (x y)
  (let ((x (max x y))
        (y (min x y)))
    (cond
      ((= x y) x)
      ((> x y) (euklid (- x y) y)))))
首先,我更正为:

(defun euklid (x y)
   (cond
     ((= x y) x)
     ((> x y) (euklid (- x y) y))))
但我意识到输入的顺序与此功能相关:

(euklid 3 9)
;; returns NIL!

(euklid 9 3)
;; returns 3

min
/
max
分别绑定到
y
x
,这使得输入的顺序不相关,我认为这是人们希望从
euklid
这样的函数中得到的行为,不是吗?

调用
euklid
@jkiiski,thx时,参数周围有额外的括号!您将
*print circle*
变量设置为true(或者调试器在准备错误消息时正在执行此操作)。这就是为什么会出现神秘的错误消息。如果
*print circle*
nil
,则错误消息将如下所示:“形式为(-X Y)Y,(-X Y)不是符号或lambda表达式”。这就是它的意思。
#1=
表示“在标签1下注册以下对象”,然后
#1
表示“引用先前标记为1的对象”。通过这种“圆表示法”,Lisp支持打印中的循环结构和DAG的精确呈现。@Kaz这是一个很好的解释,尽管我认为“结构共享表示法”(而不是“圆表示法”)更清楚一些。在调用
EUKLID
@jkiiski,thx时,在参数周围有额外的括号!您将
*print circle*
变量设置为true(或者调试器在准备错误消息时正在执行此操作)。这就是为什么会出现神秘的错误消息。如果
*print circle*
nil
,则错误消息将如下所示:“形式为(-X Y)Y,(-X Y)不是符号或lambda表达式”。这就是它的意思。
#1=
表示“在标签1下注册以下对象”,然后
#1
表示“引用先前标记为1的对象”。通过这种“圆表示法”,Lisp支持在印刷品中准确地呈现循环结构和DAG。@Kaz很好的解释,尽管我认为“结构共享表示法”(而不是“圆表示法”)更清楚一些。