Elisp 易错点清单(AI 写 Emacs 插件参考)
内容提要
本文列出了编写 Elisp 时常见的错误及其解决方案,包括 cl-defstruct 的 copy-* 函数不支持关键字参数、字符串直接使用 aref 索引、旧版 Emacs 中缺少 string<= 函数等。建议在编写代码前检查这些问题,以避免运行时错误,并强调数学公式测试期望值应从参考实现提取,以避免心算错误。
关键要点
-
cl-defstruct 的 copy-* 函数只接受一个参数,不支持关键字覆盖。
-
字符串可以直接使用 aref 索引,不需要先转为字符向量。
-
string<= 在旧版 Emacs 中不存在,需用 (not (string> ...)) 替代。
-
在 Org buffer 中遍历时应使用 org-map-entries,避免死循环问题。
-
Org 的写入 API 在 batch 模式下需确认 heading 结构完整,以防交互提示。
-
数学公式的测试期望值应从参考实现提取,避免心算错误。
-
公式在边界条件下可能有反直觉行为,需先分析再写测试。
-
每写完一个模块应立即进行加载验证,以捕获潜在错误。
-
浮点结果比较时应使用容差,而非精确相等。
延伸问答
cl-defstruct 的 copy-* 函数有什么限制?
cl-defstruct 的 copy-* 函数只接受一个参数,不支持关键字覆盖。
如何在 Elisp 中正确索引字符串?
在 Elisp 中,可以直接使用 aref 索引字符串,无需先转为字符向量。
在旧版 Emacs 中如何处理字符串比较?
在旧版 Emacs 中,string<= 不存在,可以用 (not (string> ...)) 代替。
如何避免 Org buffer 中的死循环?
在 Org buffer 中遍历时,应使用 org-map-entries,避免使用 re-search-forward + org-back-to-heading。
数学公式的测试期望值应该如何处理?
数学公式的测试期望值应从参考实现提取,避免心算错误。
编写 Elisp 代码后,如何验证代码的正确性?
每写完一个模块应立即进行加载验证,以捕获潜在错误。