Ejemplo n.º 1
0
def condToIf_Rec(exp):
    test = exp.car.car
    action = exp.car.cdr.car
    if exp.getLength() == 2:
        l = [sexprs.Symbol('IF'), test, action, exp.cdr.car.cdr.car]
        return reader.makePair(l, sexprs.Nil())
    else:
        l = [sexprs.Symbol('IF'), test, action, condToIf_Rec(exp.cdr)]
        return reader.makePair(l, sexprs.Nil())
Ejemplo n.º 2
0
def letStar_To_Let_recursive(bindings, body):
    if sexprs.getClass(bindings) == 'Nil':
        return body
    else:
        l = [
            sexprs.Symbol('LET'),
            reader.makePair([bindings.car], sexprs.Nil()),
            letStar_To_Let_recursive(bindings.cdr, body)
        ]
        return reader.makePair(l, sexprs.Nil())
Ejemplo n.º 3
0
def letToYagApplic(s_exp):
    body=s_exp.second.first
    if isinstance(s_exp.first,sexprs.Nil):
        return body
    generatedSymbol=genSym.newGenSym()
    param=[];
    values=[];
    temp=s_exp.first
    while isinstance(temp,sexprs.Pair):
        param.append(temp.first.first)
        values.append(temp.first.second.first)
        temp=temp.second
    s_param=sexprs.Nil()
    for x in reversed (param):
        s_param=sexprs.Pair(x,s_param)
    s_param=sexprs.Pair(generatedSymbol,s_param)
    s_values=[]
    for y in values:
        s_values.append(y)
    firstLambda=sexprs.Pair(
        sexprs.Symbol("LAMBDA"),
        sexprs.Pair(
            s_param,
            sexprs.Pair(
                body,
                sexprs.Nil()
            )
        )
    )
    list_of_lambdas=[]
    for x in s_values:
        list_of_lambdas.append(
            sexprs.Pair(
        sexprs.Symbol("LAMBDA"),
        sexprs.Pair(
            s_param,
            sexprs.Pair(
                x,
                sexprs.Nil(
                )
                )))
        )
    pairedListofLambdas=sexprs.Nil()
    for x in reversed(list_of_lambdas):
        pairedListofLambdas=sexprs.Pair(x,pairedListofLambdas)
    pairedListofLambdas=sexprs.Pair(firstLambda,pairedListofLambdas)

    return sexprs.Pair(
        sexprs.Symbol("YAG"),
            pairedListofLambdas
    )
Ejemplo n.º 4
0
def makeDefine(exp):
    if sexprs.getClass(exp.cdr.car) != 'Pair':
        symbol = AbstractSchemeExpr.handleParsed(exp.cdr.car)
        value = AbstractSchemeExpr.handleParsed(exp.cdr.cdr.car)
        return Def(symbol, value)
    else:
        symbol = exp.cdr.car.car
        lambda_args = exp.cdr.car.cdr
        lambda_body = exp.cdr.cdr.car
        lambda_components = [sexprs.Symbol('LAMBDA'), lambda_args, lambda_body]

        l = [exp.car, symbol, reader.makePair(lambda_components, sexprs.Nil())]
        return AbstractSchemeExpr.handleParsed(reader.makePair(
            l, sexprs.Nil()))
Ejemplo n.º 5
0
def QuoteGen(prefix, name):
    return ps.parser(pc.pcWord(prefix)) \
        .pack(removeCatenStar) \
        .delayed_parser(lambda: pSexpr) \
        .caten() \
        .pack(lambda m: sexprs.Pair(sexprs.Symbol(name), sexprs.Pair(m[1], sexprs.Nil()))) \
        .done()
Ejemplo n.º 6
0
def andToIf(s_exp):
    if isinstance(s_exp,sexprs.Nil):
        return sexprs.true()
    if isinstance(s_exp,sexprs.Pair):
        if isinstance(s_exp.second,sexprs.Nil):
            return s_exp.first
    return sexprs.Pair(sexprs.Symbol("IF"),sexprs.Pair(s_exp.first,sexprs.Pair(
        sexprs.Pair(sexprs.Symbol("AND"),s_exp.second)
        ,sexprs.Pair(sexprs.false(),sexprs.Nil()))))
