diff options
author | Paul A. Patience <paul@apatience.com> | 2022-01-17 06:40:51 -0500 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-01-21 22:30:38 -0800 |
commit | 2f9f717738b6bf8e1acd728567a0f953fc8a3614 (patch) | |
tree | d06f7df85cacedc967082595e1696a485d15a6e7 /stdlib | |
parent | 27898e3aa3c6d7daa784712731aa03a7e6d60b22 (diff) | |
download | txr-2f9f717738b6bf8e1acd728567a0f953fc8a3614.tar.gz txr-2f9f717738b6bf8e1acd728567a0f953fc8a3614.tar.bz2 txr-2f9f717738b6bf8e1acd728567a0f953fc8a3614.zip |
type: new macro etypecase.
* lisplib.c (type_set_entries): Add etypecase to autoload list.
* stdlib/type.tl (etypecase): New macro.
* txr.1: Documented.
* stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/doc-syms.tl | 1 | ||||
-rw-r--r-- | stdlib/type.tl | 11 |
2 files changed, 12 insertions, 0 deletions
diff --git a/stdlib/doc-syms.tl b/stdlib/doc-syms.tl index 19804e8d..676323a4 100644 --- a/stdlib/doc-syms.tl +++ b/stdlib/doc-syms.tl @@ -658,6 +658,7 @@ ("etime" "N-036B1BDB") ("etimedout" "N-036B1BDB") ("etxtbsy" "N-036B1BDB") + ("etypecase" "N-033FBE77") ("eval" "N-0286C8B8") ("eval-only" "N-030BF4F5") ("evenp" "D-001C") diff --git a/stdlib/type.tl b/stdlib/type.tl index f75c88e2..8a83a171 100644 --- a/stdlib/type.tl +++ b/stdlib/type.tl @@ -37,3 +37,14 @@ 'typecase cl)))))) ^(let ((,val ,form)) (cond ,*cond-pairs)))) + +(defmacro etypecase (form . clauses) + (if [find t clauses eq car] + ^(typecase ,form ,*clauses) + (let ((val (gensym))) + ^(let ((,val ,form)) + (typecase ,val + ,*clauses + (t (throwf 'case-error + "~s: unhandled type: ~s" + 'etypecase (typeof ,val)))))))) |