コード例 #1
0
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_one_minus(fun, args):
    return eval(args[0], fun) - 1
コード例 #15
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_sqrt(fun, args):
    return math.sqrt(eval(args[0], fun))
コード例 #16
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_acos(fun, args):
	return math.acos(eval(args[0], fun))
コード例 #18
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_sqrt(fun, args):
	return math.sqrt(eval(args[0], fun))
コード例 #19
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_acos(fun, args):
    return math.acos(eval(args[0], fun))
コード例 #20
0
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
def symbol_or(fun, args):
	for x in args:
		condition = eval(x, fun)
		if condition:
			return Atom.T
	return Atom.NIL
コード例 #21
0
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
def symbol_and(fun, args):
	for x in args:
		condition = eval(x, fun)
		if not condition:
			return Atom.NIL
	return Atom.T
コード例 #22
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_eq(fun, args):
    first = eval(args[0], fun)
    second = eval(args[1], fun)
    return first == second
コード例 #23
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_plus(fun, args):
    sum = 0
    for x in args:
        x = eval(x, fun)
        sum += x
    return sum
コード例 #24
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_sin(fun, args):
    return math.sin(eval(args[0], fun))
コード例 #26
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_plus(fun, args):
	sum = 0
	for x in args:
		x = eval(x, fun)
		sum += x
	return sum
コード例 #27
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_eq(fun, args):
	first = eval(args[0], fun)
	second = eval(args[1], fun)
	return first == second
コード例 #28
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_one_minus(fun, args):
	return eval(args[0], fun) - 1
コード例 #29
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_sin(fun, args):
	return math.sin(eval(args[0], fun))
コード例 #30
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_atan(fun, args):
    return math.atan(eval(args[0], fun))
コード例 #31
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_atan(fun, args):
	return math.atan(eval(args[0], fun))
コード例 #32
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_one_plus(fun, args):
    return eval(args[0], fun) + 1
コード例 #33
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_one_plus(fun, args):
	return eval(args[0], fun) + 1
コード例 #34
0
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
def symbol_and(fun, args):
    for x in args:
        condition = eval(x, fun)
        if not condition:
            return Atom.NIL
    return Atom.T
コード例 #35
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
def symbol_or(fun, args):
    for x in args:
        condition = eval(x, fun)
        if condition:
            return Atom.T
    return Atom.NIL
コード例 #37
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_logic.py プロジェクト: marriola/LispInterpreter
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
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_expt(fun, args):
	return math.pow(eval(args[0], fun), eval(args[1], fun))
コード例 #40
0
ファイル: fun_math.py プロジェクト: marriola/LispInterpreter
def symbol_expt(fun, args):
    return math.pow(eval(args[0], fun), eval(args[1], fun))