lisp - LISP gensym 和 Let 函数的问题

标签 lisp common-lisp

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

相关文章:

macros - Common Lisp 宏中的词法绑定(bind)

lisp - 在 Common Lisp 中扩展 &rest 参数

lisp - Common Lisp : first returns first, 但 last 返回最后一个列表——嗯?

inheritance - 检查对象的父类

lisp - 按顺序在单个列表上映射多个函数

recursion - 在 Common LISP 中递归地连接字符列表

LISP 动态函数?

format - 如何在 Lisp 中使用 FORMAT 输出波形符?

lisp - 普通口齿不清 : flush standard output

filesystems - Common Lisp 中独立于操作系统的路径名