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

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 上

Vue js 子组件中未定义的道具。但仅在其脚本中

拆分音频文件,但仅在暂停中

在 GCC 中将 0 参数传递给可变参数宏失败,但仅在 C++ 中?

startUpdatingLocation 仅在 wifi 开启时有效,但仅在 3G 开启时无效

卸载特定的 UITableViewCells