我想更改以下表达式的语法:
(> 2 1)
类似于:
(2 greater 1)
我的第一次尝试是以下宏:
(define-syntax greater
(lambda (x)
(syntax-case x (greater)
[(a greater b)
(syntax (> a b))])))
使用此宏失败:“语法错误:更大”
我一直在浏览一些 Scheme 文档,但我找不到解决方法。
在 Racket 中,已经存在允许通用中缀表示法的阅读器功能:在函数或宏名称之前和之后写一个点:(2 . > . 1)
有点冗长(点必须用空格包围),但我喜欢它并使用它很多。有关更多信息,请参阅文档。
表达式(2 greater 1)
是一个应用程序。它扩展到(#%app 2 greater 1)
. 您必须定义自己的版本#%app
并将其命名为my-%app
. 如果greater
存在交换第一个和第二个参数,否则只扩展为标准#%app
。
要使用您的新应用程序,您必须从定义它的文件(模块)中将其导出,然后将其导入您需要特殊应用程序语法的模块中。
您可能认为“卷曲中缀”表示法就是您想要的。只需用 {...} 包围一个列表,您可以按中缀顺序而不是前缀顺序编写列表内容(阅读器对其进行转换)。因此,如果您编写 {x + ,y},则阅读器会将其映射到 (+ x ,y)。
Curly-infix 在 SRFI-105 中定义:http ://srfi.schemers.org/srfi-105/
我知道当前版本的 GNU guile 至少实现了它。
SRFI-110 ( http://srfi.schemers.org/srfi-110/ )的“甜蜜表达”符号建立在 SRFI-105 之上。