2003-11-27 (Thu)
_ mcsのbug
前に報告したbugがfixされていた。
<URL:http://bugzilla.ximian.com/show_bug.cgi?id=50839>
気をきかせてinterfaceを使うパッチを送ったけど、素直に継承した方がよかったか。
_ let
何か最近日記の更新が上手く行かないと思ったら、.emacsの
(defun commit-diary () (interactive) (save-buffer) (cd www-directory) (shell-command "make install"))
を
(defun commit-diary () (interactive) (let ((dir (pwd))) (save-buffer) (cd www-directory) (shell-command "make install") (cd dir)))
とした後で、(pwd)が"Directory ~/"みたいな文字列を返すので上手く行かないことに気付いて、 あわてて、
(defun commit-diary () (interactive) (let (save-buffer) (cd www-directory) (shell-command "make install")))
と直したせいだった。 (letを消さずに((dir pwd))だけ消したので(save-buffer)がletの第一引数として 扱われてしまった。)
最近ほとんどLispをいじることはないので、何回見ても誤りを見付けられなかったのだが、 やっぱり私はLispに向いてないのかもしれない。 (けっこう好きなんだけどな。)
_ 原さん
会社に原さんが来た(アウディのTTで!)。数学の会議で松江に来ていたらしい。
Haskellのモナドの話になって、原さんは「私にわからんのは(Haskellが)おかしい」と言っていた。 原さんにわからないなら、私にわかるわけがないな。
2004-11-27 (Sat)
_ BooのDuck Typing
「foo as duck」と書くと型チェックが動的に行われるというのが目新しい。
[Matzにっき(2004-11-26)より引用]
というとこだけ読むと、「何だ、s.is_a?(String)みたいなもん?」と思えるが、 実際には型チェックを動的に行うというより、リフレクションを使ってメソッド 呼び出しを行って、上手く行けばOK、というもののようだ。 ちなみに、duckの部分は例ではなくって、ほんとにduckと書く。
class Person: [getter(Name)] _name as string def constructor(name): _name = name class Car: [getter(Name)] _name as string def constructor(name): _name = name x as duck = Person("Shugo") print(x.Name) x = Car("March") print(x.Name)
ここで、x as duckの部分をx as Personに変えると、もちろんCarオブジェクトの 代入の部分で(静的な)エラーになる。 ちょっとObjective-Cに似てるかもしれない。duckはidだね。
.NETだとGroovyが使えなくて残念だと思ってたけど、こっちの方が面白そうだな:)
一番気になるのは型推論がほんとにうれしいのか、という点。Haskellだと他の部分が 自分がこれまで使って来た言語と違いすぎていてそこだけ評価できないんだけど、Boo はわりと普通っぽいのでいいかもしれない。 QDBMのインタフェイス書いてちょっと使ってみようかしら。
_ Booのmixin
ソースに含まれているcrazy_ideas.booというファイルを見ると、以下のような コードが、
mixin TraceMixin(Foo, ICollection): def before(name): print(name) def after(name): print(name)
これってメソッドコンビネーション? まだ実装はされてないみたいだけど、どういう仕様になるんだろう。