quote_to_funargs, funargs_to_quote, remove_parenquote_to_funargs は quote 型のデータ (内部的には FNODE) を
quote への復元可能な形でリストへ変換する.
quotetolist は quote をリストへ変換するが, 一部の情報を捨てるため
もとの quote の復元はできない.
quote_to_funargs の戻り値は [fid, op, arg1, arg2, ...]
なる形式をしている.
ここで op は node の名前であり,
関数 get_function_name を用いて人間が読める形式
で取りだせる.
たとえば get_function_name(quote_to_funargs(quote(1+2))[1])
は "+" を戻す.
get_function_name はそのうち変更されるだろう.
I_PAREN を意味する.
数と意味の対応表は OpenXM/src/asir-contrib/packages/src/noro_simplify.rr
または OpenXM_contrib2/asir2000/parse/parse.h を見よ.
以下の fid が 0, 1, 2, ... に対応づけられている.
I_BOP, I_COP, I_AND, I_OR, I_NOT, I_CE,
I_PRESELF, I_POSTSELF,
I_FUNC, I_FUNC_OPT, I_IFUNC, I_MAP, I_RECMAP, I_PFDERIV,
I_ANS, I_PVAR, I_ASSPVAR,
I_FORMULA, I_LIST, I_STR, I_NEWCOMP, I_CAR, I_CDR, I_CAST,
I_INDEX, I_EV, I_TIMER, I_GF2NGEN, I_GFPNGEN, I_GFSNGEN,
I_LOP, I_OPT, I_GETOPT, I_POINT, I_PAREN, I_MINUS,
I_NARYOP
次の例では (x+1)+(x+2) の括弧をはずして x+1+x+2 に変換している.
[0] ctrl("print_quote",1) $
[1] Q=quote((x+1)+(x+2));
[b_op,+,[u_op,(),[b_op,+,[internal,x],[internal,1]]],
[u_op,(),[b_op,+,[internal,x],[internal,2]]]]
[2] FA=quote_to_funargs(Q);
[0,<...quoted...>,
[u_op,(),[b_op,+,[internal,x],[internal,1]]],
[u_op,(),[b_op,+,[internal,x],[internal,2]]]]
[3] FA2=quote_to_funargs(FA[2])[1];
[b_op,+,[internal,x],[internal,1]]
[4] FA3=quote_to_funargs(FA[3])[1];
[b_op,+,[internal,x],[internal,2]]
[5] funargs_to_quote([FA[0],FA[1],FA2,FA3]);
[b_op,+,[b_op,+,[internal,x],[internal,1]],
[b_op,+,[internal,x],[internal,2]]]
次の例は OpenXM/asir-contrib 版の asir で実行.
[1287] load("noro_simplify.rr");
1
[1293] noro_simplify.remove_paren(quote( f(1-(x))));
quote(f(1-x))
funargs_to_quote を用いて既存の quote の子供を置き換えて 新しい quote をつくり出せる.
[1184] R=quote_to_funargs(quote(a+(b+c))); [0,<...quoted...>,<...quoted...>,<...quoted...>] [1185] T=quote_to_funargs(quote(1+2)); [0,<...quoted...>,<...quoted...>,<...quoted...>] [1186] funargs_to_quote([0,R[1],R[2],T[2]]); quote(a+1)
ChangeLog
funargs_to_quote は変換する.
Go to the first, previous, next, last section, table of contents.