=================================================================== RCS file: /home/cvs/OpenXM/src/asir-contrib/testing/tr.rr,v retrieving revision 1.1 retrieving revision 1.5 diff -u -p -r1.1 -r1.5 --- OpenXM/src/asir-contrib/testing/tr.rr 2005/04/01 08:08:36 1.1 +++ OpenXM/src/asir-contrib/testing/tr.rr 2005/04/15 12:47:14 1.5 @@ -0,0 +1,365 @@ +/* $OpenXM: OpenXM/src/asir-contrib/testing/tr.rr,v 1.4 2005/04/06 09:26:28 takayama Exp $ */ +/* $Id: tr.rr,v 1.5 2005/04/15 12:47:14 takayama Exp $ */ + +/* + OpenXM版の Risa/Asir で実行のこと. OpenXM 版の関数を用いるため. +*/ +/* $Id: tr.rr,v 1.5 2005/04/15 12:47:14 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); +} + +/* quotetolist の逆関数. ただし文字列で */ +def listtoquote_str(L) { + return quote_input_form_quote_list(L); +} + +def qt_node(F) { + if (type(F) == 17) F=quotetolist(F); + return [rtostr(F[0]),rtostr(F[1])]; +} +/* Number of child */ +def qt_nchild(F) { + if (type(F) == 17) F=quotetolist(F); + return length(F)-2; +} +def qt_child(F,K) { + if (type(F) == 17) F=quotetolist(F); + 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); + /* pn に何の制約もなければ 2 を戻す. */ + if (Node2 == ["function","pn"]) return tr_check_pn(F,P); + 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 nn(f(nn(x),nn(y))) + qt_map_arg(nn,quote(1/4+f(x))) --> + テストは test4(). +*/ +def qt_map_arg(F,Q) { + F = rtostr(F); + if (type(Q) == 17) Q=quotetolist(Q); + if (rtostr(Q[0]) == "internal") { + T = listtoquote_str(Q); + return eval_str( "quote("+F+"("+T+"))" ); + } + /* node の子供を F で評価する. */ + N = qt_nchild(Q); + L = []; + for (I=0; I