Beispiel #1
0
def cdr(args, env):
    if len(args) != 1:
        raise Exception("cdr: arity mismatch!")
    p = lispEval(args[0], env)
    if type(p) != pair:
        raise Exception("cdr: expected pair, got " + type(p).__name__)
    else:
        return lispEval(p.get(1), env)
Beispiel #2
0
def greater(args, env):

    if len(args) < 2:
        raise Exception(">: arity mismatch!")
    
    first = lispEval(args[0], env)

    for arg in args[1:]:
        if (lispEval(arg, env) >= first):
            return False
    return True
Beispiel #3
0
def isList(args, env):
    if len(args) != 1:
        raise Exception("list?: arity mismatch!")
    else:
        if type(lispEval(args[0], env)) == pair:
            next = cdr([lispEval(args[0], env)], env)
            return isList([next], env)
        else:
            if lispEval(args[0], env) == None:
                return True
            return False
Beispiel #4
0
def equal(args, env):

    if not args:
        raise Exception("=: arity mismatch!")
    prev = lispEval(args[0], env)

    for arg in args[1:]:
        if (lispEval(arg, env) != prev):
            return False
        prev = lispEval(arg, env)

    return True
Beispiel #5
0
def div(args, env):

    if len(args) == 1:
        return 1 / lispEval(args[0], env)
    elif len(args) > 0:
        quot = lispEval(args[0], env)
    else:
        raise Exception("/: arity mismatch!")

    for arg in args[1:]:
        quot /= lispEval(arg, env)

    return quot
Beispiel #6
0
def minus(args, env):

    if len(args) == 1:
            return -lispEval(args[0], env)
    elif len(args) > 0:
        sum = lispEval(args[0], env)
    else:
        raise Exception("-: arity mismatch!")

    for arg in args[1:]:
        sum -= lispEval(arg, env)

    return sum
Beispiel #7
0
def evaluate(args, env):
    if len(args) != 1:
        raise Exception("eval: arity mismatch!")
    else:
        arg = lispEval(args[0], env)

        if isConstant(arg):
            return arg
        # this method is cancerous but it works
        try:
            return lispEval(arg, env)
        except:
            return lispEval(parse(preparse(arg)), env)        
Beispiel #8
0
def isPair(args, env):
    if len(args) != 1:
        raise Exception("pair?: arity mismatch!")
    else:
        if type(lispEval(args[0], env)) == pair:
            return True
        else:
            return False
Beispiel #9
0
def mod(args, env):
  
    if len(args) != 2:
        raise Exception("modulo: arity mismatch!")
    
    return lispEval(args[0], env) % lispEval(args[1], env)
Beispiel #10
0
def mult(args, env):

    prod = 1
    for arg in args:
        prod *= lispEval(arg, env)
    return prod
Beispiel #11
0
def plus(args, env):

    sum = 0
    for arg in args:
        sum += lispEval(arg, env)
    return sum
Beispiel #12
0
def isNumber(args, env):
    if len(args) != 1:
        raise Exception("number?: arity mismatch!")
    else:
        arg = lispEval(args[0], env)
        return isInt(arg) or isFloat(arg) or (type(arg) in [float, int])
Beispiel #13
0
def expt(args, env):
    if len(args) != 2:
        raise Exception("exp: arity mismatch!")
    return lispEval(args[0], env)**lispEval(args[1], env)
Beispiel #14
0
def rand(args, env):
    if len(args) != 2:
        raise Exception("random: arity mismatch!")
    return randint(lispEval(args[0], env), lispEval(args[1], env))
Beispiel #15
0
def cons(args, env):
    if len(args) != 2:
        raise Exception("cons: arity mismatch!")
    else:
        return pair(lispEval(args[0], env), lispEval(args[1], env))