DEV Community

kaede
kaede

Posted on

Clojure Tutorial Part 4 -- string ライブラリを使ってみる

参考

https://clojure.org/guides/repl/basic_usage#_example_using_clojure_string

Clojure の公式チュートリアル
basic-usage の string 編。


string のライブラリを読み込んで upper-case を試す

今回も clj コマンドでターミナルで CLI を動かす

( require '[clojure.string])
(clojure.string/upper-case "abCd")
"ABCD"
Enter fullscreen mode Exit fullscreen mode

数値の計算と違って、require でライブラリを呼び出す必要がある
Django REST Framework とターミナルで使った時と似ている

しかし、JS や PY とは違って 'library/detail' のように
シングルクォートで括ることはしない。始まりだけだ。終わりはない。
終わりなき戦いが始まる、そういうメッセージなのかもしれない。

https://stackoverflow.com/a/34118964

そんなことはなくて名前空間のシンボルになっているだけだった。

そして require でインポートした ライブラリとその中身の関数を
四則演算のように使って引数を処理する。ただし引数はいつも 1 つ!


:as を使ってライブラリ名を別名で import する

(require '[clojure.string :as customName])
(customName/upper-case "hoge")
"HOGE"
Enter fullscreen mode Exit fullscreen mode

ライブラリ名は :as を使うことで自由な名前で import できる。
関数名は変えられないと予想。


:refer [function-name] で関数を直接呼び出せるようにする


 

(require '[clojure.string :refer [upper-case]])
(upper-case "toUpperCaseOnly")
"TOUPPERCASEONLY"
Enter fullscreen mode Exit fullscreen mode

:refer [function-name] を使うことで
ライブラリの中の関数のみ
四則演算の関数 (+,-) のように使うことができるようになる。


エラーが起きる事例

 (upper-case "toUpperCaseOnly" "second value" "Third Value")
Execution error (ArityException) at user/eval17 (REPL:1).
Enter fullscreen mode Exit fullscreen mode

複数の引数をまとめて処理することはできない。

(upper-case 'single')
"SINGLE'"
Enter fullscreen mode Exit fullscreen mode

JS と違ってシングルクォートは括ったものを文字列とみなす処理にはならない。
括れないという点では : (コロン) と似たような扱いなのだろうか?


:refer と :all で関数を全て import する

(upper-case "quote")
Syntax error compiling at (REPL:1:1).
Unable to resolve symbol: upper-case in this context

user=> (require '[clojure.string :refer :all])
WARNING: reverse already refers to: #'clojure.core/reverse in namespace: user, being replaced by: #'clojure.string/reverse
WARNING: replace already refers to: #'clojure.core/replace in namespace: user, being replaced by: #'clojure.string/replace
nil

user=> (upper-case "quote")
"QUOTE"
Enter fullscreen mode Exit fullscreen mode

:all を使えば全て import できるが、
既に読み込まれている? core の reverse と replace を
上書きしてしまうため、やたらと :all は使わない方がいいらしい。


repl の dir 関数で string 関数の中身を全て出す

(require '[clojure.repl :refer :all])

(dir clojure.string)
blank?
capitalize
ends-with?
escape
includes?
index-of
join
last-index-of
lower-case
re-quote-replacement
replace
replace-first
reverse
split
split-lines
starts-with?
trim
trim-newline
triml
trimr
upper-case
Enter fullscreen mode Exit fullscreen mode

repl の dir を使って string の中身の関数を全て並べると

JS でお馴染みの

  • join
  • sprit
  • reverse
  • replace
  • trim
  • ends-with

などがあった

ちなみに同じく repl ライブラリの

apropos, find-doc, doc を使えば関数とドキュメントを検索できて

source join)
(defn ^String join
  "Returns a string of all elements in coll, as returned by (seq coll),
   separated by an optional separator."
  {:added "1.2"}
  ([coll]
     (apply str coll))
  ([separator coll]
     (loop [sb (StringBuilder. (str (first coll)))
            more (next coll)
            sep (str separator)]
       (if more
         (recur (-> sb (.append sep) (.append (str (first more))))
                (next more)
                sep)
         (str sb)))))
Enter fullscreen mode Exit fullscreen mode

source を使えばその関数の実際のソースコードが見れる。
さすが Lisp 族、研究者向けすぎる


まとめ

( require '[clojure.string] )
Enter fullscreen mode Exit fullscreen mode

この形でライブラリを import して

( clojure.string/upper-case "abCd" )
Enter fullscreen mode Exit fullscreen mode

そのライブラリ名と中の関数名を指定することで
引数の文字列に関数を打つことができる。

string には ' ' は使えず、 " " のみしか使えない。
ダブルのみ。

string になんの関数があったっけ?
と忘れたときは repl/dir で一覧を出力できる。

upper-case ってなんだっけ?
と忘れたときは repl/doc で説明を出力できる。

repl/source を使えば実装のコードすら出力できる。

画期的。これはターミナルでの計算において、 Python より圧倒的に便利だ。

Latest comments (0)