kiyoka.2012_08_12 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2012_08
55555555555555555555555555555555555555555555555555555555
5

[Nendo][Lisp] Kyoto.Lisp Hackathon で作ったけどボツになったコード

5

Kyoto.lisp Hackathon #1EXT に参加してきた。

5
 logo120x80
5

話としては(kiyoka.2012_08_11[Nendo][Lisp] Kyoto.Lisp Hackathon でやったことのまとめ) の続き。

5

 

5

本エントリの目的は、Hackathon当日の作業のうち直近ではボツだが、今後再利用できそうなテクニックをメモしておくこと。

5

次のような場面で使うスペシャルフォームをマクロ定義した。

5

 

5

ちょっと恣意的な例ではあるが、長いベクタに対して高階関数による多段処理をする例だ。

5

大きなテキストファイルをまるごと読み込んだArrayも長いベクタになるので、実用的なプログラミングでも良く出てくるパターンだ。

5

入力データは巨大だが、最終的に takeメソッドで最初の数要素のみ使い、あとは不要な場合は遅延評価を使って無駄な計算は省きたい。

5
(use srfi-1)
5
5
(let ([vec (Range.new 0 1000000)])
5
  (for-each
5
   print
5
   (. 
5
    (map
5
     (lambda (x) (sprintf "<%05d>" x))
5
     (filter
5
      (lambda (num) (< num 100))
5
      vec))
5
    take 5)))
5

 

5

最後から2行目の vec を vec.lazy もしくは (lazy-vector vec)にすれば遅延評価を実現できるが、どこにlazyを指定するのが適当かを考えるのが面倒だ。

5

できれば、次のように(lazy S式)で囲めばその範囲で可能な限りよろしくやってくるのが嬉しい。(schemeのlazyと予約語がぶつかっているので、lazy-realmとかにしたほうが良いかな…)

5

 

5
(use srfi-1)
5
5
(lazy ;; この中のvector(すなわちRubyのArray型)は全てlazyに扱われる
5
 (let ([vec (Range.new 0 1000000)])
5
   (for-each
5
    print
5
    (. 
5
     (map
5
      (lambda (x) (sprintf "<%05d>" x))
5
      (filter
5
       (lambda (num) (< num 100))
5
       vec))
5
     take 5))))
5

 

5

それを実現するのがHackathon当日に書いた次のマクロ。

5

健全なマクロを使っている。コードが長いので、gistに貼りつけた。

5
 lazy special form sample — GistEXT
5

 

5

あとは%lazy-map、%lazy-for-each、%lazy-filterを関数で実装すれば、(lazy S式)で囲った中身のmap、for-each、filterの実装をlazy版に差しかえることができる。

5

便利そうな気もするが、影響範囲が大きいわりにはメリットが少ないような気もして、現段階では自分で(lazy-vector vec)する上の案に落ちついた。

5

それに、Nendoのsyntax-rulesはchibi-scheme 0.3からsyntax-rulesの実装のポーティングだが、ネストした "..." が扱えないという問題もあり、すっきり定義できていない。

5

このあたりも今後の課題として残る。

5

 

5

ただ、このテクニックを使ってpure(副作用無しのコードブロック宣言)も実現できるんじゃないかと考えているので、今後はそちらを試す予定。

5

pureのアイデアについてはこちらの過去記事を参照のこと。

5
 kiyoka.2011_10_07[Nendo][Ruby] コードブロックに副作用が混在するかを検出できるかどうか
5

こういう、できるかどうかわからないけど試す価値のある実験は1日かけて作業するHackathonが向いていると思った。

5

 

5

...comment disabled...