0

and只有当它作为过程的参数调用时,我才能重新定义过程fetch

例如:

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

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

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

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

4

1 回答 1

1

一个挑剔: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))))))

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

于 2018-09-01T15:36:57.247 回答