Upgrade to Pro — share decks privately, control downloads, hide ads and more …

分解に救われる

 分解に救われる

地球はプラに、開発者の脳は複雑な引数指定に襲われてる。両方とも分解で解決できる。

Clojureの引数分解 (parameter destructuring) の軽いご紹介。

valerauko

May 24, 2018
Tweet

More Decks by valerauko

Other Decks in Programming

Transcript

  1. 羅列を分解 user=> (defn hoge #_=> "&でその他が取れる" #_=> [param1 & others]

    #_=> (list param1 others)) #'user/hoge user=> (hoge "fuga" 3.14 42) ("fuga" (3.14 42))
  2. 羅列を分解 user=> (defn hoge #_=> "いらない要素は無視できる" #_=> [_ param1 param2]

    #_=> (list param1 param2)) #'user/hoge user=> (hoge "fuga" 42 :konkon) (42 :konkon)
  3. 羅列を分解 user=> (defn hoge #_=> "ネストされた羅列も分解できる" #_=> [p1 [_ v1]

    p2] #_=> (list p1 v1 p2)) #'user/hoge user=> (hoge "fuga" [3.14 42] :konkon) ("fuga" 42 :konkon) user=> (hoge 3.14 "abc" :konkon)
  4. 羅列を分解 user=> (defn hoge #_=> ":asで全ても取れる" #_=> [p1 [_ p3

    :as meaning] p4] #_=> (list p1 p3 p4 meaning)) #'user/hoge user=> (hoge "fuga" [3.14 42] :konkon) ("fuga" 42 :konkon [3.14 42])
  5. 連装連想分解 user=> (def person #_=> {:name "Balint" #_=> :city "Tokyo"

    #_=> :like ["Clojure" "beer" #_=> "music" "mobage"]}) #'user/person
  6. 連装連想分解 user=> (defn say-hello #_=> "マップから欲しいキーだけ取れる" #_=> [{name :name city

    :city}] #_=> (str "Hello " name #_=> ", how is " city "?")) #'user/say-hello user=> (say-hello person) "Hello Balint, how is Tokyo?"
  7. 連装連想分解 user=> (defn say-hello #_=> ":orでデフォルト値⼊れられる" #_=> [{name :name :or

    {name "Foo"}] #_=> (str "Hello, " name "!")) #'user/say-hello user=> (say-hello {}) "Hello, Foo!"
  8. 連装連想分解 user=> (defn say-hello #_=> ":keys :strs :symsで短略に書ける" #_=> [{:keys

    [name city]}] #_=> (str "Hello " name #_=> ", how is " city "?")) #'user/say-hello user=> (say-hello person) "Hello Balint, how is Tokyo?"
  9. 連装連想分解 user=> (defn say-hello #_=> "好きに組み合わせもできる" #_=> [{:keys [name city]

    :or {name "Guest"} #_=> [like :as likes] :like}] #_=> (println (str "Hello, " name "! " #_=> "How is " like " in " city "?")) #_=> likes) #'user/say-hello user=> (say-hello person) Hello, Balint! How is Clojure in Tokyo? ["Clojure" "beer" "music" "mobage"]
  10. 必要か? 複雑なデータ構造をその ままで渡して、それぞれ の関数で必要なものだけ 抜けられるので⾮常に便 利。 (def person {"@context" "https://example.com/#ns"

    :name ["Erdos" "Balint"] :location {:country "Japan" :city "Tokyo"} :likes ["Clojure" "beer" "music" "mobage"] :work {:company "Studist" :position "Developer"} :skills {:language ["Hungarian" "English" "Japanese"] :code ["Ruby" "Python" "Clojure" "JavaScript" "SQL"]} :refs [{:url "https://balint.erdos.tech" :rel "Website"} {:url "https://github.com/valerauko" :rel "GitHub"} {:url "https://pawoo.net/@valerauko" :rel "Mastodon"}]})