summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eval.c12
-rw-r--r--txr.138
2 files changed, 41 insertions, 9 deletions
diff --git a/eval.c b/eval.c
index 8dd3b047..64970dfe 100644
--- a/eval.c
+++ b/eval.c
@@ -87,8 +87,8 @@ val sys_catch_s, handler_bind_s, cond_s, if_s, iflet_s, when_s, usr_var_s;
val defvar_s, defvarl_s, defparm_s, defparml_s, defun_s, defmacro_s, macro_s;
val tree_case_s, tree_bind_s, mac_param_bind_s, mac_env_param_bind_s;
val sys_mark_special_s;
-val caseq_s, caseql_s, casequal_s;
-val caseq_star_s, caseql_star_s, casequal_star_s;
+val case_s, caseq_s, caseql_s, casequal_s;
+val case_star_s, caseq_star_s, caseql_star_s, casequal_star_s;
val memq_s, memql_s, memqual_s;
val eq_s, eql_s, equal_s, less_s;
val car_s, cdr_s, not_s, vecref_s;
@@ -4281,7 +4281,7 @@ static val me_case(val form, val menv)
val memfuncsym, eqfuncsym;
val lofnil = cons(nil, nil);
val star = tnil(casesym == caseq_star_s || casesym == caseql_star_s ||
- casesym == casequal_star_s);
+ casesym == casequal_star_s || casesym == case_star_s);
int compat = (opt_compat && opt_compat <= 156 && !star);
val comp_eq_f = func_n1(compares_with_eq);
val integerp_f = func_n1(integerp);
@@ -7113,9 +7113,11 @@ void eval_init(void)
sys_catch_s = intern(lit("catch"), system_package);
handler_bind_s = intern(lit("handler-bind"), user_package);
cond_s = intern(lit("cond"), user_package);
+ case_s = intern(lit("case"), user_package);
caseq_s = intern(lit("caseq"), user_package);
caseql_s = intern(lit("caseql"), user_package);
casequal_s = intern(lit("casequal"), user_package);
+ case_star_s = intern(lit("case*"), user_package);
caseq_star_s = intern(lit("caseq*"), user_package);
caseql_star_s = intern(lit("caseql*"), user_package);
casequal_star_s = intern(lit("casequal*"), user_package);
@@ -7317,15 +7319,19 @@ void eval_init(void)
reg_mac(quasilist_s, func_n2(me_quasilist));
reg_mac(flet_s, me_flet_labels_f);
reg_mac(labels_s, me_flet_labels_f);
+ reg_mac(case_s, me_case_f);
reg_mac(caseq_s, me_case_f);
reg_mac(caseql_s, me_case_f);
reg_mac(casequal_s, me_case_f);
+ reg_mac(case_star_s, me_case_f);
reg_mac(caseq_star_s, me_case_f);
reg_mac(caseql_star_s, me_case_f);
reg_mac(casequal_star_s, me_case_f);
+ reg_mac(intern(lit("ecase"), user_package), me_ecase_f);
reg_mac(intern(lit("ecaseq"), user_package), me_ecase_f);
reg_mac(intern(lit("ecaseql"), user_package), me_ecase_f);
reg_mac(intern(lit("ecasequal"), user_package), me_ecase_f);
+ reg_mac(intern(lit("ecase*"), user_package), me_ecase_f);
reg_mac(intern(lit("ecaseq*"), user_package), me_ecase_f);
reg_mac(intern(lit("ecaseql*"), user_package), me_ecase_f);
reg_mac(intern(lit("ecasequal*"), user_package), me_ecase_f);
diff --git a/txr.1 b/txr.1
index 358c3ca8..1e2bed5d 100644
--- a/txr.1
+++ b/txr.1
@@ -16963,8 +16963,9 @@ This holds in the case that the syntax is empty:
yields
.codn nil .
-.coNP Macros @, caseq @ caseql and @ casequal
+.coNP Macros @, case @, caseq @ caseql and @ casequal
.synb
+.mets (case < test-form << normal-clause * <> [ else-clause ])
.mets (caseq < test-form << normal-clause * <> [ else-clause ])
.mets (caseql < test-form << normal-clause * <> [ else-clause ])
.mets (casequal < test-form << normal-clause * <> [ else-clause ])
@@ -16979,6 +16980,12 @@ When the value matches a key, then the remaining forms of
are evaluated, and the value of the last form is returned; subsequent
clauses are not evaluated.
+The
+.code case
+and
+.code casequal
+macros are synonyms.
+
If no
.meta normal-clause
matches, and there is no
@@ -17038,13 +17045,15 @@ The
macro generates code which uses the
.code eq
function's
-equality. The
+equality; the
.code caseql
macro uses
-.codn eql ,
+.codn eql ;
+and
+.code case
and
.code casequal
-uses
+use
.codn equal .
.TP* Example
@@ -17057,19 +17066,22 @@ uses
...)
.brev
-.coNP Macros @, caseq* @ caseql* and @ casequal*
+.coNP Macros @, case* @, caseq* @ caseql* and @ casequal*
.synb
+.mets (case* < test-form << normal-clause * <> [ else-clause ])
.mets (caseq* < test-form << normal-clause * <> [ else-clause ])
.mets (caseql* < test-form << normal-clause * <> [ else-clause ])
.mets (casequal* < test-form << normal-clause * <> [ else-clause ])
.syne
.desc
The
+.codn caseq ,
.codn caseq* ,
.codn caseql* ,
and
.code casequal*
macros are similar to the macros
+.codn case ,
.codn caseq ,
.codn caseql ,
and
@@ -17115,6 +17127,16 @@ or
.code casequal*
macro is expanded.
+The
+.code case*
+and
+.code casequal*
+macros are synonyms, similarly to
+.code case
+and
+.code casequal
+being synonyms.
+
Note: these macros allow the use of variables and global symbol
macros as case keys.
@@ -17132,20 +17154,24 @@ macros as case keys.
--> "cool"
.brev
-.coNP Macros @, ecaseq @, ecaseql @, ecasequal @, ecaseq* @ ecaseql* and @ ecasequal*
+.coNP Macros @, ecase @, ecaseq @, ecaseql @, ecasequal @, ecase* @, ecaseq* @ ecaseql* and @ ecasequal*
.synb
+.mets (ecase < test-form << normal-clause * <> [ else-clause ])
.mets (ecaseq < test-form << normal-clause * <> [ else-clause ])
.mets (ecaseql < test-form << normal-clause * <> [ else-clause ])
.mets (ecasequal < test-form << normal-clause * <> [ else-clause ])
+.mets (ecase* < test-form << normal-clause * <> [ else-clause ])
.mets (ecaseq* < test-form << normal-clause * <> [ else-clause ])
.mets (ecaseql* < test-form << normal-clause * <> [ else-clause ])
.mets (ecasequal* < test-form << normal-clause * <> [ else-clause ])
.syne
.desc
These macros are error-catching variants of, respectively,
+.codn case ,
.codn caseq ,
.codn caseql ,
.codn casequal ,
+.codn case* ,
.codn caseq* ,
.code caseql*
and