--- esd.py- 2016-09-13 00:00:00.000000000 +0900 +++ esd.py 2016-09-14 00:00:00.000000000 +0900 @@ -347,8 +347,8 @@ def es_split(s): def get_call_inf(info): return info.get('call_stk')[-1] -def get_env(info): - return get_call_inf(info).get('env') +def get_env(info, g=False): + return info.get('genv') if g else get_call_inf(info).get('env') def get_flags(info): return get_call_inf(info).get('flags') @@ -363,22 +363,29 @@ def was_flags(info, f): flags.remove(f) return ret -def is_exist(name, info): - return name in get_env(info) +def is_exist(name, info, g=None): + if g is not None: + return name in get_env(info, g) + return is_exist(name, info, g=False) or is_exist(name, info, g=True) def get_val(name, info): - if is_exist(name, info): + if is_exist(name, info, g=False): return get_env(info).get(name) + if is_exist(name, info, g=True): + return get_env(info, g=True).get(name) err_not_found(name) def set_val(name, val, info): - if is_exist(name, info): + if is_exist(name, info, g=False): get_env(info)[name] = val return val + if is_exist(name, info, g=True): + get_env(info, g=True)[name] = val + return val err_not_found(name) def new_val(name, val, info): - if not is_exist(name, info): + if not is_exist(name, info, g=False): get_env(info)[name] = val return val err_exit("alredy exist '{}'".format(name)) @@ -570,7 +577,7 @@ def do_expr(expr, info): if k == 'type': return do_type(expr, info) - if k in [ 'fproto', 'etc' ]: # do nothing !!! + if k in [ 'fproto', 'etc', 'fdef' ]: # do nothing !!! return None warn_no_sup('do_expr', '[k, v]', [k, v]) @@ -619,6 +626,16 @@ def do_fcall(name, args, info): call_inf = call_stk.pop() return call_inf.get('ret', None) +def do_global(lst, verb): + genv = {} + inf = { 'name' : None, 'env' : genv, 'flags' : [], 'loop' : 0 } + call_stk = [ inf ] + info = { 'lst' : lst, 'call_stk' : call_stk, 'genv' : genv, 'verb' : verb } + blk = [ 'br_s', '{', lst ] + do_expr(blk, info) + info.get('call_stk').pop() + return info + def warn_no_sup(f, t, v): warn("{}() not support {}='{}'".format(f, t, v)) @@ -660,9 +677,11 @@ if __name__ == "__main__": lst = es_split(s) if verb >= 3: show_yaml(lst, 'lst') + + info = do_global(lst, verb) + argv = argv[1:] args = [ len(argv), argv ] - info = { 'lst' : lst, 'call_stk' : [], 'verb' : verb } ginfo = info rcode = do_fcall( 'main', args, info ) rcode = int(rcode)