Exemplo n.º 1
0
def prim_loop(compiler, src):
    if src[2] != lisp.Symbol('<-'):
	raise SyntaxError, src[:3]
    loop_binding = src[1]
    loop_init = src[3]
    loop_body = src[4:]
    
    loop_name = pycode.name('loop')
    context.curr().setdefault('LOOP_STACK', []).append(loop_name)

    tpl = \
	    '%s = $#\n' % (loop_name,) + \
	    'while True:\n' + \
	    '  try:\n' + \
	    '    $#\n' + \
	    '  except _ME:\n' + \
	    '    break\n' + \
	    '  $#\n' + \
	    '  break\n' + \
	    loop_name

    output_code = pycode.create(
	    tpl,
	    compiler.compile(loop_init),
	    compiler.compile((lisp.Symbol('='), loop_binding, lisp.Symbol(loop_name))),
	    compiler.compile_block(loop_body, loop_name))
    context.curr()['LOOP_STACK'].pop()
    return output_code
Exemplo n.º 2
0
def prim_for(compiler, src):
    if lisp.Symbol('<-') != src[2]:
        raise SyntaxError(src[:3])

    matcher = src[1]
    datasource = src[3]
    body = src[4:]

    queue_name = pycode.name('for_queue')
    context.curr().setdefault('FOR_STACK', []).append(queue_name)

    if type(matcher) is lisp.Symbol:
        tpl = '%s = []\nfor %s in $#:\n  %s.append($#)\n%s' % (
            queue_name, matcher.name, queue_name, queue_name)
        datasource_code = compiler.compile(datasource)
        if body:
            body_code = compiler.compile((lisp.Symbol('env'), matcher) + body)
        else:
            body_code = pycode.create(matcher.name)
        output_code = pycode.create(tpl, datasource_code, body_code)
    else:
        datasource_code = compiler.compile(datasource)
        if datasource_code.value == '_':
            datasource_code = datasource.asname(pycode.name())

        for_var = pycode.name('for_var')
        proc_compiler = proc.Compiler(compiler)
        matcher_code = proc_compiler.compile(for_var, matcher)

        tpl = \
         '%s = []\n' % (queue_name,) + \
         'for %s in $#:\n' % (for_var,) + \
         '  try:\n' + \
         '    $#\n' + \
         '  except _ME, e:\n' + \
         '    continue\n' + \
         '  %s.append($#)\n' % (queue_name,) + \
         queue_name

        if body:
            body_code = compiler.compile((lisp.Symbol('env'),
                                          lisp.Symbol(matcher_code.value)) +
                                         body)
        else:
            body_code = pycode.create(matcher_code.value)
        output_code = pycode.create(tpl, datasource_code, matcher_code,
                                    body_code)
    context.curr()['FOR_STACK'].pop()
    return output_code
Exemplo n.º 3
0
def _parse_if(source):
    """Parse if chain into sections"""
    chain = []
    source_idx = 0
    while source_idx < len(source):
        node = source[source_idx]
        if node == lisp.Symbol('if'):
            chain.append((source[source_idx + 1], []))
            source_idx += 1
        elif node == lisp.Symbol('else'):
            chain.append((None, []))
        else:
            chain[-1][1].append(node)
        source_idx += 1
    return chain
Exemplo n.º 4
0
def prim_env(compiler, src):
    env_name = pycode.name('env')
    env_code = compiler.compile(src[1]).asname(env_name)
    lisp.env_push(env_name)
    body_code = compiler.compile_block((lisp.Symbol('_'), ) + src[2:])
    lisp.env_pop()
    return env_code + body_code
Exemplo n.º 5
0
def is_prop_fetch(src):
    if type(src) is not tuple:
        return False
    if len(src) > 2 and src[1] == lisp.Symbol('->') and (lisp.getop(
            src[-1]) == ':' or not isinstance(src[-1], tuple)):
        return True
    return False
Exemplo n.º 6
0
def prim_def(compiler, source):
    fn_name = lisp.getop(source[1])
    if fn_name is not None:
        return compile_fn(compiler, fn_name, source[1][1:], source[2:])
    else:
        return compiler.compile((lisp.Symbol('='), source[1], source[2:]))