示例#1
0
def symbol_cond(fun, args):
	for x in args:
		variant = x.data
		sub = variant.second.data
		condition = eval(variant.first, fun)
		if condition:
			return eval(sub, fun)
	return Atom.NIL
示例#2
0
def symbol_mod(fun, args):
	result = float(eval(args[0], fun))
	for x in args[1:]:
		x = eval(x, fun)
		if x == 0:
			raise LispError("MOD: Division by zero")
		result %= x
	return result
示例#3
0
def symbol_slash(fun, args):
    result = float(eval(args[0], fun))
    for x in args[1:]:
        x = eval(x, fun)
        if x == 0:
            raise LispError("/: Division by zero")
        result /= x
    return result
示例#4
0
def symbol_cond(fun, args):
    for x in args:
        variant = x.data
        sub = variant.second.data
        condition = eval(variant.first, fun)
        if condition:
            return eval(sub, fun)
    return Atom.NIL
示例#5
0
def symbol_read_char(fun, args):
    handle = eval(args[0], fun)
    if handle not in file_handles:
        raise LispError("READ-CHAR: File handle not active")
    ch = file_handles[handle].read(1)
    if not ch:
        return Atom.make_symbol("EOF")
    return "\"%s\"" % ch
示例#6
0
def symbol_read(fun, args):
    handle = eval(args[0], fun)
    if handle not in file_handles:
        raise LispError("READ: File handle not active")
    try:
        parser = LispParser.LispParser(file_handles[handle])
        return parser.read_object()
    except StopIteration:
        return Atom.make_symbol("EOF")
示例#7
0
def symbol_do(fun, args):
	condition = args[0]
	body = args[1:]
	result = Atom.NIL
	while True:
		if not eval(condition, fun):
			return result
		for s in body:
			result = Atom.evaluate(s, fun)
	return result
示例#8
0
def symbol_do(fun, args):
    condition = args[0]
    body = args[1:]
    result = Atom.NIL
    while True:
        if not eval(condition, fun):
            return result
        for s in body:
            result = Atom.evaluate(s, fun)
    return result
示例#9
0
def symbol_open(fun, args):
    global file_handles, next_handle
    filename = eval(args[0], fun)
    try:
        file_handles[next_handle] = open(filename)
        next_handle += 1
        return next_handle - 1
    except Exception as e:
        raise LispError("OPEN: Couldn't open '%s' (%s)" %
                        (filename, e.__str__()))
示例#10
0
def symbol_read_line(fun, args):
    handle = eval(args[0], fun)
    if handle not in file_handles:
        raise LispError("READ-LINE: File handle not active")
    try:
        while True:
            line = file_handles[handle].readline()
            if not line:
                raise LispError("READ-LINE: End of file")
            if line != "\n":
                break

        if line[-1] == "\n":
            line = line[:-1]
        return Atom.Atom(Atom.Atom.STRING, line)
    except Exception as e:
        raise LispError(e.__str__())
示例#11
0
def symbol_load(fun, args):
    filename = eval(args[0], fun)
    print("Loading %s" % filename)
    try:
        file = open(filename)
    except Exception as e:
        print("Failed (%s)" % e)
        return Atom.NIL

    parser = LispParser.LispParser(file)
    while True:
        try:
            atom = parser.read_object()
        except StopIteration:
            break

        try:
            result = Atom.evaluate(atom, fun, True)
        except LispError as err:
            print("Error: %s" % err)
    file.close()
    print("Done")
    return Atom.NIL
示例#12
0
def symbol_if(fun, args):
	condition = eval(args[0], fun)
	if condition:
		return Atom.evaluate(args[1], fun)
	option2 = Atom.evaluate(args[2], fun) if len(args) > 2 else Atom.NIL
	return option2
示例#13
0
def symbol_close(fun, args):
    handle = eval(args[0], fun)
    if handle not in file_handles:
        raise LispError("CLOSE: File handle not active")
    file_handles[handle].close()
    file_handles.pop(handle)
示例#14
0
def symbol_one_minus(fun, args):
    return eval(args[0], fun) - 1
示例#15
0
def symbol_sqrt(fun, args):
    return math.sqrt(eval(args[0], fun))
示例#16
0
def symbol_minus(fun, args):
    sum = eval(args[0], fun)
    for x in args[1:]:
        x = eval(x, fun)
        sum -= x
    return sum
示例#17
0
def symbol_acos(fun, args):
	return math.acos(eval(args[0], fun))
示例#18
0
def symbol_sqrt(fun, args):
	return math.sqrt(eval(args[0], fun))
示例#19
0
def symbol_acos(fun, args):
    return math.acos(eval(args[0], fun))
示例#20
0
def symbol_or(fun, args):
	for x in args:
		condition = eval(x, fun)
		if condition:
			return Atom.T
	return Atom.NIL
示例#21
0
def symbol_and(fun, args):
	for x in args:
		condition = eval(x, fun)
		if not condition:
			return Atom.NIL
	return Atom.T
示例#22
0
def symbol_eq(fun, args):
    first = eval(args[0], fun)
    second = eval(args[1], fun)
    return first == second
示例#23
0
def symbol_plus(fun, args):
    sum = 0
    for x in args:
        x = eval(x, fun)
        sum += x
    return sum
示例#24
0
def symbol_star(fun, args):
    result = eval(args[0], fun)
    for x in args[1:]:
        x = eval(x, fun)
        result *= x
    return result
示例#25
0
def symbol_sin(fun, args):
    return math.sin(eval(args[0], fun))
示例#26
0
def symbol_plus(fun, args):
	sum = 0
	for x in args:
		x = eval(x, fun)
		sum += x
	return sum
示例#27
0
def symbol_eq(fun, args):
	first = eval(args[0], fun)
	second = eval(args[1], fun)
	return first == second
示例#28
0
def symbol_one_minus(fun, args):
	return eval(args[0], fun) - 1
示例#29
0
def symbol_sin(fun, args):
	return math.sin(eval(args[0], fun))
示例#30
0
def symbol_atan(fun, args):
    return math.atan(eval(args[0], fun))
示例#31
0
def symbol_atan(fun, args):
	return math.atan(eval(args[0], fun))
示例#32
0
def symbol_one_plus(fun, args):
    return eval(args[0], fun) + 1
示例#33
0
def symbol_one_plus(fun, args):
	return eval(args[0], fun) + 1
示例#34
0
def symbol_and(fun, args):
    for x in args:
        condition = eval(x, fun)
        if not condition:
            return Atom.NIL
    return Atom.T
示例#35
0
def symbol_minus(fun, args):
	sum = eval(args[0], fun)
	for x in args[1:]:
		x = eval(x, fun)
		sum -= x
	return sum
示例#36
0
def symbol_or(fun, args):
    for x in args:
        condition = eval(x, fun)
        if condition:
            return Atom.T
    return Atom.NIL
示例#37
0
def symbol_star(fun, args):
	result = eval(args[0], fun)
	for x in args[1:]:
		x = eval(x, fun)
		result *= x
	return result
示例#38
0
def symbol_if(fun, args):
    condition = eval(args[0], fun)
    if condition:
        return Atom.evaluate(args[1], fun)
    option2 = Atom.evaluate(args[2], fun) if len(args) > 2 else Atom.NIL
    return option2
示例#39
0
def symbol_expt(fun, args):
	return math.pow(eval(args[0], fun), eval(args[1], fun))
示例#40
0
def symbol_expt(fun, args):
    return math.pow(eval(args[0], fun), eval(args[1], fun))