21

型ヒントを使用して Clojure コードを生成しようとしていますが、コードをビルドするたびに型ヒントが消えるようです (コードがコンパイルされたときにも機能しません)。

例えば

`(let [^BufferedImage b (create-buffered-image)] 
   (.getRGB b 0 0))

=> (clojure.core/let [user/b (user/create-buffered-image)] (.getRGB user/b 0 0))

タイプヒントが消えている理由は正確にはわかりませんが、リーダーがメタデータを処理する方法に関係していると思います。

生成されたコードで正しい型ヒントを作成する正しい方法は何ですか?

4

1 に答える 1

34

この質問には2つの答えがあります。特定の質問に答えるには、投稿したばかりの実際のコードでは、何も問題はありません。問題なく動作しています。(set! *print-meta* true)再試行すると、メタデータ アノテーションが表示されます。通常は印刷されません。

しかし、一般的に、これはマクロから物事を行う正しい方法ではなく、やがて問題が発生します。マクロが評価するフォームにメタデータが必要ではなく、マクロが出力するフォームにメタデータが必要であることを忘れないでください。したがって、より正確な解決策は、with-metaメタデータを添付するシンボルまたはフォームで を使用することです。または、それらがユーザー提供のフォームである場合は、vary-meta明示的に追加されたメタデータを破棄しないように通常使用する必要があります。例えば、

(defmacro with-image [name & body]
  (let [tagged-name (vary-meta name assoc :tag `BufferedImage)
    `(let [~tagged-name (create-buffered-image)
       ~@body)))

(with-image i (.getRGB i 0 0))
于 2012-08-12T05:52:07.443 に答える