仅当将过程and
作为过程fetch
的参数调用时,才能重新定义它吗?
例如:
; this `and` returns #f
(and #t #f)
; this `and` returns "and a b"
(fetch (foo (bar (and "a" "b"))))
我想编写一个宏来执行此操作,但是我不知道如何编写一种模式,该模式在传递给and
的任意参数树中的任何位置都与fetch
匹配。
我正在使用Chicken,并且很高兴能使用Chicken支持的R7RS。
答案 0 :(得分:1)
一个nitpick: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))))))
我真的反对这一点,因为这确实会与用户对正在发生的事情的期望相混淆。也许您可以进一步说明为什么要这样做?