Ejemplo n.º 7
0
def condToIf (s_exp):
    if isinstance(s_exp,sexprs.Pair):
        if isinstance(s_exp.second, sexprs.Nil):
            if isinstance(s_exp.first.first,sexprs.Symbol)and s_exp.first.first.string=="ELSE":
                return s_exp.first.second.first
            return sexprs.Pair(sexprs.Symbol("IF"), sexprs.Pair(s_exp.first.first, sexprs.Pair(s_exp.first.second.first, sexprs.Nil())))
        return sexprs.Pair(sexprs.Symbol("IF"),sexprs.Pair(s_exp.first.first,sexprs.Pair(s_exp.first.second.first,sexprs.Pair(
            sexprs.Pair(sexprs.Symbol("COND"),s_exp.second)
            ,sexprs.Nil()))))
Ejemplo n.º 8
0
def and_To_If_rec(exp):
    if sexprs.getClass(exp) == 'Nil':
        l = [
            sexprs.Symbol('IF'),
            sexprs.Boolean(True),
            sexprs.Boolean(True),
            sexprs.Boolean(True)
        ]
        return reader.makePair(l, sexprs.Nil())
    if exp.getLength() == 1:
        l = [sexprs.Symbol('IF'), exp.car, exp.car, sexprs.Boolean(False)]
        return reader.makePair(l, sexprs.Nil())
    else:
        l = [
            sexprs.Symbol('IF'), exp.car,
            and_To_If_rec(exp.cdr),
            sexprs.Boolean(False)
        ]
        return reader.makePair(l, sexprs.Nil())
Ejemplo n.º 9
0
def letToApplic(s_exp):
    param=[]
    values=[]
    temp=s_exp.first
    while isinstance(temp,sexprs.Pair):
        param.append(temp.first.first)
        values.append(temp.first.second.first)
        temp=temp.second
    body=s_exp.second.first
    s_param=sexprs.Nil()
    for x in reversed (param):
        s_param=sexprs.Pair(x,s_param)
    s_values=sexprs.Nil()
    for y in reversed(values):
        s_values=sexprs.Pair(y,s_values)
    return sexprs.Pair(
        sexprs.Pair(sexprs.Symbol('LAMBDA'), sexprs.Pair(s_param, sexprs.Pair(body, sexprs.Nil()))),
        s_values
    )
Ejemplo n.º 10
0
def letrec_To_Yag(exp):
    lambda_variabls, lambda_values = get_let_vars(exp.cdr.car), get_let_vals(
        exp.cdr.car)
    lambda_variabls = sexprs.Pair(gensym(), lambda_variabls)
    body = exp.cdr.cdr.car
    l = [
        reader.makePair([sexprs.Symbol('LAMBDA'), lambda_variabls, body],
                        sexprs.Nil())
    ]

    while sexprs.getClass(lambda_values) != 'Nil':
        lambda_l = [
            sexprs.Symbol('LAMBDA'), lambda_variabls, lambda_values.car
        ]
        l.append(reader.makePair(lambda_l, sexprs.Nil()))
        lambda_values = lambda_values.cdr

    final_l = [sexprs.Symbol('Yag')] + l
    return AbstractSchemeExpr.handleParsed(
        reader.makePair(final_l, sexprs.Nil()))
Ejemplo n.º 11
0
def let_To_Application(exp):
    lambde_variabls, lambde_values = get_let_vars(exp.cdr.car), get_let_vals(
        exp.cdr.car)
    lambda_body = exp.cdr.cdr.car
    return AbstractSchemeExpr.handleParsed(
        sexprs.Pair(
            sexprs.Pair(
                sexprs.Symbol('LAMBDA'),
                sexprs.Pair(lambde_variabls,
                            sexprs.Pair(lambda_body, sexprs.Nil()))),
            lambde_values))
