仅当过程and作为过程fetch的参数被调用时,才能重新定义过程fetch
例如:
; this `and` returns #f
(and #t #f)
; this `and` returns "and a b"
(fetch (foo (bar (and "a" "b"))))我想编写一个宏来完成这个任务,但是我想不出如何在传递给and的任意参数树中编写一个匹配fetch的模式。
我使用鸡,并很高兴使用与鸡的支持一样多的R7RS。
发布于 2018-09-01 15:36:57
一个棘手的问题是: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))))))不过,我真的反对这一点,因为这将严重影响用户对正在发生的事情的期望。也许您可以更多地解释一下,为什么想要这样做?
https://stackoverflow.com/questions/52123798
复制相似问题