我以前不止一次有过这个问题。
是否可以使用具有相同名称的包装器在本地f
f
透明地隐藏函数?
即,如何在本地将 (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)