重新定义内置的方案,但仅在用作特定过程的参数时?



如何重新定义过程and仅当它作为过程fetch的参数调用时?

例如:

; this `and` returns #f
(and #t #f)
; this `and` returns "and a b" 
(fetch (foo (bar (and "a" "b"))))

我想编写一个宏来执行此操作,但我无法弄清楚如何编写与传递给fetch的任意参数树中的任何地方and匹配的模式。

我正在使用 Chicken,并且很高兴使用尽可能多的 R7RS,因为 Chicken 支持。

吹毛求疵:and不是一个过程,它是一个语法(想想看:一旦遇到第一个#f,评估就会停止(。

但无论如何,我认为你试图做的事情不可能通过覆盖and来实现。您需要将fetch转换为宏。与其尝试扫描输入并替换and,我会使用不卫生的let在本地覆盖and的含义。 有点像这样:

(define my-local-and ...)
(define the-real-fetch ...)
(define-syntax fetch
(ir-macro-transformer
(lambda (e i c)
`(let ((,(i 'and) my-local-and))
(the-real-fetch ,@(cdr e))))))

不过,我真的反对这一点,因为这确实会扰乱用户对正在发生的事情的期望。也许你可以解释更多关于为什么要这样做?

相关内容

  • 没有找到相关文章

最新更新