重新定义内置方案,但仅当用作特定过程的参数时?
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))))))
不过,我真的反对这一点,因为这确实会扰乱用户对正在发生的事情的期望。也许你可以解释一下 为什么 你想这样做?
如何仅在过程 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))))))
不过,我真的反对这一点,因为这确实会扰乱用户对正在发生的事情的期望。也许你可以解释一下 为什么 你想这样做?