Lisp 读取器会报告无效语法,但无法指出问题真正所在。 例如,在对表达式求值时出现错误 ‘解析时遇到文件结束(End of file during parsing)’, 通常表示左括号(或方括号)过多。 读取器在文件末尾检测到括号不匹配,但无法确定应该在哪里补全右括号。 同样,‘无效读取语法:")"’ 表示右括号过多或缺少左括号, 但不会指出缺失的括号位置。 那么,该如何找到需要修改的地方?
如果问题不只是括号不匹配,一种实用技巧是:
在每个 defun 开头尝试按 C-M-e(end-of-defun,see Moving by Defuns in The GNU Emacs Manual),
观察光标是否移动到该 defun 理论上应该结束的位置。
如果不是,说明该 defun 内部存在问题。
然而,括号不匹配是 Lisp 中最常见的语法错误, 我们可以针对这类情况提供更具体的建议。 (此外,在开启 Show Paren 模式的情况下, 只需将光标在代码中移动,就可能发现不匹配的括号。)