- if (is_pair(first)) {
- var fiter = (first as Mal.Listlike).iter();
- var ffirst = fiter.deref();
- if (ffirst is Mal.Sym &&
- (ffirst as Mal.Sym).v == "splice-unquote") {
- var list = new GLib.List<Mal.Val>();
- list.append(new Mal.Sym("concat"));
- if (fiter.step().empty())
- throw new Mal.Error.BAD_PARAMS(
- "unquote: expected two values");
- list.append(fiter.deref());
- var sublist = new GLib.List<Mal.Val>();
- while (!iter.step().empty())
- sublist.append(iter.deref());
- list.append(quasiquote(new Mal.List(sublist)));
- return new Mal.List(list);
+ public static Mal.Val quasiquote(Mal.Val ast)
+ throws Mal.Error {
+ if (ast is Mal.List) {
+ var unq = unquoted(ast, "unquote");
+ if (unq != null) {
+ return unq;
+ } else {
+ return qq_foldr((ast as Mal.List).iter());