【问题标题】:Scheme/Racket - Macro to change order of procedure an arguments方案/球拍 - 用于更改过程顺序和参数的宏
【发布时间】:2012-09-25 18:46:11
【问题描述】:

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

(> 2 1)

类似于:

(2 greater 1)

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

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

使用此宏失败:“bad syntax in: greater”

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

【问题讨论】:

    标签: macros scheme racket


    【解决方案1】:

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

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

    【讨论】:

    • 请参阅:github.com/dyoo/infix-syntax-example 以获取执行 Jens 建议的一种方法的示例。我已经尝试很好地记录源代码,所以我会很感激任何建议。
    【解决方案2】:

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

    【讨论】:

    • 我认为这是一个更好的解决方案。从语法中可以清楚地看出它是通常的前缀表示法还是特殊的中缀运算符。此外,(sort some-list <) 仍然可以使用
    【解决方案3】:

    您可能认为“curly-infix”符号就是您想要的。只需用 {...} 包围一个列表,您可以按中缀顺序而不是前缀顺序编写列表内容(阅读器对其进行转换)。因此,如果您编写 {x + ,y},则阅读器会将其映射到 (+ x ,y)。

    卷曲中缀在 SRFI-105 中定义:http://srfi.schemers.org/srfi-105/

    我知道当前版本的 GNU guile 至少实现了它。

    SRFI-110 (http://srfi.schemers.org/srfi-110/) 的“甜蜜表达”表示法建立在 SRFI-105 之上。

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 2012-04-24
      • 2015-12-20
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多