Gauche > Archives > 2012/02/20

2012/02/20 00:40:18 UTCshiro
#
ふーむ。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で厳密に分かれてるのがめんどい、適当に混ぜて使いたいじゃん、というものなので、今更型の整合性など気にする必要ないか。
2012/02/20 01:12:21 UTCnobsun
#
型の整合性を気にするなら m [a] では計算途中がmに包まれないので,計算途中も共有したければ,m [a] の代りに List m a = Nil | Cons (m a) (m (List m a)) 考えた上でm (List m a) を使うことになるでしょうね.最近別のことを考えていて同根の問題にでくわしました.
2012/02/20 01:58:44 UTC(び)
#
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自体の挙動は正しかったようです
2012/02/20 02:10:32 UTCshiro
#
ああなるほど! 以前はそこもinstall呼んでたのを、out-of-tree buildの関係でgauche-installに変えたんですよ.
#
でもrelink済みのgoshでgauche-install使うためにはmakeverslinkが終わってないとだめ、ということですね。
2012/02/20 02:11:55 UTC(び)
#
はい
#
POSTINSTALLという変数名が微妙になっちゃいますね ;-)
2012/02/20 02:14:04 UTCshiro
#
変数名変えるか、あるいはインストールのターゲットをcore-installとaux-installみたいに分けてcore-installの最後でPOSTINSTALLするか、あたりかなあ。
#
>nobsun [m a]とも違うんですよね。Schemeでdelay/force使って遅延ストリーム実装する時にそんなパターンが出てきているような気がするけどちょっと違うかな。
2012/02/20 02:17:46 UTC(び)
#
それはありな気がしますね。gauche-installが動く==core-install完了、というのはわかりやすいです。