Lisp

时间:2017-04-29 09:44:51

标签: 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)))))

给出一个数字列表时效果很好但是当我给它写字母时,我收到了这个错误:

(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.

我看到有一些类似的问题,但无法找到我的程序的共同点: Unbound variable in LispUnbound variable in Common Lisp

1 个答案:

答案 0 :(得分:3)

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)))))

然后当你调用它时,你必须引用符号参数,以防止它被评估为变量。

(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程序员通常不像你那样把)放在新行上,他们就像这样把它们放在行尾。