当前位置:  开发笔记 > 编程语言 > 正文

Lisp警告:xx既未声明也未绑定,它将被视为声明为SPECIAL

如何解决《Lisp警告:xx既未声明也未绑定,它将被视为声明为SPECIAL》经验,为你挑选了3个好方法。

我是lisp的新手,我正在编写一些简单的程序来熟悉它.我正在做的一件事是编写一个阶乘方法的递归和迭代版本.但是,我遇到了一个问题,似乎无法解决它.

我在Lisp看到了一个类似的错误 :CHAR既没有声明也没有绑定 但是实际上没有达到解决方案,除了OP意识到他犯了"打字错误".在REPL中我可以使用setf函数,它工作正常.我也在使用带有emacs的LispBox.我很感激任何建议!

(defun it-fact(num)
  (setf result 1)
  (dotimes (i num)
    (setf result (* result (+ i 1)))
  )
)

IT-FACT中的警告:RESULT既未声明也未绑定,它将被视为已声明为SPECIAL.



1> Rainer Joswi..:

有一些错误或不太好的Lisp风格:

(defun it-fact(num)                      ; style: use a space before (
  (setf result 1)                        ; bad: variable RESULT is not introduced
  (dotimes (i num)
    (setf result (* result (+ i 1)))     ; bad: extra addition in each iteration
  )                                      ; style: parentheses on a single line
)                                        ; bad: no useful return value

可能的版本:

(defun it-fact (num)
  (let ((result 1))                      ; local variable introduced with LET
    (loop for i from 1 upto num          ; I starts with 1, no extra addition
      do (setf result (* result i)))
    result))                             ; result gets returned from the LET


谢谢你的建议!是的,我意识到dotimes从0开始,如果我没有在乘法中增加它,它总是会返回0 ...你的循环确实看起来更容易阅读.我想我把括号放在每一行都是这样的,因为我还习惯用c ++/java括起来,但我会尝试采用你的lisp练习.糟糕,是的,我忽略了回归,感谢你指出这些事情!

2> dmitry_vk..:

在Lisp中,必须使用LET或其他创建局部变量的形式显式声明局部变量.这与Python或JavaScript不同,其中赋值给变量在当前词法范围内创建变量.

您的示例可以像这样重写:

(defun it-fact(num)
  (let ((result 1))
    (dotimes (i num)
      (setf result (* result (+ i 1))))))

一个偏离主题的评论:将结束括号放在不同的行上是没有意义的.



3> Johan Kullbo..:

你需要绑定变量'result' - 例如使用'let' - 在开始使用它之前:

(defun it-fact(num)
  (let ((result 1))
    (dotimes (i num)
      (setf result (* result (+ i 1))))))

有关详细信息,您可能需要阅读此内容 ......

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有