20 lines
1000 B
Plaintext
20 lines
1000 B
Plaintext
|
|
(fun print_through (x) (let (_ (println x)) x))
|
||
|
|
|
||
|
|
(fun is_pair? (x) (and (vector? x) (> (len x) 0)))
|
||
|
|
|
||
|
|
(set! quasiquote (vau de (x)
|
||
|
|
(cond (is_pair? x)
|
||
|
|
(cond (and (symbol? (idx x 0)) (= (get-text (idx x 0)) "unquote"))
|
||
|
|
(eval (idx x 1) de)
|
||
|
|
true
|
||
|
|
(cond (and (is_pair? (idx x 0)) (symbol? (idx (idx x 0) 0)) (= (get-text (idx (idx x 0) 0)) "splice-unquote"))
|
||
|
|
(concat (eval (idx (idx x 0) 1) de) (apply quasiquote [(slice x 1 -1)] de))
|
||
|
|
true
|
||
|
|
(concat [(apply quasiquote [(idx x 0)] de)] (apply quasiquote [(slice x 1 -1)] de))))
|
||
|
|
true x)))
|
||
|
|
|
||
|
|
(add_grammar_rule 'form '("`" optional_WS form) (lambda (_ _ f) ['quasiquote f]))
|
||
|
|
(add_grammar_rule 'form '("~" optional_WS form) (lambda (_ _ f) ['unquote f]))
|
||
|
|
(add_grammar_rule 'form '("," optional_WS form) (lambda (_ _ f) ['splice-unquote f]))
|
||
|
|
|