/* -*-comment-start: "//";comment-end:""-*- * Mes --- Maxwell Equations of Software * Copyright © 2016 Jan Nieuwenhuizen * * This file is part of Mes. * * Mes is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * Mes is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Mes. If not, see . */ #if QUASIQUOTE SCM unquote (SCM x) ///((no-environment)) { return cons (cell_symbol_unquote, x); } SCM unquote_splicing (SCM x) ///((no-environment)) { return cons (cell_symbol_unquote_splicing, x); } SCM eval_quasiquote (SCM e, SCM a) { return vm_call (vm_eval_quasiquote, e, cell_undefined, a); } SCM vm_eval_quasiquote () { if (r1 == cell_nil) return r1; else if (atom_p (r1) == cell_t) return r1; else if (eq_p (car (r1), cell_symbol_unquote) == cell_t) return eval_env (cadr (r1), r0); else if (TYPE (r1) == PAIR && TYPE (car (r1)) == PAIR && eq_p (caar (r1), cell_symbol_unquote_splicing) == cell_t) { r2 = eval_env (cadar (r1), r0); return append2 (r2, eval_quasiquote (cdr (r1), r0)); } r2 = eval_quasiquote (car (r1), r0); return cons (r2, eval_quasiquote (cdr (r1), r0)); } SCM add_unquoters (SCM a) { SCM q = assq_ref_cache (cell_symbol_the_unquoters, a); return append2 (q, a); } #else // !QUASIQUOTE SCM add_unquoters (SCM a){} SCM eval_quasiquote (SCM e, SCM a){} SCM unquote (SCM x){} SCM unquote_splicing (SCM x){} SCM vm_eval_quasiquote () {} #endif // QUASIQUOTE #if QUASISYNTAX SCM syntax (SCM x) { return cons (cell_symbol_syntax, x); } SCM unsyntax (SCM x) ///((no-environment)) { return cons (cell_symbol_unsyntax, x); } SCM unsyntax_splicing (SCM x) ///((no-environment)) { return cons (cell_symbol_unsyntax_splicing, x); } SCM eval_quasisyntax (SCM e, SCM a) { return vm_call (vm_eval_quasisyntax, e, cell_undefined, a); } SCM vm_eval_quasisyntax () { if (r1 == cell_nil) return r1; else if (atom_p (r1) == cell_t) return r1; else if (eq_p (car (r1), cell_symbol_unsyntax) == cell_t) return eval_env (cadr (r1), r0); else if (TYPE (r1) == PAIR && TYPE (car (r1)) == PAIR && eq_p (caar (r1), cell_symbol_unsyntax_splicing) == cell_t) { r2 = eval_env (cadar (r1), r0); return append2 (r2, eval_quasisyntax (cdr (r1), r0)); } r2 = eval_quasisyntax (car (r1), r0); return cons (r2, eval_quasisyntax (cdr (r1), r0)); } SCM add_unsyntaxers (SCM a) { SCM q = assq_ref_cache (cell_symbol_the_unsyntaxers, a); return append2 (q, a); } #else // !QUASISYNTAX SCM syntax (SCM x){} SCM unsyntax (SCM x){} SCM unsyntax_splicing (SCM x){} SCM add_unsyntaxers (SCM a){} SCM eval_quasisyntax (SCM e, SCM a){} SCM vm_eval_quasisyntax () {} #endif // !QUASISYNTAX