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

时间:2012-10-04 17:06:17

标签: macros scheme racket

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

(> 2 1)

类似于:

(2 greater 1)

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

(define-syntax greater 
  (lambda (x)
    (syntax-case x (greater)
      [(a greater b)
       (syntax (> a b))])))

使用此宏失败的原因是:“语法错误:更大”

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

3 个答案:

答案 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之上。