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

jua*_*ana 3 macros scheme racket

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

(> 2 1)
Run Code Online (Sandbox Code Playgroud)

类似于:

(2 greater 1)
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试是以下宏:

(define-syntax greater 
  (lambda (x)
    (syntax-case x (greater)
      [(a greater b)
       (syntax (> a b))])))
Run Code Online (Sandbox Code Playgroud)

使用此宏失败:"语法错误:更大"

我一直在浏览一些Scheme文档,但我找不到这样做的方法.

Pau*_*fer 7

在Racket中,已经存在一个读取器功能,允许使用通用中缀表示法:在函数或宏名称之前和之后写一个点:(2 . > . 1)它有点冗长(点必须用空格包围),但我喜欢它并使用它很多.有关更多信息,请参阅文档.


soe*_*ard 5

表达式(2 greater 1)是一个应用程序.它扩展到(#%app 2 greater 1).你必须定义自己的版本,#%app然后调用它my-%app.如果greater存在则交换第一个和第二个参数,否则只需扩展到标准#%app.

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

  • 请参阅:https://github.com/dyoo/infix-syntax-example以获取Jens建议的一种方法示例.我试图很好地记录源代码,所以我很感激任何建议. (3认同)