+def starts_with(ast, sym)
+ return ast.is_a?(List) && ast.size == 2 && ast[0] == sym
+end
+
+def qq_loop(ast)
+ acc = List.new []
+ ast.reverse_each do |elt|
+ if starts_with(elt, :"splice-unquote")
+ acc = List.new [:concat, elt[1], acc]
+ else
+ acc = List.new [:cons, quasiquote(elt), acc]
+ end
+ end
+ return acc