为什么在 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
,并且作为 prog
、prog
returns NIL
中的最后一个形式,成为return pellnumbers
的值。
使用 prog
、progn
还是 let
是个人喜好问题。
我正在编写一个名为 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
,并且作为 prog
、prog
returns NIL
中的最后一个形式,成为return pellnumbers
的值。
使用 prog
、progn
还是 let
是个人喜好问题。