diff -ur v37/ezmd.py v38/ezmd.py --- v37/ezmd.py 2019-10-15 20:51:00.000000000 +0900 +++ v38/ezmd.py 2019-10-16 23:04:00.000000000 +0900 @@ -601,8 +601,8 @@ if type(d) != dict: return - add_k = '__ADD__' - add_d = d.pop(add_k) if add_k in d else {} + ks = (add_k, arg_k) = ('__ADD__', '__ARG__') + (add_d, arg_d) = map( lambda k: d.pop(k) if k in d else {}, ks ) cv = lambda o: list( map(cv, o) ) if is_lst(o) else ( o if is_str(o) else str(o) ) d = dict( map( lambda kv: list( map(cv, kv) ), d.items() ) ) @@ -615,20 +615,60 @@ v = dv + v if is_str(dv) and is_str(v) else to_str(dv) + to_str(v) d[k] = v + ta = targ.get(arg_k, {}) targ.clear() targ.update(d) + if arg_d: + ta.update(arg_d) + ta = dict( filter( lambda kv: kv[0] in targ and kv[1], ta.items() ) ) + if ta: + targ[arg_k] = ta + def do_macro(buf): + def alst_get(s): + s = s[1:] # skip '(' + lst = [] + while s and ')' in s: + delim = ',' if ',' in s and s_idx(s, ',') < s_idx(s, ')') else ')' + (h, s) = div_delim(s, delim) + lst.append( h.strip() ) + return (lst, s) + + def do_arg(s, k, v, arg_d): + if k not in arg_d: + return (s, v) + + arg_lst = arg_d.get(k, []) + (h, t) = div_delim(s, k) + t = strip_head(t) + if not t or t[0] != '(': + return (s, v) + + (lst, t) = alst_get(t) + for (src, dst) in zip(arg_lst, lst): + f = lambda v: list( map(f, v) ) if is_lst(v) else v.replace(src, dst) if src in v else v + v = f(v) + s = h + k + t + return (s, v) + def f_dic(buf): - for (k, v) in macro_dic.items(): + arg_k = '__ARG__' + arg_d = macro_dic.get(arg_k, {}) + kvs = list( filter( lambda kv: kv[0] != arg_k, macro_dic.items() ) ) + for (k, v_) in kvs: def f(s): - if k in s: - if is_str(v): - return s.replace(k, v) - if is_lst(v): - lst = list( map( lambda a: [a] if a else [], s.split(k) ) ) - return sum( map( lambda b: b+v, lst[:-1] ), [] ) + lst[-1] - return s + if k not in s: + return s + r = [] if is_lst(v_) else '' + while k in s: + (s, v) = do_arg(s, k, v_, arg_d) + (h, s) = div_delim(s, k) + r += h if is_str(v_) else [h] + r += v + if s: + r += s if is_str(v_) else [s] + return r buf = flat_map(f, buf) return buf