14

私の理解では 、マクロではrequire :referなく使用することをお勧めします。たとえば、次のようにします。usens

(ns example.core 
  (:require [clj-json.core :refer [parse-string]]))

それ以外の

(ns example.core 
  (:use [clj-json.core :only [parse-string]]))

:renameどのuseサポートに対処するための推奨される方法は何ですか?具体的には、clojure.data.zipを作成し、clojure.coreと競合する関数と関数require の名前を変更するとします。ancestorsdescendants

言い換えれば、私はrequire同等のものを知りたいです

(:use 
  [clojure.data.zip :rename {ancestors xml-ancestors, 
                             descendants xml-descendants})
4

4 に答える 4

12

あなた:requireはあるステップで、次に:refer次のステップで:rename

(ns foo
  (:require clojure.data.zip)
  (:refer [clojure.data.zip :rename {ancestors xml-ancestors,
                                     descendants xml-descendants})

:useは常に:require+の省略形でしたが:refer、現在、:referオプション to:requireは最も単純な種類の の省略形ですrefer

于 2013-01-30T21:44:45.690 に答える
4

免責事項:これを行うための「推奨される」方法がわかりません。私はそれをどうやってやるのかしか知りません。私の解決策は慣用的なClojureではないかもしれません、そして誰もより良い答えを持って来なかったら私は驚かれることでしょう。


これが私がすることです::requireパッケージとそれを使用してエイリアスします:as

(ns some.big.name.space
  (:require [clojure.data.zip  :as  cdz])
  ... some more imports, maybe ...)

some.big.name.space次に、指定されたプレフィックスを使用してシンボルにアクセスでき、名前空間内のシンボルと競合しません。

(def some-list [cdz/ancestors cdz/descendants ancestors descendants])

エイリアスが短い場合は、入力するのに煩わされることはほとんどなく、コードがより明確になっていると感じますcdz/。これは、シンボルがインポートであるという視覚的な手がかりになります。

これはあなたの正確な質問(使用方法)に実際には答えないことを知っています:rename:require、名前空間の汚染を回避し、Clojureのシンボル解決メカニズムを台無しにする必要がないため、言及する価値があると思います。

于 2013-01-30T19:08:27.617 に答える