dict-get, dict-set, set-nth

This commit is contained in:
2020-12-01 15:48:36 -07:00
parent 4775ff41da
commit 48f0034123
3 changed files with 25 additions and 4 deletions

View File

@@ -30,9 +30,8 @@
(deflocal :Map<Int,Int> numbersMap (new Map))
(deflocal &mut pair null)
(doFor number numbers
// TODO implement dict-set, dict-get, set-nth, and use them
(set (nth numbersMap number) (- sum number))
(let [requiredForPair (nth numbersMap number)]
(dict-set numbersMap number (- sum number))
(let [requiredForPair (dict-get numbersMap number)]
(when (numbersMap.exists requiredForPair)
(set pair (or pair [number requiredForPair])))))

View File

@@ -100,6 +100,21 @@ class Macros {
]).withPosOf(wholeExp);
};
function arraySet(wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
return CallExp(Symbol("set").withPosOf(wholeExp), [
CallExp(Symbol("nth").withPosOf(wholeExp), [exps[0], exps[1]]).withPosOf(wholeExp),
exps[2]
]).withPosOf(wholeExp);
}
macros["set-nth"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(3, 3, "(set-nth [list] [index] [value])");
arraySet(wholeExp, exps, k);
};
macros["dict-set"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(3, 3, "(dict-set [dict] [key] [value])");
arraySet(wholeExp, exps, k);
};
// Under the hood, (defmacrofun ...) defines a runtime function that accepts Quote arguments and a special form that quotes the arguments to macrofun calls
macros["defmacrofun"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(3, null, "(defmacrofun [name] [args] [body...])");

View File

@@ -25,9 +25,16 @@ class SpecialForms {
EBlock([for (bodyExp in args) k.convert(bodyExp)]).withMacroPosOf(wholeExp);
};
function arrayAccess(wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) {
return EArray(k.convert(args[0]), k.convert(args[1])).withMacroPosOf(wholeExp);
};
map["nth"] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(2, 2, "(nth [list] [idx])");
EArray(k.convert(args[0]), k.convert(args[1])).withMacroPosOf(wholeExp);
arrayAccess(wholeExp, args, k);
};
map["dict-get"] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(2, 2, "(dict-get [dict] [key])");
arrayAccess(wholeExp, args, k);
};
function makeQuickNth(idx:Int, name:String) {