minpkg/lib/min_dict.nim
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
import
std/critbits
import
../core/parser,
../core/value,
../core/interpreter,
../core/utils
proc dict_module*(i: In) =
let def = i.define()
def.symbol("has?") do (i: In):
let vals = i.expect("'sym", "dict")
let k = vals[0]
let d = vals[1]
i.push d.dhas(k).newVal
def.symbol("get") do (i: In):
let vals = i.expect("'sym", "dict")
let k = vals[0]
let d = vals[1]
i.push i.dget(d, k)
def.symbol("get-raw") do (i: In):
let vals = i.expect("'sym", "dict")
let k = vals[0]
let d = vals[1]
let v = i.dget(d, k)
var rv = newDict(i.scope)
rv.objType = "rawval"
i.dset(rv, "type", v.typeName.newVal)
i.dset(rv, "val", v)
i.dset(rv, "str", newVal($v))
i.push rv
def.symbol("set") do (i: In):
let vals = i.expect("'sym", "a", "dict")
let k = vals[0]
let m = vals[1]
var d = vals[2]
i.push i.dset(d, k, m)
def.symbol("set-sym") do (i: In):
let vals = i.expect("'sym", "'sym", "dict")
let k = vals[0]
let m = newSym(vals[1].getString)
var d = vals[2]
i.push i.dset(d, k, m)
def.symbol("del") do (i: In):
let vals = i.expect("'sym", "dict")
let k = vals[0]
var d = vals[1]
i.push i.ddel(d, k)
def.symbol("keys") do (i: In):
let vals = i.expect("dict")
let d = vals[0]
i.push i.keys(d)
def.symbol("values") do (i: In):
let vals = i.expect("dict")
let d = vals[0]
i.push i.values(d)
def.symbol("pairs") do (i: In):
let vals = i.expect("dict")
let d = vals[0]
i.push i.pairs(d)
def.symbol("dup") do (i: In):
let vals = i.expect("dict")
let d = vals[0]
var r = newDict(i.scope)
for item in d.dVal.pairs:
r.scope.symbols[item.key] = item.val
i.push r
def.symbol("pick") do (i: In):
let vals = i.expect("quot", "dict")
var q = vals[0]
var d = vals[1]
var res = newDict(i.scope)
for k in q.qVal:
if d.dhas(k):
i.dset(res, k, i.dget(d, k))
i.push res
def.symbol("type") do (i: In):
let vals = i.expect("dict")
i.push vals[0].objType.newVal
def.finalize("dict")
|