diff options
-rw-r--r-- | eval.c | 12 | ||||
-rw-r--r-- | txr.1 | 38 |
2 files changed, 41 insertions, 9 deletions
@@ -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); @@ -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 |