コード例 #1
0
 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.'
         ]))
コード例 #2
0
 def execute(self, operands: List[Expression], frame: Frame, gui_holder: Holder):
     verify_exact_callable_length(self, 2, len(operands))
     name = operands[0]
     if not isinstance(name, Symbol):
         raise OperandDeduceError(f"Expected a Symbol, not {name}, as the first operand of set!")
     frame.mutate(name, evaluate(operands[1], frame, gui_holder.expression.children[2]))
     return Undefined
コード例 #3
0
 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
コード例 #4
0
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)
コード例 #5
0
    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
コード例 #6
0
    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
コード例 #7
0
ファイル: environment.py プロジェクト: SallyPeng00/61a
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)
コード例 #8
0
 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