Macros Scheme/Racket-宏更改过程和参数的顺序

Macros Scheme/Racket-宏更改过程和参数的顺序,macros,scheme,racket,Macros,Scheme,Racket,我想更改以下表达式的语法: (> 2 1) 例如: (2 greater 1) 我的第一次尝试是以下宏: (define-syntax greater (lambda (x) (syntax-case x (greater) [(a greater b) (syntax (> a b))]))) 使用此宏失败,原因是:“中的语法错误:更大” 我一直在浏览一些Scheme文档,但找不到方法。表达式(2大于1)是一个应用程序。它扩展到(#%a

我想更改以下表达式的语法:

(> 2 1)
例如:

(2 greater 1)
我的第一次尝试是以下宏:

(define-syntax greater 
  (lambda (x)
    (syntax-case x (greater)
      [(a greater b)
       (syntax (> a b))])))
使用此宏失败,原因是:“中的语法错误:更大”

我一直在浏览一些Scheme文档,但找不到方法。

表达式
(2大于1)
是一个应用程序。它扩展到
(#%app 2大于1)
。您必须定义自己版本的
#%app
并调用它,比如说,
my-%app
。如果出现了
greater
,则交换第一个和第二个参数,否则只需扩展到标准的
#%app


要使用新应用程序,必须从定义它的文件(模块)中导出它,然后将它导入到需要特殊应用程序语法的模块中。

在Racket中,已经存在一个允许通用中缀符号的读卡器功能:在函数或宏名前后写一个点:
(2.>.1)
有点冗长(圆点必须用空格包围),但我喜欢并经常使用它。有关更多信息,请参阅。

您可能认为“卷曲中缀”符号就是您想要的。只要用{…}包围一个列表,就可以按中缀顺序而不是前缀顺序写入列表内容(读取器对其进行转换)。所以如果你写{x+,y},读取器会把它映射到(+x,y)

卷曲中缀在SRFI-105中定义:

我知道GNU guile的当前版本至少实现了它


SRFI-110()的“sweet expression”符号建立在SRFI-105之上。

参见:以获取执行Jens建议的一种方法的示例。我已经试着把源代码很好地记录下来,所以我很感激任何建议。我认为这是一个更好的解决方案。从语法上可以清楚地看出它是常用的前缀表示法还是特殊的中缀运算符。此外,
(对一些列表进行排序