2008年 08月 09日

非決定性計算

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;
}
2008年 08月 07日

List::Enumerator without Moose

なんかやっぱこういうライブラリ (適用範囲がひろい) で Moose つかってると使いにくいので、Moose なしのをつくってみました。POD 変えたりしたら Moose ナシでリリースしたいです。

2008年 08月 06日

gerry++

uuu

2008年 08月 03日

AA記法

なんかうちのかんきょう (Mac OS X + Firefox 3 + IPA モナー Pゴシック) だとスタイルがちゃんとあたらないので

div.ascii-art {
    font-family: "IPA モナー Pゴシック", sans-serif !important;
}

した。

2008年 07月 31日

ブログパーツの JS のテンプレ

まだ試行錯誤中

(function blogparts_name ($, Deferred) { with (Deferred) {

var script = (function me (s, l) { l = (l || s.length) - 1; return /XXX/.test(s[l].src) ? s[l] : me(s, l) })(document.getElementsByTagName("script"));
var params = {}; script.src.match(/#(.+)/)[1].replace(/([^,=]+)=([^,=]+)/g, function (_, key, val) { params[key] = val });

// メイン処理

} // end with

function log (m) {
	if (window.console) window.console.log(m);
}

... ユーティリティ関数群

}).apply(this, (function Libraries () {
// ライブラリのコードコピペ

//=begin jQuery {{{
//=end jQuery }}}

//=begin JSDeferred {{{
//=end JSDeferred }}}

return [window.jQuery.noConflict(true), Deferred];
})());
2008年 07月 30日

gerry++

起きてすぐトイレ…… お腹痛くはない