2012-10-04 44 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之上。