【Clojure】基本文法【言語習得への道】
コメント
プログラミングでは、コード中にコメントを書くことができます。
Clojureでは文頭に「;」を書くことで、コメントとして扱われます。
コメント扱いされた文は実行されることはありません。
; この行はコメントです.
; (println "コメントです")
(println "Hello, World")
(println "Not, Comment")
; 実行結果
; Hello, World
; Not, Comment
変数
defを使って変数を定義しています。
;; データ型→初期値
(def text "text")
;; データ型と初期値を同時
(def Text "Text")
;; 出力
(println text)
(println Text)
;; Textを上書き
(def Text "TEXT")
(println Text)
;; 実行結果
;; text
;; Text
;; TEXT
長い変数名
; _で繋ぐ
(def text_text "text")
; -で繋ぐ
(def Text-Text "Text")
; 出力
(println text_text)
(println Text-Text)
; 大文字で繋ぐ
(def TextText "TEXT")
(println TextText)
; 実行結果
; text
; Text
; TEXT
関数
(defn string00 []
(let [text "text"
Text "Text"]
(println text)
(println Text))
(let [helloworldmessage "Hello, World"
HelloWorldMessage "Hello, World"]
(println helloworldmessage)
(println HelloWorldMessage)))
(string00)
;; 実行結果
;; text
;; Text
;; Hello, World
;; Hello, World
関数の宣言
(defn string00 []
defnは関数を定義するためのキーワードです。
string00は関数名です。
[]は引数リストを示します。この場合、引数はありません。
関数の本体
(let [text "text"
Text "Text"]
(println text)
(println Text))
(let [helloworldmessage "Hello, World"
HelloWorldMessage "Hello, World"]
(println helloworldmessage)
(println HelloWorldMessage)))
letを使ってローカル変数を定義します。letの後に続くベクター[]内で変数名とその値をペアで指定します。
printlnを使って変数の値をコンソールに出力します。
関数の呼び出し
(string00)
定義した関数string00を呼び出します。
この呼び出しにより、関数string00の本体が実行され、指定された出力がコンソールに表示されます。
文字列
基本文法
;; 文字列
(defn HelloWorld [str1]
(let [text str1]
"Hello World"))
;; 実行
(def echo-str (HelloWorld "mass"))
(println echo-str)
;; Hello World
;; 文字列連結
(defn HelloWorld2 [str1]
(let [text (str "Hello World" str1)]
text))
;; 実行
(def echo-str (HelloWorld2 "mass"))
(println echo-str)
;; Hello Worldmass
;; 改行
(defn HelloWorld3 [str1]
(let [text (str "Hello World\n" str1)]
text))
;; 実行
(def echo-str (HelloWorld3 "mass"))
(println echo-str)
;; Hello World
;; mass
コードの解説
文字列を返す関数 `HelloWorld`
(defn HelloWorld [str1]
(let [text str1]
"Hello World"))
`HelloWorld`という関数を定義しています。この関数は引数として文字列 `str1` を受け取ります。
`let`を使ってローカル変数 `text` に `str1` を代入していますが、実際には使われていません。
関数は常に `"Hello World"` という文字列を返します。
関数 `HelloWorld` の実行
(def echo-str (HelloWorld "mass"))
(println echo-str)
`HelloWorld` 関数を `"mass"` という引数で呼び出し、その結果を `echo-str` に代入します。
`println` を使って `echo-str` の内容を出力します。出力結果は `"Hello World"` です。
文字列連結を行う関数 `HelloWorld2`
(defn HelloWorld2 [str1]
(let [text (str "Hello World" str1)]
text))
`HelloWorld2` という関数を定義しています。この関数も引数として文字列 `str1` を受け取ります。
`let` を使ってローカル変数 `text` に `"Hello World"` と `str1` を連結した文字列を代入します。
関数は `text` を返します。
(def i 5)
(def a (str i)) ; 文字列へ変換
(println (str "5以下:" a)) ; 文字列の結合
整数を文字列に変換
整数を文字列に変換し、文字列を結合する方法を示しています。
(def i 5)
(def a (str i)) ; 文字列へ変換
(println (str "5以下:" a)) ; 文字列の結合
(println (str "5以下:" i)) ; OK
(println (format "5以下:%s, %s, %s" i (- i 1) a))
(def i 5):
変数`i`を定義し、整数`5`を代入しています。
(def a (str i)):
変数`a`を定義し、`i`を文字列に変換して代入しています。`str`関数は引数を文字列に変換します。
(println (str "5以下:" a)):
`println`関数を使って、文字列を標準出力に出力します。`str`関数を使って`"5以下:"`と`a`を結合しています。
(println (str "5以下:" i)):
同様に、`i`を`str`関数で文字列に変換し、結合して出力しています。
(println (format "5以下:%s, %s, %s" i (- i 1) a)):
`format`関数を使って、フォーマットされた文字列を出力します。`%s`は文字列のプレースホルダで、`i`、`(- i 1)`(`i`から1を引いた値)、および`a`の値がここに挿入されます。
このコードは、整数`5`を文字列に変換して結合し、異なる方法で出力する例を示しています。
数値
基本的な算術演算と文字列の出力を行います。
(println 42)
(println (+ 42 21)) ; 足し算
(println (- 42 21)) ; 引き算
(println (* 42 2)) ; かけ算
(println (/ 42 21)) ; 割り算
(println "42 + 21") ; 文字列
;; 実行結果
;; 42
;; 63
;; 21
;; 84
;; 2.0
;; 42 + 21
数値の出力
(println 42)
`println`関数を使って、数値`42`を標準出力に表示します。
足し算の結果を出力
(println (+ 42 21)) ; 足し算
`(+ 42 21)`は`42 + 21`の計算を行い、その結果を`println`関数で表示します。
引き算の結果を出力
(println (- 42 21)) ; 引き算
`(- 42 21)`は`42 - 21`の計算を行い、その結果を`println`関数で表示します。
かけ算の結果を出力
(println (* 42 2)) ; かけ算
`(* 42 2)`は`42 * 2`の計算を行い、その結果を`println`関数で表示します。
割り算の結果を出力
(println (/ 42 21)) ; 割り算
`(/ 42 21)`は`42 / 21`の計算を行い、その結果を`println`関数で表示します。
文字列の出力
(println "42 + 21") ; 文字列
`println`関数を使って、文字列`"42 + 21"`を標準出力に表示します。
リスト型
配列の操作を行います。
(let [ary ["a" "b" "c" "d" "e" "f"]]
(println ary (count ary))
(println (nth ary 0))
(println (nth ary 5))
(println (nth ary (dec (count ary))))
(let [results [(nth ary 0) (nth ary 2)]]
(println results))))
;; 実行結果
;; ["a" "b" "c" "d" "e" "f"] 6
;; a
;; f
;; f
;; ["a" "c"]
配列の初期化
(let [ary ["a" "b" "c" "d" "e" "f"]]
`let`を使って、文字列のベクター`ary`を初期化します。
配列とその長さを出力
(println ary (count ary))
`println`関数を使って、`ary`ベクターとその長さを表示します。
配列の特定の要素を出力
(println (nth ary 0))
(println (nth ary 5))
(println (nth ary (dec (count ary))))
`nth`関数を使って、`ary`ベクターの特定の要素を表示します。`dec`関数は引数の値を1減らします。
新しい配列 results を作成し、特定の要素をコピー
(let [results [(nth ary 0) (nth ary 2)]]
`let`を使って、`ary`ベクターの特定の要素をコピーして新しいベクター`results`を作成します。
results 配列を出力
(println results))))
`println`関数を使って、`results`ベクターを表示します。
for文
数値と配列を使った`for`ループの例を示しています。
;; 数字のfor文
(println "数字のfor文")
(doseq [x (range 0 7)]
(println x))
(let [ary ["a" "b" "c" "d" "e" "f"]]
(println "リスト:" ary)
(println "リストのfor文:" (count ary))
(println "リストのfor文")
(doseq [x ary]
(println x))))
;; 実行結果
;; 数字のfor文
;; 0
;; 1
;; 2
;; 3
;; 4
;; 5
;; 6
;; リスト: ["a" "b" "c" "d" "e" "f"]
;; リストのfor文: 6
;; リストのfor文
;; a
;; b
;; c
;; d
;; e
;; f
数字のfor文
(println "数字のfor文")
(doseq [x (range 0 7)]
(println x))
`println`関数を使って、"数字のfor文"という文字列を表示します。`doseq`を使って、0から6までの数字を出力しています。`range`関数は指定された範囲の数値を生成します。
配列の初期化
(let [ary ["a" "b" "c" "d" "e" "f"]]
`let`を使って、文字列のベクター`ary`を初期化します。
リストの出力
(println "リスト:" ary)
(println "リストのfor文:" (count ary))
`println`関数を使って、`ary`ベクターとその長さを表示します。`count`関数はベクターの要素数を返します。
リストのfor文
(println "リストのfor文")
(doseq [x ary]
(println x)))
`println`関数を使って、"リストのfor文"という文字列を表示します。`doseq`を使って、`ary`ベクターの各要素を出力します。`println`関数を使って、各要素を表示します。
if文
以下のコードは、0から10までの数値をループし、それぞれの数値が5以下かどうかを判定して出力するものです。
;; 0から10までの範囲でループを実行
(doseq [i (range 0 11)]
(when (<= i 5)
(println (<= i 5)) ;; 条件が真であることを表示
(println (str "5以下:" i)))) ;; "5以下:"とiの値を表示
;; 0から10までの範囲で再度ループを実行
(doseq [i (range 0 11)]
(when (not (<= i 5))
(println (<= i 5)) ;; 条件が偽であることを表示
(println (str "5以上:" i))))) ;; "5以上:"とiの値を表示
; true
; 5以下:0
; true
; 5以下:1
; true
; 5以下:2
; true
; 5以下:3
; true
; 5以下:4
; true
; 5以下:5
; false
; 5以上:6
; false
; 5以上:7
; false
; 5以上:8
; false
; 5以上:9
; false
; 5以上:10
0から10までの範囲でループを実行
(doseq [i (range 0 11)]
(when (<= i 5)
(println (<= i 5)) ;; 条件が真であることを表示
(println (str "5以下:" i)))) ;; "5以下:"とiの値を表示
`doseq`を使って、0から10までの範囲でループを実行します。`range`関数は指定された範囲の数値を生成します。`when`は条件が真の場合にのみ実行されます。`<=`は比較演算子で、`i`が5以下の場合に真となります。`println`関数を使って、条件が真であることと、"5以下:"と`i`の値を表示します。
0から10までの範囲で再度ループを実行
(doseq [i (range 0 11)]
(when (not (<= i 5))
(println (<= i 5)) ;; 条件が偽であることを表示
(println (str "5以上:" i))))) ;; "5以上:"とiの値を表示
`doseq`を使って、0から10までの範囲で再度ループを実行します。`range`関数は指定された範囲の数値を生成します。`when`は条件が真の場合にのみ実行されます。`not`は論理否定演算子で、`i`が5以下でない場合に真となります。`println`関数を使って、条件が偽であることと、"5以上:"と`i`の値を表示します。