重新定义内置的方案,但仅在用作特定过程的参数时?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重新定义内置的方案,但仅在用作特定过程的参数时?相关的知识,希望对你有一定的参考价值。
我怎样才能重新定义and
程序,只要它被称为fetch
程序的参数?
例如:
; this `and` returns #f
(and #t #f)
; this `and` returns "and a b"
(fetch (foo (bar (and "a" "b"))))
我想写一个宏来做这个,但我无法弄清楚如何在传递给and
的任意参数树中的任何地方编写一个匹配fetch
的模式。
我正在使用鸡肉,我很乐意使用与鸡肉一样多的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))))))
不过,我真的反对这一点,因为这会让用户对正在发生的事情抱有很大的期望。也许您可以解释一下为什么要这样做?
以上是关于重新定义内置的方案,但仅在用作特定过程的参数时?的主要内容,如果未能解决你的问题,请参考以下文章
ntlm 身份验证的 Java URLConnection 错误,但仅在 Linux 和 Java 7 上
在 GCC 中将 0 参数传递给可变参数宏失败,但仅在 C++ 中?