aboutsummaryrefslogtreecommitdiff
path: root/neb/std/types.py
blob: ab099e241113d587a24e813ce2e130f9ea11430a (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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from .. import TypeEnum, Environment, Arg, Builtin, evaluate, InterpretPanic
from ..structs import *

TYPES = Environment()

def interpretIsBool(symbol, args, env, ns):
    return Bool(isinstance(args[0], Bool))

TYPES.register("bool?", Builtin("bool?", interpretIsBool, [Arg("arg", TypeEnum.ANY)]))

def interpretIsFloat(symbol, args, env, ns):
    return Bool(isinstance(args[0], Float))

TYPES.register("float?", Builtin("float?", interpretIsFloat, [Arg("arg", TypeEnum.ANY)]))

def interpretIsNumber(symbol, args, env, ns):
    ret = isinstance(args[0], Int) or isinstance(args[0], Float)
    return Bool(ret)

TYPES.register("number?", Builtin("number?", interpretIsNumber, [Arg("arg", TypeEnum.ANY)]))

def interpretIsInt(symbol, args, env, ns):
    return Bool(isinstance(args[0], Int))

TYPES.register("int?", Builtin("int?", interpretIsInt, [Arg("arg", TypeEnum.ANY)]))

def interpretIsList(symbol, args, env, ns):
    return Bool(isinstance(args[0], List))

TYPES.register("list?", Builtin("list?", interpretIsList, [Arg("arg", TypeEnum.ANY)]))

def interpretIsString(symbol, args, env, ns):
    return Bool(isinstance(args[0], String))

TYPES.register("string?", Builtin("string?", interpretIsString, [Arg("arg", TypeEnum.ANY)]))

def interpretStringToInt(symbol, args, env, ns):
    try:
        val = int(args[0].value)
        return Int(val)
    except:
        raise InterpretPanic(symbol, "can't convert to an :int", args[0])

TYPES.register("string->int", Builtin("string->int", interpretStringToInt, [Arg("arg", TypeEnum.STRING)]))

def interpretToString(symbol, args, env, ns):
    item = args[0]
    if isinstance(item, String):
        return item
    elif isinstance(item, Literal):
        return String(str(item))
    else:
        return String(f"{item}")

TYPES.register("->string", Builtin("->string", interpretToString, [Arg("arg", TypeEnum.ANY)]))

def interpretTypeOf(symbol, args, env, ns):
    return Type(f"{args[0].type_}")

TYPES.register("typeof", Builtin("typeof", interpretTypeOf, [Arg("candidate", TypeEnum.ANY)]))