分解に救われる

 分解に救われる

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

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

444cce43051f5e17e935b4bc471a0b68?s=128

valerauko

May 24, 2018
Tweet

Transcript

  1. 引数で地球を救う 引数分解に惚れてしまった話

  2. Erdos Balint • 株式会社スタディストでTeachme Biz開発 • ビール、⾳楽とプログラミング⼤好き • ⾃然を守ることを意識 @valerauko

  3. ⼤⾃然を守るのは⼈類の責任 プラスチック のゴミをなん とかしないと いけない

  4. プラ汚染をなんとかするために u使う量を減らす u捨てる時に分ける uゴミを無害化する

  5. プラ汚染をなんとかするために u使う量を減らす u捨てる時に分ける uゴミを無害化する

  6. プラ汚染をなんとかするために u使う量を減らす u捨てる時に分ける uゴミを無害化する

  7. プラ汚染をなんとかするために u使う量を減らす u捨てる時に分ける uゴミを無害化する 京⼯⼤・慶應の研究者が PETを分解する微⽣物を発⾒

  8. 引数が多いとわかりにくい 引数の意味がわからない 引数の必要性もわからない 問題

  9. ハッシュマップを渡してみる 「すべて」は取れないネストされた ハッシュは分解できない 問題

  10. 分解に救われる 地球も正気も

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

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

    #_=> (list param1 param2)) #'user/hoge user=> (hoge "fuga" 42 :konkon) (42 :konkon)
  13. 羅列を分解 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)
  14. 羅列を分解 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])
  15. 連装連想分解 user=> (def person #_=> {:name "Balint" #_=> :city "Tokyo"

    #_=> :like ["Clojure" "beer" #_=> "music" "mobage"]}) #'user/person
  16. 連装連想分解 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?"
  17. 連装連想分解 user=> (defn say-hello #_=> ":orでデフォルト値⼊れられる" #_=> [{name :name :or

    {name "Foo"}] #_=> (str "Hello, " name "!")) #'user/say-hello user=> (say-hello {}) "Hello, Foo!"
  18. 連装連想分解 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?"
  19. 連装連想分解 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"]
  20. 必要か? 複雑なデータ構造をその ままで渡して、それぞれ の関数で必要なものだけ 抜けられるので⾮常に便 利。 (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"}]})
  21. We’re hiring! Ruby on Rails, Vue.js, AWS