Common Lisp Error:未声明的自由变量

时间:2012-06-08 00:20:09

标签: error-handling lisp common-lisp

我有一个我正在尝试编译的函数,但是我在过去的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-listcomplete-filltotal-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.

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

根据wvxvw的建议,我的代码可能在某处丢失了parens,我用C-M-f滚动浏览了我的文件。它顺利通过,现在我开始放弃了。最后,为了确保,我从这个问题中复制了代码并将此前的函数替换为此处的函数。不知何故,它现在有效。我不知道导致问题的是什么,但它现在正常运作。感谢大家的投入。