Aar*_*ron 7 lisp scope lexical-scope
我是lisp的新手,我正在编写一些简单的程序来熟悉它.我正在做的一件事是编写一个阶乘方法的递归和迭代版本.但是,我遇到了一个问题,似乎无法解决它.
我在Lisp看到了一个类似的错误 :CHAR既没有声明也没有绑定 但是实际上没有达到解决方案,除了OP意识到他犯了"打字错误".在REPL中我可以使用setf函数,它工作正常.我也在使用带有emacs的LispBox.我很感激任何建议!
(defun it-fact(num)
(setf result 1)
(dotimes (i num)
(setf result (* result (+ i 1)))
)
)
Run Code Online (Sandbox Code Playgroud)
IT-FACT中的警告:RESULT既未声明也未绑定,它将被视为已声明为SPECIAL.
有一些错误或不太好的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
Run Code Online (Sandbox Code Playgroud)
可能的版本:
(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
Run Code Online (Sandbox Code Playgroud)
在Lisp中,必须使用LET或其他创建局部变量的形式显式声明局部变量.这与Python或JavaScript不同,其中赋值给变量在当前词法范围内创建变量.
您的示例可以像这样重写:
(defun it-fact(num)
(let ((result 1))
(dotimes (i num)
(setf result (* result (+ i 1))))))
Run Code Online (Sandbox Code Playgroud)
一个偏离主题的评论:将结束括号放在不同的行上是没有意义的.
你需要绑定变量'result' - 例如使用'let' - 在开始使用它之前:
(defun it-fact(num)
(let ((result 1))
(dotimes (i num)
(setf result (* result (+ i 1))))))
Run Code Online (Sandbox Code Playgroud)
有关详细信息,您可能需要阅读此内容 ......