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
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
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
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
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")
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
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__()))
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__())
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
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
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)
def symbol_one_minus(fun, args): return eval(args[0], fun) - 1
def symbol_sqrt(fun, args): return math.sqrt(eval(args[0], fun))
def symbol_minus(fun, args): sum = eval(args[0], fun) for x in args[1:]: x = eval(x, fun) sum -= x return sum
def symbol_acos(fun, args): return math.acos(eval(args[0], fun))
def symbol_or(fun, args): for x in args: condition = eval(x, fun) if condition: return Atom.T return Atom.NIL
def symbol_and(fun, args): for x in args: condition = eval(x, fun) if not condition: return Atom.NIL return Atom.T
def symbol_eq(fun, args): first = eval(args[0], fun) second = eval(args[1], fun) return first == second
def symbol_plus(fun, args): sum = 0 for x in args: x = eval(x, fun) sum += x return sum
def symbol_star(fun, args): result = eval(args[0], fun) for x in args[1:]: x = eval(x, fun) result *= x return result
def symbol_sin(fun, args): return math.sin(eval(args[0], fun))
def symbol_atan(fun, args): return math.atan(eval(args[0], fun))
def symbol_one_plus(fun, args): return eval(args[0], fun) + 1
def symbol_expt(fun, args): return math.pow(eval(args[0], fun), eval(args[1], fun))