CLOVER🍀

That was when it all began.

Clojureの忘れっぽいrequire、use、import

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]))

各キーワードの意味は、関数とかマクロだった時とそう変わりません。が、コレクションを渡す時の「'」は不要になります。

各関数とかマクロの意味を忘れることはまあないのですが、その後続くコレクションの書き方とかを忘れることが多いので、書いてみました。

きっと、自分がよく見るでしょう(笑)。