Macros 如何在可移植方案中编写回指宏?

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

我正在探索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-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中有一个宏部分,但我看不到该部分有任何破坏卫生的功能。简单的解决方案是。谢谢,那篇论文是一篇关于计划中卫生的精彩综述。