+
+ static MalList qq_loop(MalVal elt, MalList acc)
+ {
+ lst := elt as MalList
+ if (lst?.count == 2 && (lst[0] as MalSymbol)?.value == "splice-unquote")
+ return MalList(MalVal[MalSymbol("concat"), lst[1], acc])
+ else
+ return MalList(MalVal[MalSymbol("cons"), quasiquote(elt), acc])
+ }
+
+ static MalList qq_foldr(MalSeq xs)
+ {
+ acc := MalList([,])
+ for (i:=xs.count-1; 0<=i; i-=1)
+ acc = qq_loop(xs[i], acc)
+ return acc
+ }
+