【发布时间】:2020-01-06 19:07:25
【问题描述】:
我正在为一个程序开发一个项目,该程序采用正则表达式,将它们转换为相应的 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?只需使用您自己递增的全局整数变量。 -
@Barmar 是的,我的第一个版本只使用了一个全局整数,但我们的教授不希望我们使用全局变量,所以我们必须使用 gensym,我应该提到这一点
-
您可以在函数周围使用词法变量:
(let ((counter 0)) (defun gensympp () (incf counter) counter)) -
但我想不出
*gensym-counter*没有被递增的原因。只要您在没有参数的情况下调用gensym,它就应该递增。 -
我想知道编译器是否正在优化对
gensym的调用,因为您从不使用该值,而忽略了它具有副作用的事实。
标签: lisp common-lisp