相关疑难解决方法(0)

Common Lisp 本地影子函数同名

我以前不止一次有过这个问题。

一般问题

是否可以使用具有相同名称的包装器在本地ff透明地隐藏函数

即,如何在本地将 (f 包裹的参数...) 扩展为 (f args...)?

Flet 似乎允许我们这样做,但有局限性,即生成的包装器不可设置。是否有可能在不诉诸舰队的情况下这样做?

理想情况下,会有一个宏让我们编写“包装”f调用,并将代码扩展为原始的“非包装”f调用。

起初我相信macrolet可能是这样,因为它在文档中说它首先扩展宏然后在扩展形式上应用setf,但我无法使用它(继续阅读下面)。

动机

这在某些参数是隐式的并且不应一遍又一遍地重复以获取更多 DRY 代码的上下文中很有用。

我之前的问题 (let-curry) 中有一个特定的例子。试图“自动”分配函数的一些参数(let-curry)。

船队注意事项

我在那里得到了一些很好的答案,但是,我遇到了一些限制。通过使用 flet 来完成函数名称的这种局部“阴影”到其上的包装器,此类包装器不可设置,因此,此类包装器不能像原始函数一样灵活使用,只能读取值,而不是写入.

具体问题

通过上面的链接,如何编写宏 flet-curry 并使包装函数可设置?

奖励:该宏能否以 0 运行时开销将包装的调用扩展到原始调用?

我尝试在该帖子中选择答案并使用 macrolet 而不是 flet 无济于事。

谢谢!


更新

我被要求为这个通用问题举一个具体的例子。

代码中的愿望注释:

(locally (declare (optimize safety))
  (defclass scanner ()
    ((source
      :initarg :source
      :accessor source
      :type string)
     (tokens
      :initform nil
      :accessor tokens
      :type list)
     (start
      :initform 0
      :accessor start
      :type …
Run Code Online (Sandbox Code Playgroud)

macros common-lisp lisp-macros

2
推荐指数
1
解决办法
111
查看次数

标签 统计

common-lisp ×1

lisp-macros ×1

macros ×1