Clojureでプログラムを書くと、当然のように使うrequire、use、importの各関数/マクロですが、なんかよく忘れるのでメモっておこうかと。
require関数
Clojureのライブラリをロードするための関数。こういう感じで使います。
(require 'clojure.string)
単独のライブラリをロードする場合は、先頭に「'」が付くと…。
複数ロードする場合は、純粋に繋げばOK。
(require 'clojure.string 'clojure.data)
まあ、requireを複数行ってもいいですけど。
requireすると、こんな感じでライブラリの呼び出しが可能に。
(clojure.string/join \, ["Hello" "World"])
長いよ!っていう場合は、「:as」キーワードを付与することで別名を付けることができます。
(require '[clojure.string :as str]) (str/join \, ["Hello" "World"])
順番が前後しますが、use関数と同じことをするには、:referキーワードを使用します。
(require '[clojure.string :refer [join]]) (join \, ["Hello" "World"])
全部エクスポートするには、「:all」キーワードを付与すればいいみたいです。
(require '[clojure.string :refer :all])
「:refer」キーワードと同等のrefer関数も存在しますが、割愛。
use関数
requireに「:refer」キーワードを付けた時と同じことができますが、Clojure 1.4.0以降はrequire関数の方が推奨?
(use 'clojure.string)
特定の関数とかだけロードする時は、「:only」キーワードを使います。
(use '[clojure.string :only [join]])
他にも「:exclude」とか「:rename」キーワードとか付けられるみたいですが、まあいっかぁと(笑)。
importマクロ
Javaのクラスをimportするためのマクロ。
(import java.io.InputStream) (import '(java.io InputStream OutputStream)) (import '(java.util List Set) '(java.net URL))
こちらは、普通のJavaのimportの感覚で使えます。requireみたいにFQCN的な指定は不要で、そのまま「InputStream」とかの短縮名で呼び出せます。
リストで指定する場合は、「'」を忘れずに。
nsマクロ
Namespaceを宣言するnsマクロの属性として、「:require」、「:use」、「:import」キーワードがあり、ここまで書いてきた各関数、マクロと同等のことができます。
(ns example.namespace (:import (java.io InputStream OutputStream) (java.util List Set)) (:require [clojure.string :as str :refer [replace]] [clojure.java.io :refer :all]) (:use [clojure.data :only [diff]] [clojure.test]))
各キーワードの意味は、関数とかマクロだった時とそう変わりません。が、コレクションを渡す時の「'」は不要になります。
各関数とかマクロの意味を忘れることはまあないのですが、その後続くコレクションの書き方とかを忘れることが多いので、書いてみました。
きっと、自分がよく見るでしょう(笑)。