git @ Cat's Eye Technologies Unlikely / master src / unlikely / stdlib.py
master

Tree @master (Download .tar.gz)

stdlib.py @masterraw · history · blame

# -*- coding: utf-8 -*-

# (c)2010-2012 Chris Pressey, Cat's Eye Technologies.
# All rights reserved.  Released under a BSD-style license (see LICENSE).

"""
Pre-built AST representing built-in Unlikely classes.
"""

from .ast import ClassBase

stdlib = ClassBase()

continuation = stdlib.add_class_defn_by_name("Continuation", None,
                                             ["saturated", "abstract"])
program = stdlib.add_class_defn_by_name("Program", "Continuation",
                                        ["abstract"])

chain = stdlib.add_class_defn_by_name("Chain", "Program", ["abstract"])

passive = stdlib.add_class_defn_by_name("Passive", "Chain", ["abstract"])

# Now that we have Passive we patch property and method into Continuation
# and all its subclasses so far
continuation.add_dependant_by_name("Passive")
program.add_dependant_by_name("Passive")
chain.add_dependant_by_name("Passive")
chain.add_dependant_by_name("Chain")
chain.add_prop_defn_by_name("next", "Chain")
passive.add_dependant_by_name("Passive")

accumulator = continuation.add_prop_defn_by_name("accumulator", "Passive")
continue_ = continuation.add_method_defn_by_name("continue")
continue_.add_modifier("abstract")
continue_.add_param_decl_by_name("accumulator", "Passive")

# now we're done patching, we can continue defining further classes
stop = stdlib.add_class_defn_by_name("Stop", "Program", ["final"])

boolean_ = stdlib.add_class_defn_by_name("Boolean", "Passive",
                                         ["abstract", "final"])
true_ = stdlib.add_class_defn_by_name("True", "Boolean",
                                      ["final", "forcible"])
false_ = stdlib.add_class_defn_by_name("False", "Boolean",
                                       ["final", "forcible"])

integer_ = stdlib.add_class_defn_by_name("Integer", "Passive",
                                         ["abstract", "final"])
# we have special logic elsewhere to recognize the countably infinite
# number of subclasses of Integer
string_ = stdlib.add_class_defn_by_name("String", "Passive",
                                        ["abstract", "final"])
# we have special logic elsewhere to recognize the countably infinite
# number of subclasses of String

binary_operation = stdlib.add_class_defn_by_name("BinaryOperation", "Chain",
                                                 ["abstract"])
binary_operation.add_prop_defn_by_name("value", "Passive")

add = stdlib.add_class_defn_by_name("Add", "BinaryOperation")
subtract = stdlib.add_class_defn_by_name("Subtract", "BinaryOperation")
multiply = stdlib.add_class_defn_by_name("Multiply", "BinaryOperation")
divide = stdlib.add_class_defn_by_name("Divide", "BinaryOperation")

condition = stdlib.add_class_defn_by_name("Condition", "BinaryOperation")

equal = stdlib.add_class_defn_by_name("Equal", "Condition")
greater_than = stdlib.add_class_defn_by_name("GreaterThan", "Condition")

print_ = stdlib.add_class_defn_by_name("Print", "Chain")
input_ = stdlib.add_class_defn_by_name("Input", "Chain")

branch = stdlib.add_class_defn_by_name("Branch", "Chain", ["abstract"])
branch.add_prop_defn_by_name("else", "Chain")

if_ = stdlib.add_class_defn_by_name("If", "Branch")

switch = stdlib.add_class_defn_by_name("Switch", "Branch", ["abstract"])
switch.add_prop_defn_by_name("state", "Passive")

loop = stdlib.add_class_defn_by_name("Loop", "Switch", ["abstract"])

while_loop = stdlib.add_class_defn_by_name("WhileLoop", "Loop")
while_loop.add_prop_defn_by_name("test", "Chain")

for_loop = stdlib.add_class_defn_by_name("ForLoop", "Loop")
for_loop.add_prop_defn_by_name("value", "Integer")
for_loop.add_prop_defn_by_name("delta", "Integer")
for_loop.add_prop_defn_by_name("finish", "Integer")