summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-11-19 07:37:32 -0800
committerKaz Kylheku <kaz@kylheku.com>2016-11-19 07:37:32 -0800
commit91de0e52b8d1cfa3d7d6e2be69d6d7cf6e479bfe (patch)
tree7b74b4bff9f1e9d149ed9505642b557c4aaf4064 /eval.c
parent7cea70b7547d6e3410a04c87ed12533261a39685 (diff)
downloadtxr-91de0e52b8d1cfa3d7d6e2be69d6d7cf6e479bfe.tar.gz
txr-91de0e52b8d1cfa3d7d6e2be69d6d7cf6e479bfe.tar.bz2
txr-91de0e52b8d1cfa3d7d6e2be69d6d7cf6e479bfe.zip
Use function rather than cptr built-in macros.
* eval.c (mefun_t): Typedef removed. (expand_macro): Test whether the binding is a function, rather than C object, and call it with funcall2. (reg_mac): Take a val argument for the expander function, rather than a C function pointer, and just store that value into the binding unconverted. (eval_init): Insert a func_n2(...) call into all reg_mac calls to hoist the C functions into the object domain.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c99
1 files changed, 48 insertions, 51 deletions
diff --git a/eval.c b/eval.c
index d74e8164..d96a02ce 100644
--- a/eval.c
+++ b/eval.c
@@ -61,7 +61,6 @@
#define min(a, b) ((a) < (b) ? (a) : (b))
typedef val (*opfun_t)(val, val);
-typedef val (*mefun_t)(val, val);
struct c_var {
val *loc;
@@ -1662,9 +1661,8 @@ static val expand_macro(val form, val mac_binding, val menv)
{
val expander = cdr(mac_binding);
- if (cobjp(expander)) {
- mefun_t fp = coerce(mefun_t, cptr_get(expander));
- val expanded = fp(form, menv);
+ if (functionp(expander)) {
+ val expanded = funcall2(expander, form, menv);
set_origin(expanded, form);
return expanded;
} else {
@@ -4597,10 +4595,10 @@ void reg_fun(val sym, val fun)
sethash(builtin, sym, defun_s);
}
-static void reg_mac(val sym, mefun_t fun)
+static void reg_mac(val sym, val fun)
{
assert (sym != 0);
- sethash(top_mb, sym, cons(sym, cptr(coerce(mem_t *, fun))));
+ sethash(top_mb, sym, cons(sym, fun));
sethash(builtin, sym, defmacro_s);
}
@@ -4972,51 +4970,50 @@ void eval_init(void)
reg_op(prof_s, op_prof);
reg_op(switch_s, op_switch);
- reg_mac(defvar_s, me_def_variable);
- reg_mac(defparm_s, me_def_variable);
- reg_mac(defparml_s, me_def_variable);
- reg_mac(gen_s, me_gen);
- reg_mac(gun_s, me_gun);
- reg_mac(intern(lit("delay"), user_package), me_delay);
- reg_mac(op_s, me_op);
- reg_mac(do_s, me_op);
- reg_mac(ap_s, me_ap);
- reg_mac(intern(lit("ip"), user_package), me_ip);
- reg_mac(intern(lit("ado"), user_package), me_ado);
- reg_mac(intern(lit("ido"), user_package), me_ido);
- reg_mac(ret_s, me_ret_aret);
- reg_mac(aret_s, me_ret_aret);
- reg_mac(qquote_s, me_qquote);
- reg_mac(sys_qquote_s, me_qquote);
- reg_mac(intern(lit("pprof"), user_package), me_pprof);
- reg_mac(when_s, me_when);
- reg_mac(intern(lit("unless"), user_package), me_unless);
- reg_mac(while_s, me_while_until);
- reg_mac(while_star_s, me_while_until_star);
- reg_mac(until_s, me_while_until);
- reg_mac(until_star_s, me_while_until_star);
- reg_mac(quasilist_s, me_quasilist);
- reg_mac(flet_s, me_flet_labels);
- reg_mac(labels_s, me_flet_labels);
- reg_mac(caseq_s, me_case);
- reg_mac(caseql_s, me_case);
- reg_mac(casequal_s, me_case);
- reg_mac(caseq_star_s, me_case);
- reg_mac(caseql_star_s, me_case);
- reg_mac(casequal_star_s, me_case);
- reg_mac(intern(lit("tb"), user_package), me_tb);
- reg_mac(intern(lit("tc"), user_package), me_tc);
- reg_mac(opip_s, me_opip);
- reg_mac(oand_s, me_opip);
- reg_mac(intern(lit("ignerr"), user_package), me_ignerr);
- reg_mac(intern(lit("whilet"), user_package), me_whilet);
- reg_mac(iflet_s, me_iflet_whenlet);
- reg_mac(intern(lit("whenlet"), user_package), me_iflet_whenlet);
- reg_mac(intern(lit("dotimes"), user_package), me_dotimes);
- reg_mac(intern(lit("lcons"), user_package), me_lcons);
- reg_mac(intern(lit("mlet"), user_package), me_mlet);
- reg_mac(intern(lit("defex"), user_package), me_defex);
-
+ reg_mac(defvar_s, func_n2(me_def_variable));
+ reg_mac(defparm_s, func_n2(me_def_variable));
+ reg_mac(defparml_s, func_n2(me_def_variable));
+ reg_mac(gen_s, func_n2(me_gen));
+ reg_mac(gun_s, func_n2(me_gun));
+ reg_mac(intern(lit("delay"), user_package), func_n2(me_delay));
+ reg_mac(op_s, func_n2(me_op));
+ reg_mac(do_s, func_n2(me_op));
+ reg_mac(ap_s, func_n2(me_ap));
+ reg_mac(intern(lit("ip"), user_package), func_n2(me_ip));
+ reg_mac(intern(lit("ado"), user_package), func_n2(me_ado));
+ reg_mac(intern(lit("ido"), user_package), func_n2(me_ido));
+ reg_mac(ret_s, func_n2(me_ret_aret));
+ reg_mac(aret_s, func_n2(me_ret_aret));
+ reg_mac(qquote_s, func_n2(me_qquote));
+ reg_mac(sys_qquote_s, func_n2(me_qquote));
+ reg_mac(intern(lit("pprof"), user_package), func_n2(me_pprof));
+ reg_mac(when_s, func_n2(me_when));
+ reg_mac(intern(lit("unless"), user_package), func_n2(me_unless));
+ reg_mac(while_s, func_n2(me_while_until));
+ reg_mac(while_star_s, func_n2(me_while_until_star));
+ reg_mac(until_s, func_n2(me_while_until));
+ reg_mac(until_star_s, func_n2(me_while_until_star));
+ reg_mac(quasilist_s, func_n2(me_quasilist));
+ reg_mac(flet_s, func_n2(me_flet_labels));
+ reg_mac(labels_s, func_n2(me_flet_labels));
+ reg_mac(caseq_s, func_n2(me_case));
+ reg_mac(caseql_s, func_n2(me_case));
+ reg_mac(casequal_s, func_n2(me_case));
+ reg_mac(caseq_star_s, func_n2(me_case));
+ reg_mac(caseql_star_s, func_n2(me_case));
+ reg_mac(casequal_star_s, func_n2(me_case));
+ reg_mac(intern(lit("tb"), user_package), func_n2(me_tb));
+ reg_mac(intern(lit("tc"), user_package), func_n2(me_tc));
+ reg_mac(opip_s, func_n2(me_opip));
+ reg_mac(oand_s, func_n2(me_opip));
+ reg_mac(intern(lit("ignerr"), user_package), func_n2(me_ignerr));
+ reg_mac(intern(lit("whilet"), user_package), func_n2(me_whilet));
+ reg_mac(iflet_s, func_n2(me_iflet_whenlet));
+ reg_mac(intern(lit("whenlet"), user_package), func_n2(me_iflet_whenlet));
+ reg_mac(intern(lit("dotimes"), user_package), func_n2(me_dotimes));
+ reg_mac(intern(lit("lcons"), user_package), func_n2(me_lcons));
+ reg_mac(intern(lit("mlet"), user_package), func_n2(me_mlet));
+ reg_mac(intern(lit("defex"), user_package), func_n2(me_defex));
reg_fun(cons_s, func_n2(cons));
reg_fun(intern(lit("make-lazy-cons"), user_package), func_n1(make_lazy_cons));
reg_fun(intern(lit("lcons-fun"), user_package), func_n1(lcons_fun));