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)

キーワード