Пример #1
0
def parse_import(form):
    check(len(form) >= 2, '`import` requires 1+ args', form)
    form = form[1:]
    if is_list(form[0]):
        symbols = form.pop(0)
        check(all(is_symbol(x) for x in symbols),
              'imported names must be symbols', symbols)
        form.pop(0)
    else:
        symbols = None
    source = form.pop(0)
    check(is_symbol(source), 'import source must be a symbol', source)
    alias = form[1] if form else None
    if alias:
        check(is_symbol(alias), 'import alias must be a symbol', alias)
    return Import(source, symbols, alias)
Пример #2
0
 def parse(cls, L):
     if not (is_list(L) and all(is_symbol(p) for p in L)):
         _err('params must be list of symbols', L)
     required_names = [sym.name for sym in cls._parse_required(L)]
     optional_names = [sym.name for sym in cls._parse_optional(L)]
     rest = cls._parse_rest(L)
     rest_name = rest and rest.name or None
     return cls(required_names, optional_names, rest_name)
Пример #3
0
 def parse(cls, L):
     if len(L) != 3:
         _err('wrong number of args to def', L)
     sym = L[1]
     if not is_symbol(sym):
         _err('first arg to def must be symbol', L)
     val = L[2]
     return cls(sym, val)
Пример #4
0
def parse_params(form):
    check(
        is_list(form) and all(is_symbol(p) for p in form),
        'params must be a list of symbols', form)
    required = _parse_required_params(form)
    optional = _parse_optional_params(form)
    rest = _parse_rest_param(form)
    return Params(required, optional, rest)
Пример #5
0
 def define(cls, L):
     if len(L) < 3:
         _err('wrong number of args to defmacro', L)
     name = L[1]
     if not is_symbol(name):
         _err('invalid macro name', name)
     params = Params.parse(L[2])
     body = L[3:]
     return Def(name, cls(params, body))
Пример #6
0
def parse(expr):
    if is_list(expr) and expr and is_symbol(expr[0]):
        try:
            f = SPECIAL_FORMS[expr[0]]
        except KeyError:
            pass
        else:
            expr = f(expr)
    return expr
Пример #7
0
 def eval__Import(self, node):  # pylint: disable=invalid-name
     symbols = '*' if is_symbol(node.names) and node.names.name == '*' \
         else tuple(sym.name for sym in node.names) if is_list(node.names) \
         else ()
     alias = node.alias.name if node.alias else None
     if node.source.ns == 'py':
         self.ns.import_module(self.ns.load_module(node.source.name),
                               symbols, alias)
     else:
         self.ns.import_ns(self.ns.load_ns(node.source.name), symbols,
                           alias)
Пример #8
0
def parse_def(form):
    check(len(form) == 3, '`def` requires 2 args', form)
    _, sym, val = form
    check(is_symbol(sym), '`def` name must be a symbol', form)
    # If namespace `a` imports symbol `foo` from namespace `b`, then provides
    # `(def foo …)`, the reader resolves the symbol to `b/foo`, but the
    # intention is to define `a/foo`. To get that behaviour, we discard the
    # symbol namespace here.
    #
    # FIXME: this leads to confusing behaviour if a namespaced symbol is passed
    # to the reader. We should throw an error we read a qualified symbol that
    # resolves to another namespace, not silently rewrite it.
    sym = Symbol(sym.name, None, sym.meta)
    return Def(sym, val)
Пример #9
0
def parse_defmacro(form):
    check(len(form) >= 3, '`defmacro` requires 2+ args', form)
    _, name, params, *body = form
    check(is_symbol(name), 'macro name must be a symbol', name)
    return Def(name, Macro(parse_params(params), body))