2008年 08月 09日

一週間がおわった。今週は Perl で、MoCo と、Ridge を使って、一つのウェブアプリを作っていく感じだった。インターン生はやたら構ってもらえるのでびびる。来週はウェブアプリがどうこうから離れて大規模開発の手法とかみたい。このはてなインターンプログラムはかなりいろいろ力が入っていて恐縮しまくる。

非決定性計算

id:Gemma さんに教えてもらった。amb がスゲーんだよって話をしていて、amb ワカンネーつって、そもそも非決定性計算がなんなのか (用語的にまったく) わかってなくて調べたりきいたりしたメモ

  • 非決定性計算 → 非決定性は「曖昧」って意味 → amb/iguous
  • コード中で、値が曖昧なものは曖昧なままコードを書いて、計算結果をだす
    • その部分のコードだけ見ると、まるで答えが既にでているかのように見える
    • ↑ 宣言的なコードになる
    • パズルみたいなのがキレイに解ける。すごい
  • 中でやってることは総当たりだけど、実装法によって効率が変わる
    • バックトラックするために継続つかったりする
    • 遅延評価するとバックトラックと同じことになったりする → List モナドがほげほげ

適当な言語で実装してみよう。しかしほんとパズルとかやったことないな!

Perl: map にブロックわたす

メモ

my $l = sub {
	$_ * $_
};

my $foo = [
	map
		&$l,
		100, 200, 300
];

デリファレンスするのか! リファレンスそのままわたしてみて、わたせないとおもってた……

errormaker.vim と JS の syntax error 検知

まじべんり。いままでなんか syntax error が起きている気がするときは、手で js -s -w -C をうっていたのですが、激しくうちにくいので erorrmaker.vim でやれるようにしてみた。

#!/bin/sh
# vim:set ft=sh:
# ~/.vim/vimparse.js

# sudo port install spidermonkey
js -s -w -C $1 2>&1 \
	| grep ':$' \
#	| grep -v 'test for equality' \
" ftplugin/javascript/flyquickfixmake.vim  
" require spidermonkey
setlocal makeprg=$HOME/.vim/vimparse.js\ %\ $*
setlocal errorformat=%f:%l:%m
setlocal shellpipe=>

if !exists("g:javascript_flyquickfixmake")
	let g:javascript_flyquickfixmake = 1
	au BufWritePost *.js silent make
endif

配列やオブジェクトリテラルの最後のカンマとかも -s つけると検知できるので、ほんとべんり。ラッパスクリプト書いたのは、一部のエラーを無視したり、spidermonkey が入ってない環境でチェックするためだけど、まだ困ってないので特になにもやってない。

strict warning: test for equality (==) mistyped as assignment (=)?:

do {
    var node = ...;
...
} while (node = node.next());

条件のところに代入演算子つけたとき、spidermonkey の strict モードの警告でstrict warning: test for equality (==) mistyped as assignment (=)?: ってのがでる。よくある代入演算子と比較演算子の間違えを警告してるっていう便利な(?)機能なんだけど、errormaker.vim つかってるとうざい。

で、ラッパスクリプトでこの警告だけ常に排除してもいいのだけど、nanto_vi さんに twitter で教えてもらったところによると

do {
    var node = ...;
...
} while ( (node = node.next()) );

括弧で囲って式を明示するとでなくなるらしい。これからはこう書こう!

strict warning: anonymous function does not always return a value:

これは return が怪しいときにでる警告なんだけど、結構微妙な挙動をする。

// 最初の return が何も値を返していないので、これは警告がでる。
function (a) {
	if (!a) return;
	return 1;
}
// これは警告がでない
function (a) {
	if (!a) return;
	return;
}
// もちろんでない。
function (a) {
	if (!a) return null;
	return 1;
}
// これはとても残念ながら警告がでる
function (a) {
	if (!a) return null;
	return 1;

	function foo () {
	}
}

↑ この形は割と使うのでちょっと困る。けど、次からは先頭に書こう……

// これはでない。
function (a) {
	if (!a) return null;
	return 1;

	function foo () {
	}

	return 1;
}