!kiyoka.blog.2009_07 RSSPLAIN

Related pages: !kiyoka.blog.list
1551555222222222222202223333333333333333333330333555555555555555555555455555555550555555555555555555555555555555055555555555555505555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555505555555555555555555555555555555555555555555555555555555555555555555555055555555555555555555555550555555555555555555555555555555555555555555555555555555055555555555555555555555555555055555555555555555555055555555555555555555555555555555555555555055555555555555555505
1

kiyoka日記。NendoSekkaの開発や、最近思うことなど

5

最新10件!kiyoka.blog   過去記事一覧!kiyoka.blog.list

5

kiyoka.blog_header 

1

このブログを書いている人: 西山 清香(kiyoka) - twitter: @kiyokaEXT

5

5

 

5

 

2

kiyoka.2009_07_27[Nendo] Nendoの初期化ライブラリの階層構造

2

私がRubyで書いているLisp方言、 Nendoの開発状況続き。

2

今回は自分用のメモ。

2

 

2

Nendoの初期化ライブラリ init.nnd の階層構造

2
 一段下位の部品を使って一段上位の部品を構成している。
2
 名前の色は赤色がmacroで、青色が関数を示す。
2
 3754601231_ce30a2cd61_m
2

この図を見ると、初期化ライブラリはコードの再利用率が高いことが分かる。

2

反対に、実行効率という視点で見ると、マクロ展開のオーバーヘッドが多いため、実行効率が非常に低い。

2

Nendoはマクロの練習と、言語デザインの練習が目的なのでこれでいいのだと思っているのだが。

2

この図は、リファクタリングの影響範囲が調べやすくて良い。もっと早く描いておくべきだったか。

2

 

0

comment (disabled)

2

2

 

2

 

3

kiyoka.2009_07_26[本] Let Over Lambda

3

まだ買っていないのだけれど...

3

4434133632 LET OVER LAMBDA Edition 1.0: ダグ ホイト, Doug Hoyte, タイムインターメディアHOPプロジェクト

3

Amazonの商品説明より

3
 Let Over Lambdaは世にある中でも最も過激なコンピュータプログラミング書籍
3
 の1つだ。基礎から始まり、最も高度な言語、すなわちCommon Lispの最も高度
3
 な機能を説明する。トップ1%のプログラマだけがLispを使う。そして本書を理
3
 解すれば、そのLispプログラマのトップ1%になるのだ。本書は、プログラムを
3
 書くプログラムであるマクロに関するものだ。マクロこそが、Lispを世界で最
3
 も偉大な言語たらしめているものなのだ。正しく使えば、驚くべき抽象化の技
3
 法、プログラマの生産性、コードの効率、そして他所では耳にすることすらな
3
 いようなセキュリティをもたらしてくれる。マクロは、他の言語では全く不可
3
 能なことを可能にしてくれるのだ。
3

 

3

LOLの内容を理解すれば、1% x 1%で10000分の1のプログラマになれるそうな。

3

On Lisp 4274066371 がやっと読み終わりそうなので、その後買おう。

3

聞く所によると、On Lispよりも過激なんだそうな。

3

 

3

全部理解できればプログラムの世界がどんな風に見えるのだろう。

3

Nendoを作りながら読むと、ただ読むだけではつかめないマクロのパワーを実感できるので、マクロ本を読むのは今がチャンスなんだろう。

3

 

0

comment (disabled)

3

3

 

3

 

5

kiyoka.2009_07_25[Ruby] Ruby 1.8と Ruby 1.9の違い

5

Nendoの文字リテラルの扱いをどうしようかとRubyを調べてみると、Ruby 1.8とRuby 1.9に違いがあることを知った。

5

意外と大きな仕様変更なのではないかと思う。

5
 <Think IT> 先取り!Ruby 1.9.1 (2/3)EXT
5
   この変更に伴い、いくつか文字列まわりに重要な変更が発生します。
5
 例えば、文字の扱いがいろいろと変わります。従来、文字列に対して「
