当我定义一个宏并且只为临时变量使用一个非常稀有的名称时会出现什么问题?

Le *_*ous 8 lisp macros scope

让Over Lambda第3章"不需要的捕获"说:

"当然,我们可以想到足够罕见的名称,以便问题永远不会出现.是的,在许多情况下,软件包和智能变量命名可以解决变量捕获的问题.但是,最严重的变量捕获错误不会直接出现在代码中由程序员创建的.大多数变量捕获的问题只有表面时,其他宏使用宏的方式,你没有预料到(与宏相结合). "

然后它没有给我一个大胆的部分的例子.这样的例子之一是什么?设想一个假想的Lisp开发团队,其疯狂的老板禁止使用gensym或任何创建无符号符号的东西,程序员只需投掷字母数字骰子就可以得到随机变量名称,如temp-27s63f8sk2n或sum-3t84hj4df,只要他们错过了gensym.什么是团队陷入困境的例子?

说到这一点,Emacs 24.3.1定义了dotimes和dolist而不使用uninterned符号.奇怪的.

d11*_*wtq 1

当您在其他上下文中重复使用自己的宏并且巧妙地命名空间的变量实际上是多余的时,就会出现问题,因为它们都位于同一命名空间中。

我可以想到一个例子,当使用一个闭包访问封闭中的变量时(let),但传递给一个宏,该宏也使用封闭(let)定义一个名称冲突的“安全”变量。这是一个人为的例子,抱歉,我现在无法想到现实世界的案例。

(defmacro my/a (x)
  (let ((my/safe-name x))
    `(progn ,(my/b (lambda () my/safe-name))
            ,my/safe-name)))

(defmacro my/b (f)
  `(let ((my/safe-name 4))
     (when (evenp (funcall ,f))
       (print "F is even!"))))

(my/a 3) ; will print "F is even", but it shouldn't
Run Code Online (Sandbox Code Playgroud)