Lisp中的未绑定变量错误

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

我正在尝试在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)))))
当给它一个数字列表时效果很好,但当我给它一个字母时,我会得到以下错误:

(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更适合,因为它给我们更多的选项,我们不会只停留在一个方向上吗?