首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >总是得到“返回-从:没有一个块名为NIL当前可见”

总是得到“返回-从:没有一个块名为NIL当前可见”
EN

Stack Overflow用户
提问于 2019-10-30 16:40:30
回答 2查看 1.2K关注 0票数 1
代码语言:javascript
复制
(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当前可见。我试着把申报表挪来移去,但我不知道它意味着什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-30 16:49:27

  1. 请以Lisp方式缩进您的代码(这可以在许多编辑器中自动完成,比如Emacs):

(setf newlst (cons (car lst) newlst)) (print (car lst) newlst ) (print (Car lst ) newlst)) (setf lst (cdr Lst)(返回newlst)) (

  • Do setf (未事先声明的变量):(setf newlst '())这里指的是一个假设的全局变量newlst,但在某种功能上,你应该努力只拥有地方政府。您可以使用let在块中引入变量,如下所示:

(让((新)列表()).;这里您可以使用...)

  • (setf newlst (cons (car lst) newlst))新列表(如果需要)也可以编写(push (car lst) newlst),但请不要使用缩写过短的名称;您可以使用listnew-list,因为example.

  • return返回了名为nil的封闭块,但是这里没有这样的块。相反,defun引入了一个名为与您定义的函数类似的隐式块,即您隐式地:

(街区.)

因此,如果您想从它返回,您将需要执行(return-from take-n newlst).

  • BUT,,您不需要返回,因为函数中的最后一个计算形式是与函数调用相关联的值。
票数 8
EN

Stack Overflow用户

发布于 2019-10-30 16:52:50

您不需要使用RETURN。在Lisp中,函数体中的最后一个表达式将自动返回,因此只需将变量放在函数的末尾即可。另外,您应该使用LET绑定局部变量,而不是分配全局变量。

代码语言:javascript
复制
(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这样的循环宏。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58630068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档