質問
ライブラリをロードするためにuseを呼び出す構文を理解しようとしています:
(use 'clojure.contrib.duck-streams)
引用リーダーマクロをclojure.contrib.duck-streamsに適用し、読者がその文字列を評価しようとしないようにするので、私には意味があります。
今、リーダーのみをロードするために:onlyタグを使用したい場合、なぜこれが正しいのですか:
(use '[clojure.contrib.duck-streams :only (reader)])
代わりに:
(use '[clojure.contrib.duck-streams :only reader])
この引数のベクトルを使用して渡すことを意味するためにこれを読みましたが、REPLは、SymbolからISeqを作成する方法がわからないと文句を言います。なぜ読者を囲んでいるのですか?
これも最初の行と同等で有効です:
(use '[clojure.contrib.duck-streams])
だから、 'string are' [string]は同等の引数で、私も理解していないようです。
解決
:only
は、シンボルのリストが必要です。それがまさに関数の書き方です。 use
が使用する refer
のdocstringに注意してください。
refers to all public vars of ns, subject to filters.
filters can include at most one each of:
:exclude list-of-symbols
:only list-of-symbols
:rename map-of-fromsymbol-tosymbol
必要に応じて複数のシンボルを指定できるように、このように書かれています。
(use '[clojure.contrib.duck-streams :only (reader writer)])
この最近の投稿で説明されているように、可変数の引数を取得または返す場合は、単一の項目を取得または返す場合でも、常にリストまたはベクターまたはセットを取得または返すようにすることをお勧めします。理由:
-
「ゼロアイテム」を表すためによく使用される
-
nil
は、seq
可能です。空のコレクションもseq
可能です。 - リスト内の2つ以上のアイテムは
seq
可能です。 - 1つのアイテムをリスト自体に入れて
seq
にすることもできます。
1項目のケースを特別なケースにするのは面倒です。 1つのアイテムを一種の縮退ケースとして扱い、それをリストに入れると、プログラムの一貫性が高まり、簡単になります。
use
は、:only
引数がseqableコレクションのシンボルであるかどうかに注意することに注意してください。つまり、リスト、ベクター、およびセットがすべて機能します。
(use '[clojure.contrib.duck-streams :only [reader writer]])
(use '[clojure.contrib.duck-streams :only #{reader writer}])
単一の Symbol
は seq
には対応していません。そのため、例外が発生します。
core.clj をご覧くださいこれがどのように実装されているかを確認したい場合。
他のヒント
これらは単に「かっこ」ではありません。 —括弧は、リストを作成するための構文です。 :onlyタグの後に項目が表示されます。これは、適用対象のリストであることが期待されています。