5

Clojure と Emacs を学び始めたばかりです。Windows用のClojure Boxを実行しています。コードをバッファに記述して、呼び出すことなくREPLで実行できるようにしたいと考えています

(use 'example.code)

いつも。Cc Ck については知っていますが、名前空間をリロードしません。私が使用する場合

(in-ns 'example.code)

repl で名前空間を変更するには、機能します。これを行う正しい方法は何ですか?

4

2 に答える 2

10

in-ns正しい方法の一つです。

私にとって最も「正しい」と感じる方法は、REPL の名前空間で(require '[example.code :as ec])作業することです。userそうすれば、使い捨ての実験状態が維持されuserec/foo私にとって十分に便利です(そして、どこfooから来るのかが明らかになります)。再コンパイルを強制するためにいつでも(require :reload-all 'example.code)(同じように動作します) と言うことができます。use

また、次の関数を使用して、特定の名前空間から取り込まれたすべてのマッピングを (現在の名前空間から) 削除する関数を次に示しますuse

(defn unuse [ns]
  (doseq [[n v] (ns-refers *ns*)]
    (if (= (.. v ns name) ns)
      (ns-unmap *ns* n))))

その上に構築できます

(defn reuse [ns]
  (unuse ns)
  (remove-ns ns)
  (use :reload-all ns))

(reuse 'example.code)そして、名前空間を新たなスタートに近づけるように言います。deftype( &などの 1.2 の新機能はdefrecordいくつかの複雑さを導入することに注意してください...特に、ed クラスunuseには影響しません-- これにはレコードと-created 型が含まれます。それでもet al. フォームが再コンパイルされますが、奇妙に打ったのを覚えていますこれが十分ではないように思われるケース...おそらく私のエラー、おそらく私がまだ完全に調査していないこれらの機能の難解な側面.)importdeftype:reload-alldeftype

于 2010-07-13T11:33:00.560 に答える
0

たぶん、「汚い」方法は、(ns'example.code)を使用してrepl内のバッファーの名前空間に切り替えることです。ダーティは、バッファ定義をrepl定義と混合する原因です。Marczykの答えは正しいと思います。

于 2010-07-13T12:08:10.957 に答える