Clojure を学ぶ 公式サイト編1

2020-03-02

以前、ちょっとだけかじった事があった Clojure を、もういっかい勉強中。

公式な日本語ドキュメントもあるけど、英語の勉強もかねて自分なりにまとめていきます。

https://japan-clojurians.github.io/clojure-site-ja/guides/learn/syntax

環境

公式でも紹介されている、オンライン開発環境のrepl.itを使います。

https://repl.it/languages/clojure

clojure.replをrequireすると、doc関数などが使えるようになります。

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

(doc println)     ; println関数のドキュメントを表示
(apropos "trim")  ; trimを含む関数名を列挙
(find-doc "trim") ; trimを含むドキュメントを列挙
(dir clojure.repl); clojure.repl名前空間の関数の一覧
(source dir)      ; dir関数のソースを表示
  

リテラル

コメント

; ← 行末までコメント

; ↓ 複数行のコメント
(comment 
 …
)

(comment)は、リテラルではなく、引数を無視してnilを返す関数。 なので、囲まれた部分のカッコの整合性などは、キチンとしておく必要があるみたいです。

数値

42        ; 整数
-1.5      ; 浮動小数点
22/7      ; 分数

011       ; 9 プレフィックス「0」で8進数
0x11      ; 17 プレフィックス「0x」で16進数
8r11      ; 9 プレフィックス「Nr」でN進数
16r11     ; 17
2r11      ; 3

##Inf     ;特別なシンボリック値 正の無限大
##-Inf    ;特別なシンボリック値 負の無限大
##NaN     ;特別なシンボリック値 「数値ではない」

無限大とかを使う機会はあまりなさそう。Repl.itでは、##inf を入力すると、「 EOF while reading 」エラーが返ってきました。

文字型

"hello"         ; 文字列
\e              ; 文字
#"[0-9]+"       ; 正規表現

\newline        ; 特殊文字
\space 
\tab
など

\uNNNN          ;Unicode文字
\oNNN           ;Unicode文字8進数

文字は、「 \あ」などの2バイト文字も使えるようです。

\u0041、\o101で、"\A"が返ってきます。

シンボルと識別子

map             ; シンボル
+               ; シンボル
clojure.core/+  ; 名前空間付きシンボル
nil             ; 特別なシンボル null値
true false      ; 特別なシンボル 真偽値
:alpha          ; キーワード
:release/alpha  ; 名前空間付きキーワード

キーワードは常にそれ自身に評価されるシンボル。

nil、true、false も自身が返ってくるようです。

コレクション型

'(1 2 3)     ; リスト 順序付けあり、重複あり、インデックスなし
[1 2 3]      ; ベクター 順序付けあり、重複あり、インデックスあり
#{1 2 3}     ; セット 順序付けなし、重複なし
{:a 1, :b 2} ; マップ

Clojure の基本

def

特殊形式 現在の名前空間で、シンボルを値に関連付ける

; 値を関連付け
(def x 5)

; 関数を関連付け
(def add (fn [a b] (+ a b)))

; doc-string あり
(def r "円の半径" 5)
(doc r)
>> user/r
>>   円の半径
>> nil

印字

改行あり/なし、人間が読める/機械が読めるの組み合わせで、4種類かある模様。

とりあえずは、改行ありで人間が読めるprintln、同じく機会が読めるprnを覚えておけば良さそう?

続く