作者:王怡君3018 | 来源:互联网 | 2022-11-20 16:55
在lisp中写一个名为number(N)的函数,你必须使用一个非负整数N,并产生从1到包括N的所有整数的列表.
(defun numbers (N)
(if (<= N 0)
nil
(cons N nil)
(numbers (- N 1)))
我检查了一些问题,但大多数都使用循环和范围,但这个问题不允许我这样做,所以我必须使用递归代替:
这是我的代码,但是这段代码不断给我警告:
; caught STYLE-WARNING:
; The variable N is defined but never used.
;
; compilation unit finished
; caught 1 ERROR condition
; caught 1 STYLE-WARNING condition
我认为我的算法是正确的,但因为我是lisp的新手,我仍然不知道如何正确编写函数.如果有人能给我任何帮助,我们将不胜感激.
1> Rainer Joswi..:
IF通常具有通用语法,但也有例外
通常在Lisp中,如Common Lisp,if
运算符允许以下语法:
IF test-form then-form [else-form]
这意味着在Lisp中通常允许零或一个else形式.if
Common Lisp 就是一个例子.
在Emacs中,Lisp 允许多个其他形式.Emacs Lisp具有以下语法:
IF test-form then-form else-form*
这意味着在Emacs Lisp 中允许使用零个或多个其他形式.
因此:重要的是要提到您实际使用的语言和方言.
你的代码
a)假设您使用Common Lisp及其IF语法.
你的代码:
(defun numbers (N)
(if (<= N 0)
nil
(cons N nil)
(numbers (- N 1)))
您的代码存在问题,即有多个else子句.您需要编写一个具有单个else子句的版本.
b)假设您使用带有多个其他形式的IF语法的Emacs Lisp .
你的代码:
(defun numbers (N)
(if (<= N 0)
nil
(cons N nil)
(numbers (- N 1)))
这里(cons N nil)
允许表单,但没有效果.它的返回值没有使用,也没有副作用.你可以删除它,它没有任何区别.再说一遍:您需要如何将其效果与表单相结合(numbers (- N 1))
.
语法错误:缺少右括号
您的代码中还有另一个问题.s表达式不完整 - >缺少右括号:
(defun numbers (N)
(if (<= N 0)
nil
(cons N nil)
(numbers (- N 1)))
如您所见,最后缺少一个右括号.
因此,Lisp无法读取您的代码.
通常有两种方法可以避免这个问题:
计算括号并相应地设置它们
使用编辑器计算括号
大多数人更喜欢后者.