- lassign [obj_val $a0] a00 a01
- set rest [list_new [lrange [obj_val $ast] 1 end]]
- if {[is_pair $a0] && [symbol_q $a00] && [obj_val $a00] == "splice-unquote"} {
- return [list_new [list [symbol_new "concat"] $a01 [quasiquote $rest]]]
- } else {
- return [list_new [list [symbol_new "cons"] [quasiquote $a0] [quasiquote $rest]]]
+ return $acc
+}
+
+proc quasiquote {ast} {
+ switch [obj_type $ast] {
+ "symbol" {
+ return [list_new [list [symbol_new "quote"] $ast]]
+ }
+ "hashmap" {
+ return [list_new [list [symbol_new "quote"] $ast]]
+ }
+ "vector" {
+ return [list_new [list [symbol_new "vec"] [qq_foldr [obj_val $ast]]]]
+ }
+ "list" {
+ if {[starts_with [obj_val $ast] "unquote"]} {
+ return [lindex [obj_val $ast] 1]
+ } else {
+ return [qq_foldr [obj_val $ast]]
+ }
+ }
+ default {
+ return $ast
+ }