Lisp中的未绑定变量错误
我正在尝试在LispWorks上使用Common Lisp从列表中删除重复项 所以我做了两个功能。第一个“remove-e”从列表中删除一个元素,第二个“remove rep”使用第一个元素返回一个没有重复项的列表 这是我的第一个代码:Lisp中的未绑定变量错误,lisp,common-lisp,Lisp,Common Lisp,我正在尝试在LispWorks上使用Common Lisp从列表中删除重复项 所以我做了两个功能。第一个“remove-e”从列表中删除一个元素,第二个“remove rep”使用第一个元素返回一个没有重复项的列表 这是我的第一个代码: (defun remove-e (L e) (if (null L) L (if (= e (car L)) (remove-e (cdr L) e) (cons (car L) (remove-e (cdr L) e
(defun remove-e (L e)
(if (null L)
L
(if (= e (car L))
(remove-e (cdr L) e)
(cons (car L) (remove-e (cdr L) e)))))
当给它一个数字列表时效果很好,但当我给它一个字母时,我会得到以下错误:
(remove-e '(a a b a d a g a h t) a)
Error: The variable A is unbound.
关于我的第二项职能:
(defun remove-rep (l)
(if (null l)
l
(cons (car l)
(remove-rep (remove-e (cdr l) (car l))))))
这是我在尝试测试时收到的错误消息:
CL-USER 12 : 6 > (remove-rep '(1 2 3 1 5 1 1))
Error: The variable is unbound.
我看到了一些类似的问题,但找不到我的程序与这些问题的共同点:
,
remove-e
仅适用于数字列表,因为您使用=
来比较元素。如果您还希望能够使用符号,请使用eql
:
(defun remove-e (L e)
(if (null L) L
(if (eql e (car L)) (remove-e (cdr L) e)
(cons (car L) (remove-e (cdr L) e)))))
然后,当您调用它时,必须引用symbol参数,以防止它作为变量进行计算
(remove-e '(a a b a d a g a h t) 'a)
remove rep
中的问题是,您不知何故在第一行末尾键入了一些非打印的多字节字符。删除这些字符后,它可以正常工作。尝试重新键入该函数,或仅复制/粘贴以下内容:
(defun remove-rep (l)
(if (null l) l
(cons (car l) (remove-rep (remove-e (cdr l) (car l))))))
顺便说一句,Lisp程序员通常不会像您一样将
)
放在新行上,他们会这样将它们放在行的末尾。remove-e
只适用于数字列表,因为您使用=
来比较元素。如果您还希望能够使用符号,请使用eql
:
(defun remove-e (L e)
(if (null L) L
(if (eql e (car L)) (remove-e (cdr L) e)
(cons (car L) (remove-e (cdr L) e)))))
然后,当您调用它时,必须引用symbol参数,以防止它作为变量进行计算
(remove-e '(a a b a d a g a h t) 'a)
remove rep
中的问题是,您不知何故在第一行末尾键入了一些非打印的多字节字符。删除这些字符后,它可以正常工作。尝试重新键入该函数,或仅复制/粘贴以下内容:
(defun remove-rep (l)
(if (null l) l
(cons (car l) (remove-rep (remove-e (cdr l) (car l))))))
顺便说一句,Lisp程序员通常不会像您一样在新行中添加
)
,他们会像这样将它们放在行的末尾。函数用于比较数字。使用eql
如果您希望能够比较数字或符号,使用equal
如果您希望能够比较字符串和列表之类的内容。在defun remove rep(l)
之后有一些阿拉伯字符。它们是Unicode码点0x8a0
@Barmar,即使是eql
和相等,我也会得到同样的错误。如何删除阿拉伯字符?您还需要引用a
符号,以防止将其作为变量进行计算。=
函数用于比较数字。使用eql
如果您希望能够比较数字或符号,使用equal
如果您希望能够比较字符串和列表之类的内容。在defun remove rep(l)
之后有一些阿拉伯字符。它们是Unicode码点0x8a0
@Barmar,即使是eql
和相等,我也会得到同样的错误。如何删除阿拉伯字符?您还需要引用a
符号,以防止将其作为变量计算。感谢您的澄清!现在很好用。我只是想知道那些角色是从哪里来的?显然我不是用阿拉伯语编程的。我不知道,你一定是无意中用Alt键键入了字符。我还有一个问题。什么样的范式最适合这个问题?是在使用Lisp还是Prolog时?我没有做过太多的Prolog编程,但我认为它最适合于涉及模式匹配或填充空格的问题。像Lisp这样的过程语言只能在一个方向上解决问题:你给它参数X和Y,它会计算结果Z。在Prolog中,你可以给X和Z,它会试图找到Y。基于此,我们可以说Prolog更适合我们,因为它给了我们更多的选择,而且我们不是只停留在一个方向上吗?谢谢你的澄清!现在很好用。我只是想知道那些角色是从哪里来的?显然我不是用阿拉伯语编程的。我不知道,你一定是无意中用Alt键键入了字符。我还有一个问题。什么样的范式最适合这个问题?是在使用Lisp还是Prolog时?我没有做过太多的Prolog编程,但我认为它最适合于涉及模式匹配或填充空格的问题。像Lisp这样的过程语言只能在一个方向上解决问题:你给它参数X和Y,它会计算结果Z。在Prolog中,你可以给X和Z,它会试图找到Y。基于此,我们能说Prolog更适合,因为它给我们更多的选项,我们不会只停留在一个方向上吗?