5
 String#[n]」とすると、バイト列のn番目の数値が返ってきました。つま
5
 り、"Hello"[0]は72を返す、といった具合です。しかし、今後文字列はエ
5
 ンコード情報を保持しますので、"Hello"[0]は"H"という1文字を返すよう
5
 になります。
5

 

5

Ruby 1.8では数値を返す。

5
$irb
5
>> ?a
5
?a
5
=> 97
5
>> ?a.class
5
?a.class
5
=> Fixnum
5

 

5

Ruby 1.9では文字列1文字を返す。

4
$ irb
5
irb(main):001:0> ?a
5
?a
5
=> "a"
5
irb(main):002:0> ?a.class
5
?a.class
5
=> String
5

 

5

Nendoの世界では、文字リテラルというのは無くして、1文字の文字列で代用出来るんじゃないかと思っている。

5

Nendoの処理系自体は、Ruby 1.8とRuby 1.9で動くようにしたいので、Nendoのユーザはこの差は意識しなくても良いはずだ。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_23[本][プログラミング] トム・デマルコも誤りを認める

5
 「測定できないものは制御できない」は誤りだった。-- by Tom Demarco:An Agile Way:ITmedia オルタナティブ・ブログEXT
5
 この記事のなかで、例えば、GoogleEarch や Wikipedia といったソフトウェ
5
 アが、果たして計測と制御という管理で作られただろうか、と問うている。そ
5
 して、2つの種類のプロジェクトを例にし、
5

 

5
  • Project A: 100万ドルのコストを使って 110 万ドルの価値を作る。
5
  • Project B: 100万ドルのコストを使って 5,000 万ドル以上の価値を作る。
5

 

5
 「計測と制御」は、Project A の世界では有効だが、Project B の世界ではほ
5
 とんど意味をなさない、と指摘している。これは、ソフトウェア開発という活
5
 動には「計測と制御」よりもっと大切なことが多く含まれており、その中では、
5
 「工学」の概念は「ポイントを外している」ということだ。
5

 

5

私がいま仕事でやっているような業務系Webアプリケーションは、Project Aに

5

入るのだけれど、Project Bのような要素も柔軟に取入れることで、高い価値が

5

つくれないかなと、いつも考えている、がなかなか答えはでない。

5

トム・デマルコも成果物の価値で考えると「工学」の狭い世界でチマチマ考え

5

てもたいした成果はでないと考え始めたのかな。

5

あの、トム・デマルコが?という感じ。

5

これまでトム・デマルコ信者だった品質保証部門の人とかはどんな気分なんだ

5

ろう...

5

 

5

[追記]

5

この記事を読むと、私が前述のブログ記事のタイトルに釣られていた可能性大。反省...

5
 アジャイルは二度死ぬ(Agile Only Live Twice)その1:トム・デマルコ氏の蹉跌とその誤謬  EXT
5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_22[本][Nendo] コードの世界 読了

5
 4822234312  まつもとゆきひろ コードの世界‾‾スーパー・プログラマになる14の思考法
5

やっと全部読んだ。本当にすばらしい本。

5

これだけの内容が1人の人間の手で一冊にまとまっているというのは奇跡だとおもう。

5

Rubyの解説本では無いけれど、読み終わったころには、Rubyの設計思想や優位性が理解できているという副作用もある。

5

読後は、Rubyでプログラムが書きたくなるかも。

5

私もS式中毒にかかってなかったら、この本を読んだ後は、プライベートなコードもRubyを使うことになっただろう。

5

 

5

ところで、私が一番知りたかったのは、クラスベースのオブジェクト指向と総称(Generics)ベースのオブジェクト指向の比較だが、そこまでの解説はなかった。

5

なんかこの本に書かれていたような気がして、最初から探してみたがそのような話題はなかった。

5

どんな本を探せば載っているのだろう。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_21[Nendo] Rubyとの連携を考える(3)

5

私がRubyで書いているLisp方言、 Nendoの開発状況続き。

5

