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