倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Clojure 関数メモ - Loading

多くの人がそうだと思うけど、Clojure のライブラリのロードあたりがよく分かんなかったのでドキュメントをよみよみ。 「Cheat Sheet」の Loading を参考にしてます。

参考

Loading


今回みていく関数の一覧:

分類 関数
Load libs require, use, import, refer
List loaded loaded-libs
Load misc load, load-file, load-reader, load-string

Load libs


Clojure ライブラリの読み込みに関する関数。 Clojureライブラリは、Java におけるパッケージみたいなもので、Java パッケージが一群のクラス(などの型)を含んでいるのに対して、Clojure ライブラリは一群の関数を含んでいます。

  • require : ライブラリを読み込む
  • refer : 現名前空間から指定した名前空間の関数を完全修飾名なしに参照できるようにする
  • use : require & refer
  • import : Java クラスをインポートする

require

Clojure ライブラリを読み込む。

(require 'clojure.string)    ;; ライブラリを読み込む
(require 'clojure.string 'clojure.test)    ;; 複数のライブラリを読み込む
(require '[clojure.string :as string])    ;; エイリアス
(require '[clojure.string :refer (split)])    ;; use と同じ(1.4.0 以降)

ライブラリ名を指定する際にクォート(') を忘れずに。 Clojure ライブラリを require で読み込んでも、その中の関数を使う際にはライブラリの完全修飾名を書く必要があります。 Java の import のようにライブラリ名を省略したい場合は、use 関数を使うか :refer キーワードで指定してください(1.4.0以降)。

refer

読み込み済みのライブラリに対して、ライブラリ名を省略して関数を使えるようにする(現在の名前空間からのみ)。

(refer 'clojure.string :only '[capitalize trim])
    ;; clojure.string ライブラリの capitalize 関数、trim 関数を
    ;; ライブラリ名なしで参照可能にする

use

require と refer をまとめて実行する。

(use '[clojure.string :only (split)])
    ;; clojure.string ライブラリの split 関数のみを require & refer

(use '[clojure.string :as s :only (split)])
    ;; clojure.string ライブラリに s という別名をつけて s/split という風に split 関数を参照できるようにする

Clojure 1.4.0 からは require に :refer キーワードでフィルターを付ける方が推奨されているもよう。

import

Java クラスをインポートする。 require と違って、インポートした後ではクラスの完全修飾名(パッケージを入れた名前)は必要なし。 まぁ、普通の Java の import と同じ。

(import java.util.Date)
    ;; java.util.Date クラスをインポート

(import '(java.util Date Calendar)    ;; java.util パッケージの Date, Calendar クラスをインポート
           '(java.net URI ServerSocket)
           java.sql.DriverManager)    ;; java.sql.DriverManager クラスをインポート

List loaded


REPL などであれこれライブラリを読み込んでいると、現在どんなライブラリが読み込まれているか分からなくなるので、読み込み済みのライブラリを取得する関数が用意されてます。

  • loaded-libs

loaded-libs

現在読み込まれているライブラリのセット(ソート済み)を返す。

(loaded-libs)

Load misc


いろいろな方法で Clojure コードを読み込む関数が用意されてます。

  • load : クラスパス上にあるファイルから Clojure コードを読み込む
  • load-file : ファイルから読み込んで評価する
  • load-reader : java.io.Reader から読み込んで評価する
  • load-string : 文字列から読み込んで評価する

load

クラスパス上にあるファイルから Clojure コードを読み込む。

(load "hello_clojure/core")
    ;; 例えば src フォルダにクラスパスが通っているとして
    ;; src/hello_clojure/core.clj ファイルを読み込む(ファイルがあれば)

load-file

指定したファイルから Clojure コードを読み込んで、そのコードを評価(実行)する。

(load-file "src/hello_clojure/core.clj")
    ;; src/hello_clojure/core.clj ファイルから Clojure コードを読み込んで評価する

load 関数と違って、読み込んだコードを評価しますヨ。

load-reader

引数の java.io.Reader オブジェクトから Clojure コードを読み込んで評価する。

(load-reader (new java.io.StringReader "(println \"hello, world\")")))
    ;; 引数の java.io.Reader オブジェクトから Clojure コードを読み込んで評価する

load-string

引数の文字列を Clojure コードとして評価する。

(load-string "(println \"hello, clojure\")"))
    ;; 引数の文字列「(println \"hello, clojure\")」を Clojure コードとして評価する

プログラミングClojure

プログラミングClojure