(defun take-n (lst i)
(setf newlst '())
(dotimes (n i)
(setf newlst (cons (car lst) newlst))
(print (cons (car lst) newlst))
(setf lst (cdr lst)))
(return newlst))
(print (take-n '(1 2 3) 2))这给了我一个错误的返回-从:没有一个块名为NIL当前可见。我试着把申报表挪来移去,但我不知道它意味着什么。
发布于 2019-10-30 16:49:27
(setf newlst (cons (car lst) newlst)) (print (car lst) newlst ) (print (Car lst ) newlst)) (setf lst (cdr Lst)(返回newlst)) (
setf (未事先声明的变量):(setf newlst '())这里指的是一个假设的全局变量newlst,但在某种功能上,你应该努力只拥有地方政府。您可以使用let在块中引入变量,如下所示:(让((新)列表()).;这里您可以使用...)
(setf newlst (cons (car lst) newlst))新列表(如果需要)也可以编写(push (car lst) newlst),但请不要使用缩写过短的名称;您可以使用list和new-list,因为example.
return返回了名为nil的封闭块,但是这里没有这样的块。相反,defun引入了一个名为与您定义的函数类似的隐式块,即您隐式地:(街区.)
因此,如果您想从它返回,您将需要执行(return-from take-n newlst).
发布于 2019-10-30 16:52:50
您不需要使用RETURN。在Lisp中,函数体中的最后一个表达式将自动返回,因此只需将变量放在函数的末尾即可。另外,您应该使用LET绑定局部变量,而不是分配全局变量。
(defun take-n (lst i)
(let ((newlist '()))
(dotimes (n i)
(setf newlst (cons (car lst) newlst))
(print (cons (car lst) newlst))
(setf lst (cdr lst)))
newlst))您所得到的错误是因为DEFUN在函数体周围放置了一个命名块,因此您需要使用(return-from take-n newlst)。return只能用于从未命名的块(一个名为NIL的块)返回;这些块会自动围绕DO这样的循环宏。
https://stackoverflow.com/questions/58630068
复制相似问题