我正在为一个使用正则表达式的程序开发一个项目,将其转换为相应的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/

10-12 07:33