=================================================================== RCS file: /home/cvs/OpenXM/src/asir-contrib/testing/tr.rr,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- OpenXM/src/asir-contrib/testing/tr.rr 2005/04/01 08:08:36 1.1 +++ OpenXM/src/asir-contrib/testing/tr.rr 2005/04/02 05:56:57 1.2 @@ -0,0 +1,241 @@ +/* $OpenXM$ */ +/* $Id: tr.rr,v 1.2 2005/04/02 05:56:57 takayama Exp $ */ + +/* + OpenXM版の Risa/Asir で実行のこと. OpenXM 版の関数を用いるため. +*/ +/* $Id: tr.rr,v 1.2 2005/04/02 05:56:57 takayama Exp $ + このファイルは quotetolist でリストに変換したデータに対して + パターンマッチおよびそれを応用した変形を行う. + tr.oxt の仕様とことなり quotetolist で変換したものを扱う. + テストプログラムのため効率は無視. (append の多用, 無駄な2重呼び出し, など)) +*/ + +extern Debug$ +Debug=0$ +def dprint(X) { + if (Debug) print(X); +} +def dprint0(X) { + if (Debug) print(X,0); +} + + +def qt_node(F) { + return [F[0],F[1]]; +} +/* Number of child */ +def qt_nchild(F) { + return length(F)-2; +} +def qt_child(F,K) { + return F[K+2]; +} + +/* + リスト F が リスト P に(先頭からの比較で)マッチしたら 1. + そうでないから 0. 幅優先探索. + Todo: P に任意関数を含む仕組みはまだ実装してない. +*/ +def tr_match0(F,P) { + dprint0("tr_match0: F="); dprint(F); + dprint0("tr_match0: P="); dprint(P); + + if (type(F) != type(P)) return 0; + if (type(F) != 4) { + if (F == P) return 1; + else return 0; + } + Node = qt_node(F); + Node2 = qt_node(P); + if (Node2 == ["function","pn"]) return 2; + if (Node != Node2) return 0; + N = qt_nchild(F); + if (N != qt_nchild(P)) return 0; + for (I=0; I action 関数の中で再帰的に呼べば深さ優先となる. + Todo: 書き換えがおこったかのフラグ. +*/ +def tr_rp(F,P,Q) { + dprint0("tr_rp, F="); dprint(F); + dprint0("tr_rp, P="); dprint(P); + dprint0("tr_rp, Q="); dprint(Q); + if (tr_match0(F,P)) { + BindTable = tr_make_binding(F,P); + dprint0("BindTable="); dprint(BindTable); + return tr_apply_function0(Q,BindTable); + } + if (type(F) != 4) return F; + Node = qt_node(F); + N = qt_nchild(F); + Ans = Node; + for (I=0; I