Skip to content

Instantly share code, notes, and snippets.

@gidgid
Last active December 15, 2020 14:52
Show Gist options
  • Save gidgid/f83b38dcb6ea9ed842c35621584dace2 to your computer and use it in GitHub Desktop.
Save gidgid/f83b38dcb6ea9ed842c35621584dace2 to your computer and use it in GitHub Desktop.
shows a possible but not very useful way to operate on an expression
from dataclasses import dataclass
class Expression:
"""Represents an ADT expression"""
@dataclass
class Literal(Expression):
value: float
@dataclass
class Add(Expression):
x: Expression
y: Expression
@dataclass
class Subtract(Expression):
x: Expression
y: Expression
@dataclass
class Multiply(Expression):
x: Expression
y: Expression
@dataclass
class Divide(Expression):
x: Expression
y: Expression
def interpret(e: Expression) -> float:
if isinstance(e, Add):
return interpret(e.x) + interpret(e.y)
if isinstance(e, Multiply):
return interpret(e.x) * interpret(e.y)
if isinstance(e, Subtract):
return interpret(e.x) - interpret(e.y)
if isinstance(e, Divide):
return interpret(e.x) / interpret(e.y)
return e.value
def test_add_is_interpreted_properly():
mult = Add(x=Multiply(x=Literal(value=5), y=Literal(value=3)), y=Literal(2))
result = interpret(mult)
assert result == 17.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment