404 motivation not found | t_ishidaのブログ

4月/08

23

セルの海、マクロの空」に行ってきた。

ゴメンなさい、僕が甘かったです。

http://labs.gree.jp/Top/Study/20080422.html

「セルの海、マクロの空」

講師:山本和彦 氏 (IIJの方)

講義内容のUST

http://www.ustream.tv/channel/gree_ost

id:ichii386氏のお誘いがあり、xyzzyユーザーの僕としては断る理由も無く参加して参りしました。僕はxyzzyユーザーで、ちょっとした事なら*scratch*でLispもどきを書いたりしているので、内容が理解できないかも知れないと言う事を一切想定してなかったのですが、半分は理解できませんでした。*1

勉強不足を実感。

LISPに学ぶべきところ

前置き

内容やアジェンダ的なものは、資料を実際に見てもらった方が良いので書きません*2。USTを見てもらった方が良いと思います。

と言う訳で、レポーティング的なものをかいつまんで。

再帰

セルの入れ子がリストだから、再帰が得意なんだよ。と言うこと。つまりセルの入れ子を深く潜っていくので、再帰が得意っていうこと。つまり、単純な配列を再帰するのは本来面倒くさいんだ。

直観的に分かりやすいので素直にPerlで書くと*3

@data = (1,2,3);
&fnc( \@data, 0 );
sub fnc{
( $arg, $index ) = @_;
$arg->[$index] || return;
print $arg->[$index];
&fnc( $arg, $index + 1);
}

ってなってしまって、インデックスを使用しなければならずエレガントさにかける。

つまり、Lispのリストは

##ってなってるから
$data = [
1,
[2,
[3]
]
];
&fnc( $data );
sub fnc{
($arg) = @_;
##こう出来る。
( $car, $cdr ) = @{$arg};
print $car;
$cdr && fnc( $cdr );
}

と、なっていると言うこと。つまり入れ子になっているが故に再起の中にイテレータの発想が有ると言えば伝わるか?逆を言えば、再帰の難しい配列の仕様に、無理に再起を持ち込むべきではないと言えるとも思う。car,cdrの発想をすれば、ループよりも再起の方が直観的なのにね~。

LISPデザインパターン

資料:P38から始まる、fizzbuzzのリファクタリングは圧巻。マクロの話はさっぱり分らなかったがな!!(笑)、Lisperには「デザインパターン(笑)」なんて言うよりは、職人技って言って欲しいところだが。敢えて引用すると(一部省略、一部追記)

  • 関数は小さく
  • 副作用の有る関数とない関数を分けろ
    • Schemeでは副作用のある関数名に”!”が付く。
  • 再帰しろ
  • 高階関数を使え(直交性)
    • 仕事とデータの走査を分ける(重要)
    • map & reduce
  • マクロを書け

マクロを書けと再帰しろは、Lispの世界観なので敢えて無視しても、他はほぼ全てのLLで実現できるはず。*4

特に直交性の話は大事だと思った。

On Lispより(孫引きスマソ)

直行的プログラミング言語とは、
少数のオペレータを多数の様々な方法で結合させることで、多様な意味が表現できるものの事だ。
おもちゃのブロックは極めて直交的だが、
プラモデルはほとんど直交的ではない。

アルゴリズムはちょっと違うけど、Perlで言うとこういうことだと思う。

$is_fizzbuzz = sub{ $_[0] % $_[1] == 0 };
$fizzbuzz    = sub{ { 3 => 'fizz', 5 => 'buzz' } };
print join( "\n" , map{
$x = $_;
@words = map{ $is_fizzbuzz->( $x , $_) ? $fizzbuzz->()->{$_} : '' } keys( %{ $fizzbuzz->() } );
$_ .= ':';
$_ .=  scalar( grep $_ , @words  ) ? join '',  @words : 'hoge';
} 1..100 );

しかも、僕の目指すところの、「テストのし易い構造」と言う考え方とも非常によく合う考え方。目指してはきたけど、こういう分り易い言葉が有ると本当に開眼した気になる。

結論

多種多様な言語が、Lispをパクって言語を作ってきた。

では、自分で言語を作る事はあり得ないので、僕らは何をLispに学ぶべきか?

Lispからパクった言語仕様を含む言語を利用している、

僕らは、Lisperからパクれるものがたくさん有るはず。

ならば、Lisperからパクっていくために、Lispを読み書きしてみるべきと思う。

参考

xyzzy : http://www.jsdlab.co.jp/~kamei/

little schemer : http://tinyurl.com/4dbuou

プログラミング Gauche : http://tinyurl.com/2yfjrn

懇親会

id:monjudoh氏と喋ってた。

*1:教え方が駄目だから分らないと言う事では決して有りません

*2:一番上のリンク先からダウンロードできます。たぶん。

*3:Lisp分る人が会社に居ないので、Lispで書くとレポートにならなくなっちゃうしね。

*4:PHPは限定つきだとは思うがな!!可愛いよ、PHP。可愛いよ~

Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 本の紹介

落ち着くんだ、fizzbuzzを短く書いて落ち着くんだ。 >>

Find it!

Theme Design by devolux.org

Tag Cloud