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