aboutsummaryrefslogtreecommitdiff
path: root/neb/std/boolean.py
blob: e480656c6d203d8fe8d47b6656193cbb2763eea0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from .. import TypeEnum, Environment, Arg, Builtin, evaluate, InterpretPanic, TypeWrap
from ..structs import *

BOOLEAN = Environment()

def interpretEq(symbol, args, env, ns):
    # TODO this is a bit hacky
    if (isinstance(args[0], Type) or isinstance(args[0], TypeWrap)) and \
        (isinstance(args[1], Type) or isinstance(args[1], TypeWrap)):
        if args[0].name == args[1].name:
            return Bool(True)
        else:
            return Bool(False)
    elif type(args[0]) != type(args[1]):
        return Bool(False)
    elif isinstance(args[0], Literal):
        if args[0].value == args[1].value:
            return Bool(True)
        else:
            return Bool(False)
    else:
        raise InterpretPanic(symbol, "unknown comparison type", args[0])

eq_arg = Arg("value", TypeEnum.ANY)
BOOLEAN.register("eq?", Builtin("eq?", interpretEq, [eq_arg, eq_arg], return_type=Type(":bool")))


def interpretNot(symbol, args, env, ns):
    return Bool(not args[0].value)

not_arg = Arg("not", TypeEnum.BOOL)
BOOLEAN.register("not", Builtin("not", interpretNot, [not_arg], return_type=Type(":bool")))