LISP gensym 和 Let 函数的问题

Cri*_*ari 2 lisp common-lisp

我正在为一个程序开发一个项目,该项目采用正则表达式,将它们转换为相应的 NFA,然后允许您测试 NFA 是否接受某些输入字符串。

我正在使用该函数gensym生成与 NFA 状态相对应的数字,只有我喜欢使用它的数字部分*gensym-counter*,一切正常,但突然间我遇到了这个奇怪的问题:

我用来调用的函数gensym是这个

(defun gensympp ()
  (let ((x (gensym)))
    *gensym-counter*))
Run Code Online (Sandbox Code Playgroud)

所以它只在调用 gensym 后返回增加的数字,x所以我可以将它用于 NFA 状态,今天我正在运行一些最终测试,突然函数不再增加*gensym-counter*,所以每个状态只是起始数字(设置为让在函数的开头),解决此问题的唯一方法似乎是单独放置一个(defparameter x 1)是在代码的开头(数字无关紧要),这样 gensym 会正常更新,一切都像以前一样正常,我真的有不知道是什么原因造成的,因为我只对一周前完美运行的代码进行了小的格式调整,我也是 lisp 的新手,所以可能有一些明显的东西我忽略了,如果需要我可以发布我使用 gensym 但即使只是调用函数的其余代码(gensympp) 听者本身不会增加数量

非常感谢您的帮助

Bar*_*mar 5

编译器正在优化对 的调用,gensym因为您从不使用x. 您可以通过将其作为第二个值返回来欺骗它认为该变量已被使用。

(defun gensympp ()
  (let ((x (gensym)))
    (values *gensym-counter* x)))
Run Code Online (Sandbox Code Playgroud)