def execute(self, operands: List[Expression], frame: Frame, gui_holder: Holder): verify_min_callable_length(self, 2, len(operands)) params = operands[0] if isinstance(params, Symbol): verify_exact_callable_length(self, 2, len(operands)) frame.assign( params, evaluate(operands[1], frame, gui_holder.expression.children[2])) return params elif isinstance(params, Pair): name = params.first operands[0] = params.rest if (not isinstance(name, Symbol)): raise OperandDeduceError(''.join( ['Expected a Symbol, not ', '{}'.format(name), '.'])) frame.assign( name, Lambda().execute(operands, frame, gui_holder, name.value)) return name else: raise OperandDeduceError(''.join([ 'Expected a Pair, not ', '{}'.format(params), ', as the first operand of define-macro.' ]))
def build_global_frame(): import primitives primitives.load_primitives() frame = Frame("builtins") for k, v in defdict.items(): frame.assign(Symbol(k), v()) # moved to the parser # frame.assign(Symbol("nil"), Nil) # frame.assign(Symbol("#t"), SingletonTrue) # frame.assign(Symbol("#f"), SingletonFalse) for name in [ "acos", "acosh", "asin", "asinh", "atan", "atanh", "ceil", "copysign", "cos", "cosh", "degrees", "floor", "log", "log10", "log1p", "log2", "radians", "sin", "sinh", "sqrt", "tan", "tanh", "trunc" ]: frame.assign(Symbol(name), MathProcedure(getattr(math, name), name)) with open("editor/builtins.scm") as file: execution.string_exec([" ".join(file.readlines())], lambda *x, **y: None, False, frame) return Frame("Global", frame)
def execute(self, operands: List[Expression], frame: Frame, gui_holder: Holder): verify_min_callable_length(self, 2, len(operands)) bindings = operands[0] if not isinstance(bindings, Pair) and bindings is not Nil: raise OperandDeduceError(f"Expected first argument of let to be a Pair, not {bindings}.") new_frame = Frame("anonymous let", frame) bindings_holder = gui_holder.expression.children[1] bindings = pair_to_list(bindings) for i, binding in enumerate(bindings): if not isinstance(binding, Pair): raise OperandDeduceError(f"Expected binding to be a Pair, not {binding}.") binding_holder = bindings_holder.expression.children[i] binding = pair_to_list(binding) if len(binding) != 2: raise OperandDeduceError(f"Expected binding to be of length 2, not {len(binding)}.") name, expr = binding if not isinstance(name, Symbol): raise OperandDeduceError(f"Expected first element of binding to be a Symbol, not {name}.") new_frame.assign(name, evaluate(expr, frame, binding_holder.expression.children[1])) value = None for i, (operand, holder) in enumerate(zip(operands[1:], gui_holder.expression.children[2:])): value = evaluate(operand, new_frame, holder, i == len(operands) - 2) new_frame.assign(return_symbol, value) return value
def execute(self, operands: List[Expression], frame: Frame, gui_holder: Holder): verify_min_callable_length(self, 2, len(operands)) params = operands[0] if not isinstance(params, Pair): raise OperandDeduceError(f"Expected a Pair, not {params}, as the first operand of define-macro.") name = params.first operands[0] = params.rest if not isinstance(name, Symbol): raise OperandDeduceError(f"Expected a Symbol, not {name}.") frame.assign(name, Macro().execute(operands, frame, gui_holder, name.value)) return name
def build_global_frame(): import primitives primitives.load_primitives() frame = Frame('builtins') for (k, v) in defdict.items(): frame.assign(Symbol(k), v()) for name in [ 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'floor', 'log', 'log10', 'log1p', 'log2', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc' ]: frame.assign(Symbol(name), MathProcedure(getattr(math, name), name)) with open('editor/builtins.scm') as file: execution.string_exec([' '.join(file.readlines())], (lambda *x, **y: None), False, frame) return Frame('Global', frame)
def execute(self, operands: List[Expression], frame: Frame, gui_holder: Holder): verify_min_callable_length(self, 2, len(operands)) bindings = operands[0] if ((not isinstance(bindings, Pair)) and (bindings is not Nil)): raise OperandDeduceError(''.join([ 'Expected first argument of let to be a Pair, not ', '{}'.format(bindings), '.' ])) new_frame = Frame('anonymous let', frame) gui_holder.expression.children[1].link_visual( VisualExpression(bindings)) bindings_holder = gui_holder.expression.children[1] bindings = pair_to_list(bindings) for (i, binding) in enumerate(bindings): if (not isinstance(binding, Pair)): raise OperandDeduceError(''.join([ 'Expected binding to be a Pair, not ', '{}'.format(binding), '.' ])) binding_holder = bindings_holder.expression.children[i] binding_holder.link_visual(VisualExpression(binding)) binding = pair_to_list(binding) if (len(binding) != 2): raise OperandDeduceError(''.join([ 'Expected binding to be of length 2, not ', '{}'.format(len(binding)), '.' ])) (name, expr) = binding if (not isinstance(name, Symbol)): raise OperandDeduceError(''.join([ 'Expected first element of binding to be a Symbol, not ', '{}'.format(name), '.' ])) new_frame.assign( name, evaluate(expr, frame, binding_holder.expression.children[1])) value = None for (i, (operand, holder)) in enumerate( zip(operands[1:], gui_holder.expression.children[2:])): value = evaluate(operand, new_frame, holder, (i == (len(operands) - 2))) new_frame.assign(return_symbol, value) return value
def execute(self, operands: List[Expression], frame: Frame, gui_holder: Holder, eval_operands=True): new_frame = Frame(self.name, self.frame if self.lexically_scoped else frame) if eval_operands and self.evaluates_operands: operands = evaluate_all(operands, frame, gui_holder.expression.children[1:]) if self.var_param: verify_min_callable_length(self, len(self.params), len(operands)) else: verify_exact_callable_length(self, len(self.params), len(operands)) if len(self.body) > 1: body = [Pair(Symbol("begin"), make_list(self.body))] else: body = self.body for param, value in zip(self.params, operands): new_frame.assign(param, value) if self.var_param: new_frame.assign(self.var_param, make_list(operands[len(self.params):])) out = None gui_holder.expression.set_entries([ VisualExpression(expr, gui_holder.expression.display_value) for expr in body ]) gui_holder.apply() for i, expression in enumerate(body): out = evaluate(expression, new_frame, gui_holder.expression.children[i], self.evaluates_operands and i == len(body) - 1, log_stack=len(self.body) == 1) new_frame.assign(return_symbol, out) if not self.evaluates_operands: gui_holder.expression.set_entries( [VisualExpression(out, gui_holder.expression.display_value)]) out = evaluate(out, frame, gui_holder.expression.children[i], True) return out