404 motivation not found | t_ishidaのブログ

CAT | Lisp

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

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

No tags

2月/08

13

EmacsのTips

メモだけだと、読みにきてくれた人に対して、アレなので

入力補完

aaaab
aaaac
aaa

と言うデータがあったとする。

1、最下行まで移動

2、M /を押す

すると、文中から単語を見つけだして、補完してくれる。

合っている奴がでるまで2を繰り返すことで、目的の単語に補完できる。

キーボードマクロ

http://d.hatena.ne.jp/k12u/20080213/p1

キーボードマクロの使い方は、上記で紹介されている通り。

これ割と色んなエディタで実装されてますが、Emacsの凄いところは、さらにここから。

レベル1

こんなデータが有ったとする。

A1,2,3,4,5,6
B1,2,3,4,5,6
C1,2,3,4,5,6

3カラム目と4カラム目の間に、xと言うカラムを追加したい。

1、kbd-macroを開始     

2、C-sを押してカンマを検索

3、C-sをさらに二回押す

4、x,を入力する。

5、C-aを押す

6、C-nを押す

7、キーボードマクロを終了

8、C-u 0 C-x e

と、検索した回数とかまで覚えているので、なかなか便利。

レベル2

こんなデータが有ったとする。

my( $aa, $aaa, $aaaa) = '';
$aa = 1;
$aaa = 1;
$aaaa = 1;

と言うデータを見やすくしたい。

0、$aaの行に移動する。

1、kbd-macroを開始     

2、C-sを押して”=”を検索

3、C-bで一つ戻る

4、M-x eval-expression

5、(indent-to 10)

6、C-aを押す

7、C-nを押す

8、キーボードマクロを終了

9、C-u 0 C-x e

と、Emacsの関数を絡めて、キーボードマクロを組めるので、

非常に便利。

Emacsの関数を調べたい場合は、aproposを使うと良い。

こんな関数ありそう?って思ったのを入力すると大概ある。

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

No tags

Find it!

Theme Design by devolux.org

Tag Cloud