elisp: do 子句语法错误

elisp: syntax error on do clause

我正在写一个最大公因数函数。

我一直收到错误提示

"(if t (set q).....)" is not valid syntax

所以我把它注释掉了。但后来我被告知我的 do 语法无效。

syntax error on the 'do' clause

但我正在查看它,没有发现任何错误。为什么我的代码不起作用?

(defun myGCD (a b)
"My function, which returns the Greatest Common Factor"
(let ((x a) (y b) (z 0)) 
  (loop until (or (zerop x) (zerop y))
    do ( ;(progn
      ;(if t ;(< a b)
        ; If case
        ;((setq b (- b a)) (setq c a))
        ; Else case
        ;((setq a (- a b)) (setq c b))
      ;)
      ;(return c)
    );)
  )
)
)

(myGCD 10 20)

事实证明,您不能有一个空的 'do' 命令。这并不能解释为什么其他逻辑失败了,但我会再看一下。

您的代码中存在基本语法错误。

在 LOOP 形式中,您需要在 DO 之后有一个或多个复合形式。

(loop ... do () )
不允许

,因为 () 不是复合形式。

另请注意,括号不是按顺序对表达式进行分组。

((foo 1) (bar 2)) 

以上是无效的 Lisp。在 Scheme 中它可能是正确的,但是第一种形式需要 return 一个函数。

要对表达式进行分组,您需要像 progn 这样的东西,它允许嵌入形式和 returns 最后一个的值:

(progn
  (foo 4)
  (bar 2))

以上有效。