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

分解に救われる

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 分解に救われる

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

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

Avatar for valerauko

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"}]})