TL;DR
- Clojure では
nsで名前空間を定義し、同じ単語でも文脈によって意味が違うものを区別する。 - ファイル内で次の
nsが出てくるまでがその名前空間で、別の名前空間の値には名前空間/変数名でアクセスする。
内容
book のように、同じ単語でも文脈によって意味が異なる単語がある。この種の違いをコードで区別するために、Clojure は名前空間(namespace)という機能を提供している。
名前空間は ns で定義する。
(ns lawyer)
(def about-me "I never speak a truth.")
(ns politician)
(def about-me "I look the nation.")
(ns engineer)
(def about-me "I apply science.")
(println lawyer/about-me)
(println politician/about-me)
(println about-me)
(ns politician)
(println about-me)これを実行すると、以下のように出力される。
;; I never speak a truth.
;; I look the nation.
;; I apply science.
;; I look the nation.このコードのように、ファイル内で次の ns が出てくるまでが、指定した名前空間になる。
(ns lawyer) ; ここから lawyer 名前空間
(def about-me "I never speak a truth.")
(ns politician) ; ここから politician 名前空間
(def about-me "I look the nation.")
(ns engineer) ; ここから engineer 名前空間
(def about-me "I apply science.")前に定義した名前空間に、もう一度入ることもできる。
(ns politician)
(def about-me "I look the nation.")
(ns engineer)
;; ...
(ns politician) ; ここから politician 名前空間
(println about-me) ; politician/about-me が呼ばれる
;; "I look the nation."別の名前空間の値にアクセスするには、名前空間/変数名 のように書く必要がある。
(println lawyer/about-me)
(println politician/about-me)