def __init__(self, evaluate): if not callable(evaluate): raise TypeError, "Expected callable for evaluate" self.__ev = evaluate self.funcs = { # Arithmetic '+': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) + self.__syToNmb(b))), '-': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) - self.__syToNmb(b))), '*': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) * self.__syToNmb(b))), '/': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) / self.__syToNmb(b))), '%': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) % self.__syToNmb(b))), '**': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) ** self.__syToNmb(b))), # Comparison '==': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) == self.__syToNmb(b))), '<=': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) <= self.__syToNmb(b))), '>=': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) >= self.__syToNmb(b))), '<': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) < self.__syToNmb(b))), '>': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) > self.__syToNmb(b))), '!=': BuiltIn(2, lambda a, b: Value(self.__syToNmb(a) != self.__syToNmb(b))), # Boolean algebra '&': BuiltIn(2, lambda a, b: Value(self.__syToBol(a) and self.__syToBol(b))), '|': BuiltIn(2, lambda a, b: Value(self.__syToBol(a) or self.__syToBol(b))), '^': BuiltIn(2, lambda a, b: Value(self.__syToBol(a) ^ self.__syToBol(b))), '!': BuiltIn(1, lambda a: Value(not self.__syToBol(a))), # List functions 'head': BuiltIn(1, self.__head), 'tail': BuiltIn(1, lambda a: List(self.__syToLst(a)[1:])), 'cons': BuiltIn(2, lambda h, t: List([self.__ev(h)] + self.__syToLst(t))), 'append': BuiltIn(2, lambda a, b: List(self.__syToLst(a) + self.__syToLst(b))), 'map': BuiltIn(2, self.__map), 'filter': BuiltIn(2, self.__filter), 'foldl': BuiltIn(3, self.__foldl), # Input/Output 'input': BuiltIn(0, lambda: Value(float(raw_input()))), 'print': BuiltIn(1, lambda a: (lambda val: stdout.write("%s\n" % str(val)) or val)(self.__ev(a))), # Conditional evaluation 'if': BuiltIn(3, lambda cond, yes, no: self.__ev(yes if self.__syToBol(cond) else no)), # Reading libs TODO: What about a search path? 'import': BuiltIn(1, lambda s: runfile(s.name+FileExt, self.__ev)), }
#!/usr/bin/python import sys if __name__ == "__main__": if len(sys.argv) > 1: import script from run.evaluate import Environment script.runfile(sys.argv[1], Environment()) else: import console cmd = console.LambdaConsole() cmd.cmdloop()