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

Redefine a scheme built-in, but only when used as an argument to a specific procedure?

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

例如:

; this `and` returns #f
(and #t #f)

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

我想编写一个宏来执行此操作,但我不知道如何编写一个模式来匹配传递给 fetch 的任意参数树中的任何位置 and

我正在使用 Chicken,并且很乐意使用 Chicken 支持的尽可能多的 R7RS。

吹毛求疵: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))))))

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