如何重新定义过程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))))))
不过,我真的反对这一点,因为这确实会扰乱用户对正在发生的事情的期望。也许你可以解释更多关于为什么要这样做?