Rubyの世界へのアクセス手段として引きつづき .(ドット)オペレータを実装してみた。 

5

3724069044_ae409ab32e_o

5
 (ここに書いた仕様はおそらく後日変わると思うので注意)
5

 

5

実際にコードを書いてみると何か違う

5

(. a b) は Rubyのa.bという式に起きかえられるという単純なルールにしてみた。

5

以下は、実際の動作。

5
nendo> (macroexpand '(. Kernel open))
5
Kernel.open
5
nendo> (macroexpand '(. a size))
5
a.size
5
nendo> (macroexpand '(. (. a size) to_s))
5
a.size.to_s
5
nendo> (macroexpand '(. (. a size) to_s (. to_s to_i)))
5
a.size.to_s.to_s.to_i
5
nendo> (set! str "str")
5
"str"
5
nendo> (. str size)
5
3
5
nendo> str.size
5
3
5
nendo> (+ (. str size) 1)
5
4
5

 

5

何が問題か

5

問題は . (ドット)の第一引数にインスタンスが指定できないこと。

5

 

5
nendo> (define a "str")
5
"str"
5
nendo> a
5
"str"
5
nendo> (. a size)
5
3
5

 

5

ここまでは良い。が、

5

symbolまたは (. symbol symbol ...) しか受けつけない様にしているので

5

例えば、次のようなコードは書けそうで書けない。

5
nendo> (. "str" size)
5
dot-operator requires symbol, but got str
5
        from ./init.nnd:292
5
        from ./init.nnd:267:in `initialize'
5
        .
5
        .
5
       (略)
5

 

5
nendo> (. 3 to_s)
5
dot-operator requires symbol, but got 3
5
        from ./init.nnd:292
5
        from ./init.nnd:267:in `initialize'
5
        .
5
        .
5
       (略)
5

 

5

Rubyを知っている人は、文字列などのリテラルを第一引数に指定したくなるだろうなあ。

5

制限がきつすぎるのかな。もうちょっと考えてみよう。

5

 

5

with-openを実装してみた

5

早速、 . (dot-operator)でRubyのライブラリを呼びだす例として、with-openを作ってみた。

5

使いかたは (with-open 手続き ファイル名) または、 (with-open 手続き ファイル名 openメソッドのオプション) と言う形式で記述する。

5

イメージはSchemeの with-input-from-file でいう with-系のユーティリティで、オープンしたRubyのFileオブジェクトを引数として手続きpredを呼びだす。

5

また、手続きpredの呼出後に、ファイルをクローズしてくれる。

5
(define (with-open pred . lst)
5
  (let1 len (length lst)
5
        (let1 f (cond
5
                 ((= 1 len)
5
                  (Kernel.open (car lst)))
5
                 ((< 1 len)
5
                  (Kernel.open (car lst) (cadr lst)))
5
                 (else
5
                  (error "with-open requires 1 or 2 arguments")))
5
              (let1 result (pred f)
5
                    (f.close)
5
                    result))))
5

 

5

実際に動かした。 

5

t.txtにはこんなテキストデータが入っている場合、

5
bash-3.2$ cat t.txt
5
line1_A line1_B line1_C
5
line2_A line2_B line2_C
5
line3_A line3_B line3_C
5

 

5

このコードを実行すると

5
(with-open
5
 (lambda (x)
5
   (map
5
    (lambda (x)
5
      (x.chomp.split.to_list))
5
    (x.readlines.to_list)))
5
 "t.txt")
5

 

5

結果はこうなる。

5
(("line1_A" "line1_B" "line1_C") ("line2_A" "line2_B" "line2_C") ("line3_A" "line3_B" "line3_C"))
5

 

5

それにしても .to_list が毎回必要なのがカッコワルイか。

5

それと、引数の順番は (with-open ファイル名 手続き openメソッドのオプション) の方がいいかもしれない。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_16[Nendo] Rubyとの連携を考える(2)

5

私がRubyで書いているLisp方言、 Nendoの開発状況続き。

5

Rubyの世界へのアクセス手段として引きつづき .(ドット)オペレータを考えてみる。

5

3724069044_ae409ab32e_o

5

 

5

リードマクロにこだわらずに考えてみる

5

要するに、LispからRubyに変換された時、instance.memberとかClass.memberという式に変換されるためにはどうなっていれば良いかだけを考えればいいのかな?

5

Lispのリードマクロの範囲で出来るかどうかは置いといて順に考えてみる。

5

 

5

例えば、

5
(. Date new)
5

は、Rubyの次の式に相当する

5
Date.new
5

 

5

その流れでいくと、引数が指定された時は、次の様になるだろう。(リードマクロのsplicingはしないという流れです)

5
((. Kernel printf) "%d" 100)
5

対応するRubyの式

5
Kernel.printf( "%d", 100 )
5

 

5

そして、.(ドット)が2個登場するパターンは、.(ドット)に続いてシンボルをたくさん並べてもいいのかも。

5
(. (. array sort) reverse)
5

5
array.sort.reverse
5

 

5
(. array sort reverse)
5

5
array.sort.reverse
5

 

5

応用編として .(ドット)が3個登場する呼びだしのパターンを書くと

5
((. str split sort reverse))
5

5
(str.split.sort.reverse)
5

となる。

5

 

5

これでも良い気がしてきた。が、後述のドットペア問題も残っているのだった...

5

 

5

set!も同様に処理可能かも

5

set!による代入

5
(set (. a b) 1)
5

これはコンパイルされた時にRubyの代入に変換される。

5
a.b = 1
5

 

5

ドットペア問題

5

shiroさんにも指摘頂いた、このコードがどうなるかを考えておかないと行けない

5
(foo . bar.baz)
5

単順にリーダで変換をかけると、次の様に変換される

5
(foo . (. bar baz))
5

それは、すなわちS式のセマンティクスで考えると、これと等価なのだ

5
(foo . bar baz)
5

 

5

うわー、たまたまドットを使っているせいでどちらのドットが残ったのかわかりにくいかも知れないが、実は2個目のドットがドットペアに置き換わったのだ。

5

うーん、まぎらわしい...

5

しかし、一応ドットの後ろにシンボルが2個以上続くので syntaxエラーになる。これでいいのか?(多分、この形式がmacroの展開形に出てきた場合は、なにが起きているのか分かりにくい問題になるだろう。)

5

 

5

さらに最低限syntaxエラーになるようにガードするためには、

5
.read
5

は、内部で

5
(. nil read)
5

もしくは

5
(. Kernel read)
5

に変換して、必ず引数を2個以上にやる必要があるだろう。

5

 

5

今の感覚では、これでいいんじゃないかなぁと思っている。

5

記述しやすいかどうかはある程度の量のサンプルコードとか実用コードを書いてみないとわからん感じがするぞ。

5

 

5

※ 最後に、なるべく (. a b) という形式をサポートしたい理由は、例えば Rubyのメンバ変数をメタプログラミングで一気にいじりたいという場合に macro展開形で(. a b) 形式で扱えた方が便利だと考えているから。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_13[Lisp][言語] Clojureのビデオを見る(2)

5

Nendoの開発でかなり参考にしたい言語であるClojureEXTのビデオをみた。

5

このあいだ紹介したやつ(kiyoka.2009_07_02)とは別のビデオ。

5

 

5
 InfoQ: ClojureEXT
5
 In this presentation from the JVM Languages Summit 2008, Rich Hickey
5
 discusses Clojure, which is an implementation of Lisp. Topics covered
5
 include Clojure features and syntax, example code, interoperation
5
 with Java, Clojure and functional programming, persistent data
5
 structures, concurrency semantics, references, transactions, software
5
 transactional memory, agents, implementation and pain points.
5

 

5

Rich Hickey自身によるClojureのプレゼンテーションビデオの中でもスライドショーが同期しながら見れるのはこれだけだと思う。また、Clojure自体の紹介が軽めに抑えてある。

5

私のように、Clojureの並列処理部分よりもJava連携やLispの拡張自体に興味があるような人にも見てもらいやすいと思う。

5

これを見るとやっぱり、配列とかをLispの構文に組みこんでしまっている点が気になる。

5
 こんなやつ
5
(drop 2[ 1 2 3 4 5]) -> (3 4 5)
5
 Mapなら、こう書くらしい(Rubyで言うところのHash)
5
(def m {:a 1 :b :2 :c 3})
5

 

5

これを入れてしまうかどうかが一つの分かれ道かも。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_09[Nendo] Rubyとの連携を考える(1)

5

私がRubyで書いているLisp方言、 Nendoの開発状況続き。

5

 

5

Clojureを参考にする

5

Clojureの .(dot) operatorを使うやりかたはクラスベースのオブジェクト指向言語との連携を行う上で非常に直感的で良いと思う。

5

.(dot)はJavaでもRubyでもメソッドやインスタンス変数へのアクセス記号として使われているので、見た目でLisp外のメソッド呼びだしが連想しやすい。

5

以下はClojureのサイトに掲載されているClojureの例。

5
 Clojure - java_interopEXT
5
(.toUpperCase "fred")
5
-> "FRED"
5
(.getName String)
5
-> "java.lang.String"
5
(System/getProperty "java.vm.version")
5
-> "1.6.0_07-b06-57"
5
Math/PI
5
-> 3.141592653589793
5

 

5

Nendoではどうするのか

5

Clojureの考えかたがそのまま流用出来るかどうか分からないけど、気持ち的にはこんな感じで書きたい。

5
 Lispのreadの呼びだし
5
(read)
5
 RubyのKernel#readの呼びだし
5
(.read)
5
 インスタンスのnew
5
(. new Date)
5
 同じく、インスタンスのnew
5
 これは、リーダマクロで (. new Date) に展開されることを想定。
5
(Date.new)
5

 

5
 RubyのKernel#openでファイルを開いてすべての行を読みこみ
5
(let1 f open( "file.txt" )
5
  (f.readlines.to_list))
5

 

5
 ブロックの最後に自動でクローズしてくれるwith-openも欲しい。
5
 ファイルを読みこんでソートして表示する例。
5
(for-each
5
  print
5
  (with-open( "file.txt" )
5
    (lambda (f)
5
     (f.readlines.sort_by.to_list)))
5

 

5

多分、Schemerが見てもRubyistが見ても両方キモチワルイと言うだろうな...

5

とりあえず、ここまで動けば発表のネタにはなるでしょう。

5

どうです?ちょっと遊んでみたくなりました?

5

 

5

まずは、ターゲットユーザが自分ひとりなので、自分がスラスラ書ける仕様を試してみるつもりです。

5

 

5

COMMENTsion

なかなか浮世離れした高尚な遊びですね。

当方、「python が Windows-31J を理解してくれないから、パッチあてよう!」なんて、極めて野暮なことをやっております(^^;

ようやく今の職場も SubVersion 導入!(いままではVSS) こないだ Wikiも立ち上げたし、今度は trac でも導入しようかと。

まったく関係ない話でしたね。

ネンド遊びができそうになってきたら、是非使わせてくださいね。

5

COMMENTshiro

foo.barをリーダマクロでS式として読むというのは前にやったことがあるんですが (その時は foo.bar を (-> foo bar) としていた)、

リーダマクロを素直に実装するとひとつのトークンからひとつのS式への変換になるので、例えばDate.newというトークンが (. new Date) に変換されることになると思います。つまり (Date.new) という式は ((. new Date)) になっちゃう。

リーダマクロにsplicing (リーダマクロが返したリストを ,@ のように親のリスト中に展開する) を許せば (Date.new) を (. new Date) にすることは可能ですが、そうするなら次のような場合の動作をうまく考えておく必要があります。

(foo bar.baz) ; splicingすると (foo . bar baz) になっちゃう。

(foo . bar.baz) ; こんなふうに使われたらどうする?

5

COMMENTkiyoka

> なかなか浮世離れした高尚な遊びですね。

そうですね。世の中ドラクエが発売されたというのに、こんな遊びを見つけてしまいました。

なかなかどうしてゲームに匹敵する面白さです。

> ネンド遊びができそうになってきたら、是非使わせてくださいね。

あと何ヶ月かしたら、Rubyと組み合わせて遊べるようになると思います。

よろしくお願いします。

5

COMMENTkiyoka

shiroさんにコメントをもらってからいろいろ考えてみたんですが、リーダマクロで単順に変換するわけにはいかなそうですね。

例えば、

 (Date.new) は (. Date new) に展開されて欲しいけれども、

 (Date.new.strftime "%X") は (. (. Date new) strftime "%X") に展開されて欲しいと思ったら単純にはいかなさそうです。

また、Clojureでも (set! (instance.member_val) 20) のように set!で インスタンス変数を更新できる様ですが、それも含めて考えると、統一的なルールで処理出来るかどうか考えている所です。

もうすこし考えが進んだらブログエントリを書きます。

※ それから、このエントリで 『リーダマクロで (. new Date) に展開されることを想定。』と書いていた所は (. Date new)の間違いでした。すみません。

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_07[言語] JRubyの開発者がオレ言語も作っている件

5
 InfoQ: JVMで動く言語Ioke:分かりやすい構文で、LispとRubyの力を持つ言語EXT
5
 Ola Bini氏は、JRubyEXT開発の中心人物であり、Practical JRuby on Rails
5
 Projectsの著者である。その彼が、IokeEXTというJVMの上で動く新しい言語を開
5
 発している。
5
 ioke
5

 

5
 私は言語に関していくつか目標をもっており、そのなかでももっとも具体的な
5
 目標は、私がRubyやLispで好きな点を取り入れた言語を作ることです。Ioには
5
 既に自分が求めている機能が沢山あることは分かっていますが、ある場面で、
5
 十分でないなと思うことがあります。また同様に内部DSLを表すのに非常に適し
5
 た言語を欲しいとも思っています。自分の邪魔をせず、望んでいることを成し
5
 遂げるのに必要な力を沢山与えてくれる言語が欲しいと思っています。そのよ
5
 うな成り行きで、私はマクロシステムを設計しました。私が設計したものに対
5
 して、おそらく正気でないと思う人もいることでしょう。
5

 

5

Ola Bini氏がJRubyを開発しながらも、自分の言語もデザインしてみたいというのは分かる気がする。

5

技術があるなら、既にある言語の処理系を作るだけで満足するのはもったいないもの。

5

 

5

それはそうと、LispとRubyの力の両方をうまく融合したものを作りたいという野望は私と同じだ。

5

それをどうやって実現するかは三者三様のビミョウに異なった答えがあるわけで。

5

結局、強力なDSLを構築したかったら『マクロを使う』というのは一つの確実な方法で、それをいかに黒魔術にならない範囲で表現できるかが未解決の問題だと思う。

5

NendoはLispなので黒魔術になってしまうことは避けられず、その点は未解決問題としてスルーになるんだろうか。

5

それともすごいアイデアを思い付いちゃったりするんだろうか ^_^

5

そんな期待感があるから言語デザインはいつまで経っても楽しい創作テーマなんだと思う。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_06[Lisp][Nendo] Shibuya.lisp #3のビデオを見た感想(1)

5

実用レベルで使う処理系を作っている方々は実行速度に対する意識が高いなあと感じた。

5
 shiroさん。現場のSchemeの話題。Gaucheの開発サイクルがわかる。すばらしい。
5
 K8TR8mLFgf8 現場のSchemeとGaucheの進化 <1/6>
5

 

5
 koguroさん。いつもプレゼンのクオリティが高い。ビデオになっても分かりやすい。
5
 JhdhjkTxiSc  Inside c-wrapper <1/7>
5

 

5

実行速度重視なのはGaucheとかYpsilonとかMoshのScheme実装者がみんなゲームやOSにかんらんでいる人だからだろうか。

5

そういえば、koguroさんのc-wrapperもパフォーマンスチューニングの話が多かった。

5

 

5

LispやSchemeを仕事で使っていないせいかもしれないが、私はどちらかというと実行速度よりもコードの行数が少しでも短くなる事に興味がある。

5

さて、われらがNendoについては最終的にはWebプログラミングに利用したいと思っているので、そんなにシビアなチューニングは不要だと思っているが、甘いのかな?

5

Webアプリは主にDB回りがボトルネックになってくるので、言語側はソースコードの行数圧縮だけを気にすれば良いのではと思っているが...

5

まあ、やってみるとハッキリするよね。

5

1年後に自分がどんなことを言っているか楽しみ。正反対のことを言ってたりして。可能性は十分ある(笑)

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_05[Nendo] quasiquoteが動いた日

5

私がRubyで書いているLisp方言、 Nendoの開発状況続き。

5

 

5

ついに、ついに、quasiquoteが動いた!

5

(※quasiquoteは、ほとんどのLisp系言語がサポートしています。リスト内包表現に代表されるリストの部分展開をサポートする機能で、 `  ,  ,@  の3つの記号を使います)

5

もうすぐ動くかも、という日々が何日も続いていたので、この上ない達成感がある。

5
 _MG_3370
5

Toy言語とはいえ、ちゃんと遊べる様にするためにはちゃんと実装しておかないとね。

5

 

5

これが、現段階での quasiquoteの実行結果。

5
nendo> `(1 2 3)
5
(1 2 3)
5
nendo> (set! a 3)
5
3
5
nendo> `(1 2 ,a)
5
(1 2 3)
5
nendo> `(1 2 ,@(list a))
5
(1 2 3)
5
nendo> `(1 ,@(list 2 a))
5
(1 2 3)
5
nendo> (set! a 11)
5
11
5
nendo> `,a
5
11
5
nendo> ``,a
5
`,a
5

 

5

R6RSのスペック R6RS:翻訳:R6RS:11.17 QuasiquotationEXT に書いてあるサンプルも一応動いている。

5
nendo> `(list ,(+ 1 2) 4)
5
(list 3 4)
5
nendo> (let ((name 'a)) `(list ,name ',name))
5
(list a 'a)
5
nendo> `(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f)
5
(a `(b ,(+ 1 2) ,(foo 4 d) e) f)
5

 

5

これからRubyとの連携にも手をつけて、どこかでプレゼンできるようなネタを仕込んでいこう。

5

育児中の身なので Shibuya.lisp テクニカルトーク#3EXT には行けなかったけど、今度は何とか都合をつけてイベントに出かけて発表したい。

5

 

0

comment (disabled)

5

5

 

5

 

5

kiyoka.2009_07_02[Lisp][言語] Clojureのビデオを見る(1)

5

Nendoの開発でかなり参考にしたい言語であるClojureEXTのビデオがYoutubeにあった。

5

iPod touchに入れて数日かけて通勤中に見た。

5

 

5
 Intro to Clojure - 1 to 10
5
 Aoeav_T1ARU  D5kIq5dyb6o  2CXT5ij8QW8  R6_tJZknaV0  YvE8E3AfNfk 
5
 
5
 x7qdM0k8r14  tX2nZEaXYso  0VuzFKOZ8aY  v_F-TVv2BZs  f8KLIINmd6k 
5

 

5

特にJava Integrationの所は非常に参考になる。

5

JavaのインタフェースをClojureからアクセスするためのproxyというキーワードが出てきたのだが、これなんだろう。

5

. (ドット)記号でJavaのクラスやメソッドにアクセスする構文は見たことあるけどproxyも調べておこう。

5

それから、NendoのRuby連携のアイデアの為にも、Nendoの開発が一段落したらClojureの書籍をじっくり読んでおいた方がいいかも。

5

Java連携に限らずClojureには本気で役に立ちそうな機能が満載で開発に3年もかかっているというのもうなずける。

5

 

0

comment (disabled)

5