勉強Clojure 8日目

2261 ワード

こうぞうせいぎょ
よく使われる制御判断,if,and,or,conf
(if motor-turning?
  "yes"
  "no")

構造はこうです(if)
またclojureでは,ループはmap,filter,reduce,forなどの内蔵関数を用いるのが一般的であるが,loopや再帰的な方式を用いることもできる.
これはpythonの書き方です
specific_stuff = []
for i in my_items:
    if is_what_i_want(i):
        specific_stuff.append(i)

clojure書き方:(def specific-stuff (filter what-i-want? my-items))等しい、判断と比較
=またはnot=の方法
(if (= tries max-tries)
  "you're done"
  "keep going")

値の判断は,内容が同じであれば等しいことがわかる.
(= {:a  [1 2 3] :b #{:x :y} :c {:foo 1 :bar 2}}
   {:a '(1 2 3) :b #{:y :x} :c {:bar 2 :foo 1}})
;; ⇒ true

データ形式が異なると異なりますが、==記号はデータ型を無視します.
(= 4 4.0)
;; ⇒ false
(== 4 4.0)
;; ⇒ true

変数(Vars)
に値を付ける
(def the-answer 42)

カスタム関数
def+fnの使用
(def my-func
  (fn [a b]
    (println "adding them!")
    (+ a b)))

呼び出し方法
(my-func 10 20)   ; Returns/evaluates-to 30.

defnも使用できます
(defn my-func
  "Docstring goes here."
  [a b]
  (println "adding them!")
  (+ a b))

1.パラメータaとbはvectorの中にあり、値が割り当てられていない以外は2.関数の中で何でもできますが、最後の式は戻り値です.3.defnを使用する場合は、関数名は最初の行にある必要があります.
関数は必ずしも1つの値だけを返すわけではありません.データ構造を返すこともできます.
(defn foo
  [x]
  [x (+ x 2) (* x 2)])

データ構造への転送も可能
(defn bar
  [x]
  (println x))

(bar {:a 1 :b 2})
(bar [1 2 3])

複数のパラメータを定義できます
(defn baz
  [a b & the-rest]
  (println a)
  (println b)
  (println the-rest))

作者(私ではありません)は上から下へ書く関数が好きです.偽コードを見てください.
;; BROKEN pseudocode

(do-it)

(defn do-it
  []
  (... (my-func-a ...)))

(defn my-func-a
  [...]
  (... (my-func-b ...)))

(defn my-func-b ...)

しかし、clojureは関数呼び出しを書く前に知る必要があります.例えばmy-func-aはdo-itで呼び出されますが、後で定義されます.この場合、declareを使用する必要があります.以下のようにします.
;; pseudocode

(declare do-it)

(do-it)

(declare my-func-a)

(defn do-it
  []
  (... (my-func-a ...)))

(declare my-func-b)

(defn my-func-a
  [...]
  (... (my-func-b ...)))

(defn my-func-b ...)