Ejemplo n.º 12
0
def letStarToApplic(s_exp):
    if isinstance(s_exp, sexprs.Pair) and isinstance(s_exp.second, sexprs.Pair):
        body = s_exp.second.first
        if isinstance(s_exp.first, sexprs.Nil):
            return body
        if isinstance(s_exp.first, sexprs.Pair):
            param = s_exp.first.first.first
            value = s_exp.first.first.second.first
            rest = s_exp.first.second
            return sexprs.Pair(
                                sexprs.Pair(sexprs.Symbol("LAMBDA"), sexprs.Pair(
                                        sexprs.Pair(param, sexprs.Nil())
                                    , sexprs.Pair(
                                        sexprs.Pair(sexprs.Symbol("LET*"), sexprs.Pair(
                                            rest
                                            , sexprs.Pair(
                                            body
                                            , sexprs.Nil())))
                                    , sexprs.Nil())))
                            , sexprs.Pair(
                                value
                            , sexprs.Nil()))
Ejemplo n.º 13
0
def QQ_expend(s_exp):
    if isinstance(s_exp,sexprs.Pair):
        if isinstance(s_exp.first,sexprs.Symbol) and  isinstance(s_exp.second,sexprs.Pair):
            if s_exp.first.string=="unquote":
                return s_exp.second.first
            elif s_exp.first.string=="unquote-splicing":
                raise (Exception("unquote-splicing here makes no sense!"))
        a=s_exp.first
        b=s_exp.second
        if isinstance(a,sexprs.Pair) and isinstance(a.first,sexprs.Symbol) and a.first.string=="unquote-splicing":
            if isinstance(b, sexprs.Nil):
                return a.second.first
            return sexprs.Pair(sexprs.Symbol('APPEND'), sexprs.Pair(a.second.first
                    , sexprs.Pair(QQ_expend(b), sexprs.Nil())))
        elif isinstance(b,sexprs.Pair) and isinstance(b.first,sexprs.Symbol) and b.first.string=="unquote-splicing":
            return sexprs.Pair(sexprs.Symbol('CONS'), sexprs.Pair(QQ_expend(a)
                    , sexprs.Pair(b.second.first, sexprs.Nil())))
        return sexprs.Pair(sexprs.Symbol('CONS'), sexprs.Pair(QQ_expend(a)
                    , sexprs.Pair(QQ_expend(b), sexprs.Nil())))
    elif isinstance(s_exp,sexprs.Vector):
        return sexprs.Pair(sexprs.Symbol("LIST->VECTOR") , sexprs.Pair(QQ_expend(vectorToList(s_exp)),sexprs.Nil()))
    elif isinstance(s_exp,sexprs.Nil) or isinstance(s_exp,sexprs.Symbol):
        return sexprs.Pair(sexprs.Symbol("quote"), sexprs.Pair(s_exp,sexprs.Nil()))
    return s_exp
Ejemplo n.º 14
0
def quasiquote_To_Quote_rec(exp):
    if isUnquote(exp):
        return exp.cdr.car
    elif isUnquoteSplicing(exp):
        raise IllegalQQuoteLocation()
    elif sexprs.getClass(exp) == 'Pair':
        first = exp.car
        rest = exp.cdr
        if isUnquoteSplicing(first):
            return reader.makePair([
                sexprs.Symbol('APPEND'), first.cdr.car,
                quasiquote_To_Quote_rec(rest)
            ], sexprs.Nil())
        elif isUnquoteSplicing(rest):
            return reader.makePair([
                sexprs.Symbol('CONS'),
                quasiquote_To_Quote_rec(first), rest.cdr.car
            ], sexprs.Nil())
        else:
            return reader.makePair([
                sexprs.Symbol('CONS'),
                quasiquote_To_Quote_rec(first),
                quasiquote_To_Quote_rec(rest)
            ], sexprs.Nil())
    elif sexprs.getClass(exp) == 'Vector':
        l = [
            sexprs.Symbol('LIST->VECTOR'),
            quasiquote_To_Quote_rec(
                reader.makePair([sexprs.Symbol('VECTOR->LIST'), exp],
                                sexprs.Nil()))
        ]
        return reader.makePair(l, sexprs.Nil())
    elif sexprs.getClass(exp) == 'Symbol' or sexprs.getClass(exp) == 'Nil':
        l = [sexprs.Symbol('quote'), exp]
        return reader.makePair(l, sexprs.Nil())
    else:
        return exp
