用于在循环中定义变量的 Lisp 循环中的语法错误

Syntax Error in Lisp Loop for defining variables in a loop

我是初学者,正在学习Lisp。我想使用循环语句将循环转到使用k的i值,但是出现以下错误。我觉得我括号写对了,但是我不知道为什么会出现这个错误。

 LOOP: illegal syntax near (SETQ K (1+ K)) in
      (LOOP WHILE (< K I) (SETQ K (1+ K)))

下面是我的代码。

(DEFUN promising (i)
    (setq k 1)
    (loop while (< k i) (setq k (1+ k)))
    (return-from promising 1)
 )

promising(2)

我看到几个小东西:

  1. loop 语法不是 100% 正确,您漏掉了一个 do 关键字
(loop while (< k i) do (setq k (1+ k)))
                    ^^
                    do keyword is missing!
  1. 函数调用的语法 promising(2) 也不正确
(promising 2)
  1. return-from事情不寻常

第一个原因是 return 值始终是 1,在您的情况下,您可能希望 return k.

(DEFUN promising (i)
    (setq k 1)
    (loop while (< k i) (setq k (1+ k)))
    (return-from promising 1))
                           ^
                           Always return 1

第二个原因是您不需要 return-fromdefun 形式的最后一个值将提供给函数调用者。

(DEFUN promising (i)
    (setq k 1)
    (loop while (< k i) do (setq k (1+ k)))
    k)
    ^
    The last value will be returned to the function caller
  1. k 变量应在本地 定义,而不是使用全局 定义

最终代码可能是这样的:

(defun promising (i)
  (let ((k 1))
    (loop while (< k i) do (setq k (1+ k)))
    ;; return value
    k))

(promising 2)

这应该return:

2