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

时间:2018-08-31 23:54:03

标签: macros scheme chicken-scheme r7rs

仅当将过程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。

1 个答案:

答案 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))))))

我真的反对这一点,因为这确实会与用户对正在发生的事情的期望相混淆。也许您可以进一步说明为什么要这样做?