トップ «前の日記(2005-12-05) 最新 次の日記(2005-12-12)» 編集

Route 477



2005-12-09

[javascript] Ruby.js

(via 最速インターフェース研究会)

javascript上に、「Ruby風」のメソッドを実装するスクリプト。

使用例より:

[1, 2, 3].each(function(item) {
   alert(item * 2)
})

each! eachが!

[1, 2, 3].map(function(item) {
  return(item * 2) //returnが省略できないことに注意
}).each(alert)     //関数を直接渡すこともできる

functionをdoに置き換えたらRubyと見間違えそう。

スクリプト本体はこちら:ruby-talk:117184

[scheme] 2次元リストの転置

((1 2 3)
 (4 5 6)
 (7 8 9))

を、

((1 4 7)
 (2 5 8)
 (3 6 9))

とするにはどうすれば良いか。

あーなんかHaskellでzipWithとか使うの見た覚えがあるなーどこだったっけなーと思っていたら、 こんな書き方を発見

(define (transpose lst)
  (apply map list lst))

Rubyのmapが念頭にあったので*1、 これでどうやって転置できるんだ!? と思ったら、複数のリストを与えた場合は 特別な動作 *2 をするんだった。なーんだ(笑)。

*1 Rubyでは [1,2,3].map{|i|...} のような呼び出し方をするので、複数のリストを'mapする'という概念はない

*2 例えば (map cons '(a b c) '(d e f)) とすると ((a . d) (b . e) (c . f)) を得る