105 lines
2.7 KiB
Python
105 lines
2.7 KiB
Python
__author__ = 'RemiZOffAlex'
|
|
__email__ = 'remizoffalex@mail.ru'
|
|
|
|
from uuid import uuid4
|
|
|
|
|
|
def closure_include(name):
|
|
def closure_filter(closure):
|
|
return closure['child']==name
|
|
return closure_filter
|
|
|
|
|
|
def closure_exclude(name):
|
|
def closure_filter(closure):
|
|
return closure['child']!=name
|
|
return closure_filter
|
|
|
|
|
|
def scope_addition(context, parent = None):
|
|
name = str(uuid4())
|
|
context.scopes[name] = {}
|
|
if parent:
|
|
context.closures.append({
|
|
'parent': parent,
|
|
'child': name
|
|
})
|
|
else:
|
|
context.closures.append({
|
|
'parent': context.current,
|
|
'child': name
|
|
})
|
|
return name
|
|
|
|
# def scope_del(context, name):
|
|
# closures = []
|
|
# for item in context.closures:
|
|
# if item['child'] != name:
|
|
# closures.append(item)
|
|
# context.closures = closures
|
|
# del context.scopes[name]
|
|
|
|
def scope_del(context, name):
|
|
if name in context.scopes:
|
|
context.closures = list(
|
|
filter(
|
|
closure_exclude,
|
|
context.closures
|
|
)
|
|
)
|
|
del context.scopes[name]
|
|
return
|
|
raise Exception('Область видимости {} не найдена'.format(name))
|
|
|
|
def variable_addition(context, name, value = None):
|
|
current = context.scopes[context.current]
|
|
if name in current:
|
|
raise Exception('Double declaration of the variable %s' % name)
|
|
current[name] = value
|
|
|
|
|
|
def variable_delete(context, name):
|
|
current = context.scopes[context.current]
|
|
if name in current:
|
|
del current[name]
|
|
raise Exception('Переменная {} не найдена'.format(name))
|
|
|
|
|
|
def variable_exist(context, name):
|
|
current = context.scopes[context.current]
|
|
return name in current
|
|
|
|
|
|
def variable_get(context, name):
|
|
scope = context.scopes[context.current]
|
|
if name in scope:
|
|
result = scope[name]
|
|
return result
|
|
stack = []
|
|
if context.current != 'root':
|
|
stack.append(context.current)
|
|
while len(stack) > 0:
|
|
scope_name = stack.pop()
|
|
closures = list(
|
|
filter(
|
|
closure_include(scope_name),
|
|
context.closures
|
|
)
|
|
)
|
|
for closure in closures:
|
|
stack.append(closure['parent'])
|
|
scope = context.scopes[scope_name]
|
|
if name in scope:
|
|
result = scope[name]
|
|
return result
|
|
|
|
raise Exception('Переменная {} не найдена'.format(name))
|
|
|
|
|
|
def variable_set(context, name, value):
|
|
current = context.scopes[context.current]
|
|
if name in current:
|
|
current[name] = value
|
|
return
|
|
raise Exception('Переменная {} не найдена'.format(name))
|