#ふーむ。lconsだけをlazyなプリミティブにする、ということだと、lcons以外の関数で余再帰をうまく書けないということに気づいた。例えば(define (f xs) (lappend (g (car xs)) (f (cdr xs))) これだとlappendが普通の関数でfの再帰がeagerになるので停止しない。
#だからstream系の関数はボディ全体をdelayで囲んでいるのか。しかしここでpromise持ち出すと元の木阿弥だしなあ。lazy系関数だけimplicit force許しとくか。
#つまり(define (f xs) (lappend (g (car xs)) (delay (f (cdr xs)))))と書けるようにする。これならfの戻り値はpromiseでなくて良い。
#ちょっと型的に気持ち悪いが…
#だがそもそもlazy sequenceの発想自体が、lazyとeagerで厳密に分かれてるのがめんどい、適当に混ぜて使いたいじゃん、というものなので、今更型の整合性など気にする必要ないか。
#型の整合性を気にするなら m [a] では計算途中がmに包まれないので,計算途中も共有したければ,m [a] の代りに List m a = Nil | Cons (m a) (m (List m a)) 考えた上でm (List m a) を使うことになるでしょうね.最近別のことを考えていて同根の問題にでくわしました.
#diff --git a/src/Makefile.in b/src/Makefile.in
index 666c928..5367c13 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -419,10 +419,10 @@ install : all relink
@case `$(GAUCHE_CONFIG) --arch` in *-cygwin*|*-mingw*) \
$(INSTALL) $(INSTALL_LIBS) $(DESTDIR)$(BIN_INSTALL_DIR);;\
esac
+ $(POSTINSTALL)
$(GAUCHE_INSTALL) -m 444 -S $(srcdir) $(INSTALL_HEADERS) $(DESTDIR)$(HE
$(GAUCHE_INSTALL) -m 444 -S $(srcdir) $(INSTALL_SUBHEADERS) $(DESTDIR)$
$(GAUCHE_INSTALL) -m 444 -S $(srcdir) $(INSTALL_SCMS) $(DESTDIR)$(SCM_I
- $(POSTINSTALL)
uninstall :
for f in $(INSTALL_BINS); do rm -f $(BIN_INSTALL_DIR)/$$f; done
#遅くなりましたが、FreeBSDでmake installに失敗するのは上記のような修正をすれば治ります。gauche-install呼ぶ前にPOSTINSTALL(a.k.a. makeverslink)を呼ばなきゃダメってことですね。
#たぶんその前にバイナリをrelinkしてるからなんだろうと思いますが。
#% ls -l /usr/local/lib
total 5512
drwxr-xr-x 7 root wheel 7 Aug 6 2011 gauche-0.9/
lrwxr-xr-x 1 root wheel 20 Feb 20 10:56 libgauche-0.9.so@ -> libgauche-0.9.so.0.2
lrwxr-xr-x 1 root wheel 20 Feb 20 10:56 libgauche-0.9.so.0@ -> libgauche-0.9.so.0.2
-rwxr-xr-x 1 root wheel 5543752 Feb 20 10:56 libgauche-0.9.so.0.2*
#makeverslink自体の挙動は正しかったようです
#ああなるほど! 以前はそこもinstall呼んでたのを、out-of-tree buildの関係でgauche-installに変えたんですよ.
#でもrelink済みのgoshでgauche-install使うためにはmakeverslinkが終わってないとだめ、ということですね。
#はい
#POSTINSTALLという変数名が微妙になっちゃいますね ;-)
#変数名変えるか、あるいはインストールのターゲットをcore-installとaux-installみたいに分けてcore-installの最後でPOSTINSTALLするか、あたりかなあ。
#>nobsun [m a]とも違うんですよね。Schemeでdelay/force使って遅延ストリーム実装する時にそんなパターンが出てきているような気がするけどちょっと違うかな。
#それはありな気がしますね。gauche-installが動く==core-install完了、というのはわかりやすいです。