2012-10-04 29 views
3

我想下面的表达式的语法改变:方案/球拍 - 宏来改变程序的顺序的参数

(> 2 1) 

喜欢的东西:

(2 greater 1) 

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

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

使用这个宏失败:“坏语法:更大的”

我一直在冲浪一些计划文档,但我无法找到办法。

回答

5

表达(2 greater 1)是一种应用。它扩大到(#%app 2 greater 1)。你必须定义你自己的版本#%app并称之为my-%app。如果存在greater,请交换第一个和第二个参数,否则只需展开标准#%app即可。

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

+3

请参阅:https://github.com/dyoo/infix-syntax-example关于Jens建议的一种方法的示例。我试图很好地记录源代码,所以我会很感激任何建议。 – dyoo

6

在球拍中,已经有一个阅读器功能允许通用中缀记法:在函数或宏名称前后写一个点:(2 . > . 1)它有点冗长(点必须被空格包围),但是我喜欢它并使用它很多。有关更多信息,请参阅the documentation

+0

我认为这是一个更好的解决方案。从语法上可以清楚地看出它是通常的前缀符号还是特殊的中缀运算符。此外,'(sort some list <)'仍然有效 – ReyCharles

0

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

卷毛,缀在SRFI-105定义为:http://srfi.schemers.org/srfi-105/

我知道GNU狡诈的当前版本,至少,实现它。

SRFI-110(http://srfi.schemers.org/srfi-110/)的“甜言蜜语”符号建立在SRFI-105之上。