为什么在 Lisp 中返回正确答案后得到不需要的 NIL?

Why getting unwanted NIL after right answer is returned in Lisp?

我正在编写一个名为 pellnumbers 的 lisp 程序来 return 一个拼写数字列表。但是,我总是在测试结果后立即得到 NIL。我是 Lisp 的新手,对它的错误不是很了解。你能帮帮我吗?谢谢! 下面是我的代码

;define a function of how to compute a pell number
(defun P (n)
    (cond 
        ((= n 0) 0)
        ((= n 1) 1)
        (t (+ (* 2 (P (- n 1))) (P (- n 2))))))

;define an iterative function to return a sequence of pell numbers
(defun pellnumbers (n)
    (prog
        (setq res '())
        (loop for i from 0 to n
              do (setq res (append res (list (P i))))
        )
        (print res)))

;test cases
(print (pellnumbers 0))
(print (pellnumbers 6))
(print (pellnumbers 9))

这是我得到的结果

(0) 
NIL 
(0 1 2 5 12 29 70) 
NIL 
(0 1 2 5 12 29 70 169 408 985) 
NIL 

NIL 不是错误。只是一段数据,既是符号又是空表的意思

一些代码提示:

不清楚你为什么使用 PROG 但你需要检查它的语法

PROG 的语法:

prog
    ({var | (var [init-form])}*)
  declaration*
  {tag | statement}*

您的代码缺少变量列表。格式 (setq res '()) 错误。

为什么不直接使用 LET。

您需要正确缩进代码

示例缩进:

(defun pellnumbers (n)
  (prog
      (setq res '())
    (loop for i from 0 to n
          do (setq res (append res (list (P i)))))
  (print res)))

这样更容易发现语法错误。同样:您对 PROG 的使用是 a) 错误的 和 b) 不需要的。

你的代码打印了两次

函数 pellnumbers 中有一个 print 语句,您的 测试用例 也有一个打印语句。

这就是打印两个值的原因。 pellnumbers 的结果始终是 NIL,因此对于代码中的任何测试用例,总是打印 NIL

请记住,最后评估的形式是 return 值。 print returns NIL,并且作为 progprog returns NIL 中的最后一个形式,成为return pellnumbers 的值。

使用 progprogn 还是 let 是个人喜好问题。