18

ここで説明されている clojure の require 構文を理解する (したがって覚える) のに苦労しています: http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require。それは直観に反し、不均一に見えます。

たとえば、次の例では、このベクトルを引用符で囲む必要がある理由を示しています。

(require '[clj-json.core :as json])

通常、clojure ではベクトルは引用されないため、直観に反します (リストは引用され、ベクトルはデータとして扱われます)。

この場合、ベクトルが引用されていないため、不均一です。

(ns xxx 
    (:require [clj-json.core :as json]))

:requirerequire 関数とns マクロ内での使用法は視覚的に似ているだけであることに気付きましたが、それでもなおです。

他にも奇妙な点があります。たとえば、次のことができます。

(require '(clj-json.core))

しかし、私はこれを行うことはできません:

(require '(clj-json.core :as json))

誰かがこれらの質問に答えることができます:

  1. 最初の例では、なぜベクトルを引用する必要があるのですか?
  2. ns マクロで引用する必要がないのはなぜですか?
  3. リスト表記が許可されないのはなぜ:asですか?

物事がそのままになっているのには理由があるのか​​ 、それとも設計時に矛盾に気付かなかっただけなのか疑問に思っています。

4

1 に答える 1

11
  1. 最初の例では、なぜベクトルを引用する必要があるのですか?

requireは関数なので、評価を防ぐために引用符で囲む必要があります。そうしないと、これらのシンボルが現在のコンテキストで検索され、エラーまたは予期しない動作が発生する可能性があります。ちなみに、これは正しくないと思います。「通常、ベクトルはclojureで引用されないため、直感に反します(リストは引用され、ベクトルはデータとして扱われます)。」

直感に反するかもしれませんが、ベクトル(またはマップやセット)を引用しても問題はありません。:私はREPLで何かをすばやくテストするときによく行いますが、たとえば、マップまたはベクトルの各キーワードにaを入力したくありません。

user=> '{a 1 b 2 c 3}

それよりも:

user=> {:a 1 :b 2 :c 3}

1つ目は、何かをテストするためのデータをすばやく取得したい場合は、入力がわずかに速くなります。

  1. nsマクロで引用する必要がないのはなぜですか?

マクロは引数を評価しません。通常の関数呼び出しよりも遅延しているため、評価を防ぐために記号(clj-json.coreおよびjson)を引用符で囲む必要はありません。

  1. リスト表記で:asが許可されないのはなぜですか?

申し訳ありませんが、これに対する答えはわかりません。

ああ、私はのドキュメントをrequire見て、見つけました。サポートされている別のフォームがあります:

「以下は、's'と省略されたライブラリclojure.zipとclojure.setをロードします。」

(require '(clojure zip [set :as s]))
于 2012-05-30T16:00:08.627 に答える