Ejemplo n.º 15
0
                 .parser(pc.const(lambda ch: ch > ' ')) \
                 .caten() \
                 .pack(lambda m: sexprs.Char(m[1])) \
                 .done()

char_p = ps.parser(named_char_p) \
         .parser(hex_char_p) \
         .parser(visible_char_p) \
         .disjs(3) \
         .done()

nil_p = ps.parser(pc.const(lambda x: x=='(')) \
        .parser(p_skip) \
        .parser(pc.const(lambda x: x==')')) \
        .catens(3) \
        .pack(lambda m: sexprs.Nil()) \
        .done()

proper_p = ps.parser(pc.const(lambda x: x=='(')) \
           .delayed_parser(lambda: pSexpr) \
           .star() \
           .parser(pc.const(lambda x: x==')')) \
           .catens(3) \
           .pack(lambda m: list_to_pair(m[1],sexprs.Nil())) \
           .done()

improper_p = ps.parser(pc.const(lambda x: x=='(')) \
           .delayed_parser(lambda: pSexpr) \
           .plus() \
           .parser(pc.const(lambda x: x=='.')) \
           .delayed_parser(lambda: pSexpr) \
Ejemplo n.º 16
0
    .done()

pFractions = ps.parser(pSignNumber) \
    .parser(pc.pcWord('/')) \
    .caten() \
    .parser(pPositivNumber) \
    .caten() \
    .pack(lambda x: sexprs.Fraction(x[0][0],x[1] )) \
    .done()
########################################### end of number part ###########################################

pNil = ps.parser(pc.pcWord('(')) \
    .parser(pCommentsAndWhitespaces) \
    .parser(pc.pcWord(')')) \
    .catens(3) \
    .pack(lambda x: sexprs.Nil()) \
    .done()

########################################### end of nil part ###########################################

pSexpr = ps.parser(pCommentsAndWhitespaces) \
    .delayed_parser(lambda : pProperList) \
    .delayed_parser(lambda : pImproperList) \
    .delayed_parser(lambda : pVector) \
    .parser(pBoolean) \
    .parser(pFractions) \
    .parser(pSignNumber) \
    .parser(pNil) \
    .parser(pQuote) \
    .parser(pQuasiQuote) \
    .parser(pUnquote) \
Ejemplo n.º 17
0
          .parser(pHexChar)\
          .parser(pVisibleChar)\
          .disjs(3)\
          .caten()\
          .pack(lambda s: s[1])\
          .done()


pNil = ps.word('(')\
        .parser(singleWhiteSpace)\
        .parser(SexprComment)\
        .disj()\
        .star()\
        .word(')')\
        .catens(3)\
        .pack(lambda s: classes.Nil())\
        .done()

properList = ps.parser(pc.pcWord('('))\
               .delayed_parser(lambda : pSexpr)\
               .plus()\
               .parser(pc.pcWord(')'))\
               .catens(3)\
               .pack(lambda m: makePair(m[1],classes.Nil()) )\
               .done()
         
improperList = ps.parser(pc.pcWord('('))\
                 .delayed_parser(lambda : pSexpr)\
                 .plus()\
                 .parser(pc.pcWord('.'))\
                 .pack(lambda c : c[0])\
Ejemplo n.º 18
0
def get_let_vals(exp):
    if sexprs.getClass(exp) == 'Nil':
        return sexprs.Nil()
    else:
        return sexprs.Pair(exp.car.cdr.car, get_let_vals(exp.cdr))
Ejemplo n.º 19
0
def vectorToList(s_exp):
    elem=s_exp.elements
    if len(elem)==0:
        return sexprs.Nil()
    return sexprs.Pair(elem[0],vectorToList(elem[1:]))