4

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

(> 2 1)

类似于:

(2 greater 1)

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

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

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

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

4

3 回答 3

7

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

于 2012-10-04T18:37:04.280 回答
5

表达式(2 greater 1)是一个应用程序。它扩展到(#%app 2 greater 1). 您必须定义自己的版本#%app并将其命名为my-%app. 如果greater存在交换第一个和第二个参数,否则只扩展为标准#%app

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

于 2012-10-04T17:53:39.860 回答
1

您可能认为“卷曲中缀”表示法就是您想要的。只需用 {...} 包围一个列表,您可以按中缀顺序而不是前缀顺序编写列表内容(阅读器对其进行转换)。因此,如果您编写 {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 之上。

于 2013-03-14T22:51:24.483 回答