勉強Clojure 8日目
2261 ワード
こうぞうせいぎょ
よく使われる制御判断,if,and,or,conf
構造はこうです(if)
またclojureでは,ループはmap,filter,reduce,forなどの内蔵関数を用いるのが一般的であるが,loopや再帰的な方式を用いることもできる.
これはpythonの書き方です
clojure書き方:
=またはnot=の方法
値の判断は,内容が同じであれば等しいことがわかる.
データ形式が異なると異なりますが、==記号はデータ型を無視します.
変数(Vars)
に値を付ける
カスタム関数
def+fnの使用
呼び出し方法
defnも使用できます
1.パラメータaとbはvectorの中にあり、値が割り当てられていない以外は2.関数の中で何でもできますが、最後の式は戻り値です.3.defnを使用する場合は、関数名は最初の行にある必要があります.
関数は必ずしも1つの値だけを返すわけではありません.データ構造を返すこともできます.
データ構造への転送も可能
複数のパラメータを定義できます
作者(私ではありません)は上から下へ書く関数が好きです.偽コードを見てください.
しかし、clojureは関数呼び出しを書く前に知る必要があります.例えばmy-func-aはdo-itで呼び出されますが、後で定義されます.この場合、declareを使用する必要があります.以下のようにします.
よく使われる制御判断,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 ...)