4

我有一个我正在尝试编译的函数,但在过去的 30 分钟里我一直在努力弄清楚为什么这段代码会给我一个Undeclared free variable错误。我正在使用 Emacs,但无法解释为什么会出现此错误。

(defun pretty-all(res diff)
  (let* ((v-list (blank-unit-list res))
         (c-list (blank-unit-list res)))
    (complete-fill c-list v-list res (total-res res) diff)
    (format t
            "Resistance is ~S~% Voltage is ~S~% Current is ~S~%"
            res v-list c-list)))

blank-unit-list, complete-fill,total-res都是我自定义的函数。

我很确定这个错误与我构建代码的方式有关,但正如我之前所说,我不知道是什么。


从 Emacs 复制:

3 compiler notes:

CircuitFunctions.lisp:61:64:
  warning: Undeclared free variable RES

CircuitFunctions.lisp:61:70:
  warning: Undeclared free variable V-LIST

CircuitFunctions.lisp:61:81:
  warning: Undeclared free variable C-LIST

Compilation failed.
4

2 回答 2

0

如果您使用的是 SLIME(看起来您可能是,因为您使用的是 lispbox),应该有一种方法可以从编译器注释转到它发生的源代码中的位置。我不记得确切的组合键(如果你在我面前放一个带有粘液的 emacs,我可能会按下它,但这并不意味着我有意识地记住它是什么,不幸的是)。检查绑定什么键 slime-next-error 可能会有所帮助,并且 SLIME 菜单中可能有一些东西)。

通过查看编译器注释中的行号(我认为 :61:64 等是源行和列),实际发出的错误与您粘贴的代码(根本)不匹配。我看不到有所有v-list,res并且c-list按顺序排列的行。不过,这可能是由于宏扩展造成的(作为旁注,它看起来好像complete-fill要么是宏,要么破坏性地修改了它的两个参数)。

于 2012-06-09T06:46:09.907 回答
0

根据 wvxvw 的建议,即我的代码可能在某处缺少括号,我使用C-M-f. 它毫无问题地通过了,现在我开始放弃了。最后,为了确保,我复制了这个问题的代码,并用这里的函数替换了我以前的函数。不知何故,它现在工作。我不知道是什么导致了问题,但它现在可以正常工作。感谢大家的意见。

于 2012-06-12T14:23:03.500 回答