destructuring-bind ってステキですね
例えば Ruby ではこういうことが出来る。
a, b = [1, 2] a+b #=> 3
便利ですね。
そして Clojure ではこういうことが出来る。
(def m {:a 1, :b 2, :c 3}) (let [{a :a, c :c} m] (+ a c)) ;=> 4 (def v [100, 200, 300]) (let [{a 0, b 2} v] (+ a b)) ;=> 400 (let [[a, _, c] v] (+ a c)) ;=> 400
キモいですねw。一緒に Clojure を勉強している女の子が思わず f word 使う程度には crazy だと思います。けど、実際これに近いもの(こんなにキモくないもの*1 )は Common Lisp にもあるらしい。 destructuring-bind って一般的に呼ばれているのかな。ってのを昨日知って、 Gauche でも似たようなこと出来るのかなーとか Scheme にもそういうのあるのかなーと思って調べたらあったので少し試した。
ref: Gauche Users' Reference: 11.52 util.match - Pattern matching
(use util.match) (match-let [((a b c) '(1 2 3)) (((var val) body ...) '((1 2) 3 4 5))] (print (+ a b c)) (print `(,var ,val ,body))) ;; 6 ;; (1 2 (3 4 5)) ;;=> #<undef>
util.match のページは何度か読んでいるけど、そのときは match-let の意味がよく分からなかったし、何でそれが便利なのかも理解出来なかったけど今ならこれの意味がだいたい分かる。
It is similar to, but more powerful than Common Lisp’s destructuring-bind.
Common Lisp のそれより強力ぽい。凄い。これの強力なところは単純な変数ではなくてパターンであるところなのかな。
Generalize let, let*, and letrec to allow patterns in the binding position rather than just variables.
なんとなくみてみたけど、 destructuring-bind っていう考え方面白いと思った。いいなぁ、とても。