6

Clojureでシンボルを廃止としてマークする方法はありますか?

うまく機能するLeinのこのようなものを使用できます。

https://github.com/technomancy/leiningen/blob/1.x/src/leiningen/core.clj#L13

ただし、関数が呼び出されたときにのみ警告を発します。コードが呼び出されたときではなく、コードがコンパイルされたときにコンパイラがこれを取得することを本当に望んでいます。

もちろん、私はシンボルを定義することはできませんでした。コンパイラはそれを取得しますが、これにより、シンボルが非推奨になった理由や時期などの情報を提供することができなくなります。

これはすべて、用語の非推奨と陳腐化が妥当な速度で発生する DSL のためのものです。

4

2 に答える 2

1

マクロの使用に関するコメントには既に何かがありますが、誰かが指摘したように、これは関数を HOF として使用することを妨げます。これを回避することはできますが、治療法は病気よりも悪くないかもしれません. たとえば、関数が

(defn foo* [x y] (+ x y))

次に、書く代わりに

(defmacro foo [x y] (warn) `(foo* x y))
(foo 1 2)
(map foo [5 6] [7 8])

マクロ展開で関数を返すようにすることができます。もちろん、他の関数と同じように使用できます。

(defmacro foo [] (warn) `foo*)
((foo) 1 2)
(map (foo) [5 6] [7 8])

おそらく厄介なことには値しませんが、非推奨の機能が使用されるたびに文句を言う方法を提供しますが、HOF の使用の可能性は維持します。

于 2012-12-26T06:11:07.397 に答える
0

それは、DSL がどのように設計されているかによって大きく異なります。go各フォームを aまたは同様の呼び出しでラップする必要があるように DSL を設計できる場合は、次のgoようなことを行うこのマクロを記述できます。

  1. macroexpand-all(clojure.walk から) 渡されたフォームへ
  2. postwalk上記の返された形式で (clojure.walk から) を使用し、非推奨のシンボルのグローバル リストを参照して、検出されたシンボルのいずれかが非推奨であるかどうかを確認します。resolveシンボルの名前空間修飾名を取得するには、シンボルに対して実行する必要がある場合があります。
  3. 非推奨のシンボルが見つかった場合は、メッセージを出力します。
  4. 入力フォームをそのまま返します。

このgoマクロは、DSL 実行のエントリ ポイントであるため、DSL の他の前処理に使用できます。

注: ユーザーが非推奨のシンボルの 1 つから自分のシンボルに同じ名前を使用する解決策を考え出す必要があるかもしれませんが、DSL 設計によっては必要ない場合もあります。

于 2012-12-26T08:56:58.207 に答える