chia-blockchain/chia/wallet/chialisp.py

118 lines
2.0 KiB
Python

def sexp(*argv):
return f'({f" ".join([str(arg) for arg in argv])})'
def cons(a, b):
return sexp("c", a, b)
def first(obj):
return sexp("f", obj)
def rest(obj):
return sexp("r", obj)
def nth(obj, *path):
if not path:
return obj
if path[0] < 0:
raise ValueError
if path[0] == 0:
return nth(first(obj), *path[1:])
else:
return nth(rest(obj), *(path[0] - 1,) + path[1:])
def args(*path, p=1):
if len(path) == 0:
return str(p)
if path[0] < 0:
raise ValueError
return args(*path[1:], p=(2 * p << path[0]) | (2 ** path[0] - 1))
def eval(code, env=args()):
return sexp("a", code, env)
def apply(name, argv):
return sexp(*[name] + list(argv))
def quote(obj):
return sexp("q .", obj)
nil = sexp()
def make_if(predicate, true_expression, false_expression):
return eval(apply("i", [predicate, quote(true_expression), quote(false_expression)]))
def make_list(*argv, terminator=nil):
if len(argv) == 0:
return terminator
else:
return cons(argv[0], make_list(*argv[1:], terminator=terminator))
def fail(*argv):
return apply("x", argv)
def sha256(*argv):
return apply("sha256", argv)
SHA256TREE_PROG = """
(a (q . (a 2 (c 2 (c 3 0))))
(c (q . (a (i (l 5)
(q . (sha256 (q . 2)
(a 2 (c 2 (c 9 0)))
(a 2 (c 2 (c 13 0)))))
(q . (sha256 (q . 1) 5))) 1)) %s))
"""
def sha256tree(*argv):
return SHA256TREE_PROG % argv[0]
def equal(*argv):
return apply("=", argv)
def multiply(*argv):
return apply("*", argv)
def add(*argv):
return apply("+", argv)
def subtract(*argv):
return apply("-", argv)
def is_zero(obj):
return equal(obj, quote("0"))
def iff(*argv):
return apply("i", argv)
def hexstr(str):
return quote(f"0x{str}")
def greater(*argv):
return apply(">", argv)
def string(str):
return f'"{str}"'