2011-01-10 5 views
6

でDSLを作成するために、どのように私はこのような何かを探してelispの中にDSLを作成したい:elispのは、グローバルな名前空間を持っているので、しかしelispの

(install 
;; do install 
) 

(uninstall 
;; do uninstall 
) 

を、これは良いアイデアではありません。そして、このような関数の接頭辞は、あまりにも醜いです。

(commands 
(install 
    ;; do install 
) 

(uninstall 
    ;; do uninstall 
) 

;; ... 
) 

をしかし、私はしたくないので、グローバル名前空間にアンをインストール:

(package-install 
;; do install 
) 

(package-uninstall 
;; do uninstall 
) 

は、だから私はこのように呼んで、すべてのコマンドは、コマンドに包まれる可能性が妥協案として考え私は何らかの理由でコマンドマクロ内でコマンドのすべての出現を例えば次のようなプレフィックス名に置き換えなければなりません:

これはこのようなハックのようです。さらに、ネストされたコマンドがあれば動作しません。

これにはどんな良い解決策がありますか?

ありがとうございます!

+0

YASnipperは関数に 'yas /'を付けるので、 'yas/expand'などとなります。私はそれがまったく醜いとは思わなかった。私が書いたtfs統合のためのコンベンションを採用したので、 'tfs/checkout'、' tfs/add'などがあります。これは正式なサポートがない場合、名前スコープを行うための安価で簡単な方法です。 – Cheeso

+0

文法の注釈: 'command'マクロの定義と同じように' setcar'/'setcdr'を使用しません。新しいコンスを作成してください(これはコードをきれいにします)。マクロエクスパンダが任意の方法で元のコードツリーを破壊的に変更した場合、どのような影響があるかわかりません。 – Dirk

答えて

8

installとお友達をローカルで定義することはどうですか?これは標準的な機能を隠すことはありませんが、それはあなたが本当に後になっているようには見えません。

(defmacro commands (&rest body) 
    `(flet ((install (&rest args) (apply 'package-install args)) 
      (uninstall (&rest args) (apply 'package-uninstall args))) 
    ,@body)) 

もちろん、flet引数のリストを自動的に生成したいとします。おそらく(feature-symbols 'package)を使用して、あなたのパッケージの要素のリストがどこかに必要です。

+1

これは私が探しているものです!どうもありがとう! – rejeep

関連する問題