lisp新手。我想知道为什么我得到这个错误。 “1不属于LIST类型。”

时间:2017-09-10 22:27:22

标签: lisp common-lisp

(defun fizzbuzz(lst emptyList)
    (if (= (mod (car lst) 3) 0)
    (fizzbuzz (cdr lst) (append emptyList (list(append (car lst) '(fizz)))))
    )
    (if (= (mod (car lst) 5) 0)
    (fizzbuzz (cdr lst) (append emptyList (list(append (car lst) '(buzz)))))
    )
    (if (and (= (mod (car lst) 3) 0) (= (mod (car lst) 5) 0))
    (fizzbuzz (cdr lst) (append emptyList (list(append (car lst) 
    '(fizzbuzz)))))
    )
    (fizzbuzz (cdr lst) (append emptyList (car lst)))         

(fizzbuzz '(1 2 3 4 5) '(0))

请记住我是新人。我的教授希望我们使用lisp练习递归。该程序应该将不能被5或3整除的数字添加到列表中。 那些被3整除的东西会像这样被插入到列表中(3 fizz)。那些被5整除的人:(5嗡嗡声)。两者都可以分割的(15 fizzbuzz)。我如何从函数中返回新列表?另外,为什么我会收到帖子标题中列出的错误?

1 个答案:

答案 0 :(得分:2)

由于最后一个表达式(fizzbuzz (cdr lst) (append emptyList (car lst))),您收到此错误。

第一轮(fizzbuzz '(1 2 3 4 5) '(0))变为(fizzbuzz '(2 3 4 5) '(0 . 1)),然后它会尝试(append '(0 . 1) 2)append可以处理点列表和原子作为最后一个参数,但是当不是最后一个参数时它不能附加点列表。它应该用1做什么?

也知道你没有停止条件,并且单独的if无条件地运行到另一个if所以对于15它将首先递归到第一个,然后扔掉那个结果。然后它将在第二个递归,只是扔掉那个值。然后无条件地它会在最后一次递归。我非常确定您只希望调用其中一个,并使用if-elseif-else执行此操作,其中lisp版本为cond

(cond 
  (p1 c1)      ; if p1 then c1
  (p2 c2 c2b)  ; elseif p2 then c2 and c2b (last expression becomes the result)
  (p3 c3)      ; elseif p3 then c3
  (t  a4))     ; else a4