Macros 如何在可移植方案中编写回指宏?
我正在探索Scheme宏,但我一直无法找到一种编写回指宏的可移植方法 我正在尝试编写一个Macros 如何在可移植方案中编写回指宏?,macros,scheme,Macros,Scheme,我正在探索Scheme宏,但我一直无法找到一种编写回指宏的可移植方法 我正在尝试编写一个每个it宏,以便此代码: (each-it (list 1 2 3) (display it)) 扩展到: (for-each (lambda (it) (display it)) (list 1 2 3)) 我用语法规则编写了一个宏,但当我试图使用它时,它会给我一个关于未定义标识符的错误 (define-syntax each-it (syntax-r
每个it
宏,以便此代码:
(each-it (list 1 2 3)
(display it))
扩展到:
(for-each (lambda (it)
(display it))
(list 1 2 3))
我用语法规则编写了一个宏
,但当我试图使用它时,它会给我一个关于未定义标识符的错误
(define-syntax each-it
(syntax-rules ()
((each-it lst body)
(for-each (lambda (it) body)
lst))))
提到定义语法参数
,它似乎只是一个骗局。给出了一些Scheme代码示例,但代码示例不会在R5RS
模式下的DrRacket中运行(我认为是方括号?)
但是R5R中没有它,我不知道我是否可以依赖它
我能否以完全可移植的方式编写我的
每个it
宏?如果没有,编写我的宏时最常用的宏系统功能是什么?这应该是便携式的,至少在R6RS中是这样的:
(define-syntax each-it
(lambda (x)
(syntax-case x ()
((_ lst body)
(with-syntax ((it (datum->syntax x 'it)))
#'(for-each (lambda (it) body) lst))))))
是的,假设R6RS对您来说足够便携,您可以用便携方式编写它。(R7RS上的情况就不一样了,它目前只有
语法规则
,现在还不清楚大型语言中会包含什么,或者什么时候会出现这种情况。)有关如何做到这一点,请参阅uselpa
那我为什么还要写另一个答案呢?因为实际上这样做是个坏主意。这是一个坏主意,不是在某种模糊的学术意义上,对大多数现实世界的代码来说都无关紧要——从某种意义上说,这是一个坏主意,以后可能会咬到你。我知道“纸”让它看起来很吓人,但至少要读一读你在另一个问题中提到的前两部分。具体来说,第1.2节显示了您将遇到的问题。然后,第2节介绍了如何“正确地”执行此操作,这使得编写扩展到宏用途的宏变得单调乏味。在这一点上,采取“保持卫生”是很有吸引力的,但在第2节的末尾,你会看到为什么这也不起作用
IMO的底线是,除非您有语法参数或类似的东西,否则不要这样做。也许唯一的例外(这可能是你的情况)是当宏是你打算自己使用的东西,你永远不会提供给其他人。R5RS@Rptx yep中有一个宏部分,但我看不到该部分有任何破坏卫生的功能。简单的解决方案是。谢谢,那篇论文是一篇关于计划中卫生的精彩综述。