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は、最初と2番目の引数を交換します。それ以外の場合は、標準に展開します#%app

新しいアプリケーションを使用するには、それを定義したファイル(モジュール)からエクスポートしてから、特別なアプリケーション構文が必要なモジュールにインポートする必要があります。

于 2012-10-04T17:53:39.860 に答える
1

「中置記法」の表記が必要な場合があります。リストを{...}で囲むだけで、リストの内容をプレフィックス順ではなくインフィックス順に書き込むことができます(リーダーがそれを変換します)。したがって、{x +、y}と書くと、リーダーはそれを(+ x、y)にマップします。

Curly-infixはSRFI-105で定義されています:http ://srfi.schemers.org/srfi-105/

私は、GNUguileの現在のバージョンが少なくともそれを実装していることを知っています。

SRFI-110の「甘い表現」表記(http://srfi.schemers.org/srfi-110/)は、SRFI-105の上に構築されています。

于 2013-03-14T22:51:24.483 に答える