def change_args(): const_1 = function('CONST', 1) const_2 = function('CONST', 2) sum_1_2 = function('SUM', const_1, const_2) print(sum_1_2()) sum_2_2 = sum_1_2 sum_2_2.args = [const_2, const_2] print(sum_2_2())
def mul_of_variables(): x = mkv('x') y = mkv('y') c1 = mkc(1) c2 = mkc(2) bound = bind(x, c1) bound = bind(y, c2) x_times_y = function('MUL', x, y) x_times_y2 = function('MUL', x_times_y, y) print(f"x times y^2: {x_times_y2()}")
def bind_variable_to_variable_to_constant(): # x = y = 2; eval y, x x = mkv('x') y = mkv('y') c2 = mkc(2) bind_y_to_2 = function('BIND', y, c2) bind_y_to_2() bind_x_to_y = function('BIND', x, y) bind_x_to_y() print(f"y is {y()}, x is {x()}")
def derivative_polynomial(): x = mkv('x') # +(+(1, x), *(x, x)) c1_plus_x_plus_x2 = function('SUM', function('SUM', mkc(1), x), function('MUL', x, x)) derivative_expr = function('DER', c1_plus_x_plus_x2, x) c0_plus_c1_plus_x = derivative_expr() print(f"D[1+x+x^2, x] = {c0_plus_c1_plus_x}") print(f"D[1+x+x^2, x] -evaluated-> {c0_plus_c1_plus_x()}: still UNBOUND") bound = bind(x, to=mkc(3)) print( f"x = 3; D[1+x+x^2, x] -evaluated-> = {c0_plus_c1_plus_x()}: (1 + 2x)|_(x=3) == 7" )
def mkv(name): """ make variable :param name: name as string :return: """ return function('VAR', name)
def mkc(value): """ make constant :param value: :return: """ return function('CONST', value)
def sum_of_variables(): x = mkv('x') y = mkv('y') c1 = mkc(1) bound = bind(x, c1) x_plus_y = function('SUM', x, y) print(f"x = 1; x + y is: {x_plus_y()}") bound = bind(y, c1) print(f"y = 1; x + y is now: {x_plus_y()}")
def bind(var, to): """ bind variable node to another function node :param var: variable to bind :param to: target function for binding :return: returns the bind node, if needed """ assignment = function('BIND', var, to) assignment() return assignment # if needed
def constant_from_constant(): const_3bis = function('CONST', mkc(3)) print(const_3bis())
def derivate_symbol(): f = mkv('x') df_dx = function('DER', f, mkv('x')) f_prime = df_dx() print(f"dx/dx is: {f_prime()}")
def derivate_constant(): derivative_expr = function('DER', mkc(5), mkv('x')) derivated_func = derivative_expr() print(derivated_func())
def derivate_raw_primitive(): derivative_expr = function('DER', 2, mkv('x')) derivated_func = derivative_expr() print(derivated_func())
def negative_constant(): one = mkc(1) minus_one = function('NEG', one) print(minus_one())
def constant_from_constant(): sum_c = function('SUM', mkc(3), mkc(4)) # note: c represents a function, not its value. Its value is c(), obtained when evaluated print(sum_c())
def multiply_constants(): mul_6 = function('MUL', mkc(2), mkc(3)) print(mul_6())
def constant_from_value(): const_3 = function('CONST', 3) print(const_3())
def bind_to_raw_value(): bind_x = function('BIND', function('VAR', 'x'), 2) bind_x()
def bind_to_constant(): var_x = function('VAR', 'x') bind_x = function('BIND', var_x, mkc(1)) bind_x() print(var_x())
def create_and_evaluating_unbound_variable(): x = function('VAR', 'x') print(x())
def sum_from_raw_constants(): sum_raw = function('SUM', 1, 2) print(sum_raw())
def bind_with_literal_name(): bind_x = function('BIND', 'x', mkc(2)) bind_x()
def sum_sums(): sum_1_2_1_3 = function('SUM', function('SUM', mkc(1), mkc(2)), function('SUM', mkc(1), mkc(3))) print(sum_1_2_1_3()) # should be 7 + 10 = 17
from library import function function()
def null_function(): null = function() null()