我正在开发一个程序项目,该程序采用正则表达式,将它们转换为相应的 NFA,然后允许您测试 NFA 是否接受某些输入字符串。
我正在使用函数 gensym
生成对应于 NFA 状态的数字,只是我喜欢使用 *gensym-counter 只获取它的数字部分*
,一切正常,但突然间我遇到了这个奇怪的问题:
我用来调用gensym
的函数是这个
(defun gensympp ()
(let ((x (gensym)))
*gensym-counter*))
所以它只返回在 x
上调用 gensym 后增加的数字,所以我可以将它用于 NFA 状态,今天我正在运行一些最终测试,突然函数没有增加 *gensym-counter*
所以每个状态都只是起始数字(在函数开始时用 let 设置),解决这个问题的唯一方法似乎是放一个 (defparameter x 1)
(数字无关紧要)在代码的开头,随着 gensym 的正常更新,一切都像以前一样正常工作,我真的不知道是什么原因造成的,因为我只做了一些小的格式调整对于一周前运行良好的代码,我也是 lisp 的新手,所以可能只是忽略了一些明显的东西,如果需要,我可以在使用 gensym 的地方发布其余代码,但甚至只是调用来自监听器的函数 (gensympp)
本身不会增加数字
非常感谢您的帮助
最佳答案
编译器正在优化对 gensym
的调用,因为您从不使用 x
。您可以通过将变量作为第二个值返回来欺骗它认为该变量已被使用。
(defun gensympp ()
(let ((x (gensym)))
(values *gensym-counter* x)))
关于lisp - LISP gensym 和 Let 函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59617616/