quote_to_funargs
, funargs_to_quote
, remove_paren
quote_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.