summaryrefslogtreecommitdiffstats
path: root/lib.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-06-16 20:41:25 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-06-16 20:41:25 -0700
commit9435f6a3ed7b211c92810d3e6470677d2b03c319 (patch)
tree49a6fbbad527734ad9f6a09df11e626bae287b6b /lib.h
parent6ef95aee02b53e3bba0778ef2a94291c33c21cfb (diff)
downloadtxr-9435f6a3ed7b211c92810d3e6470677d2b03c319.tar.gz
txr-9435f6a3ed7b211c92810d3e6470677d2b03c319.tar.bz2
txr-9435f6a3ed7b211c92810d3e6470677d2b03c319.zip
New sequence classification system.
This will help simplify writing generic sequence code, while allowing lists and vectors to be handled specially. * lib.h (enum seq_kind, seq_kind_t): New enum and typedef. (struct seq_info, seq_info_t): New struct and typedef. (seq_kind_tab, seq_info): Declared. * lib.c (seq_kind_tab): New global array. (seq_info): New function.
Diffstat (limited to 'lib.h')
-rw-r--r--lib.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/lib.h b/lib.h
index ea644448..24db79f1 100644
--- a/lib.h
+++ b/lib.h
@@ -345,6 +345,18 @@ typedef val *loc;
#define mpush(val, lo) (push(val, lo))
#endif
+typedef enum seq_kind {
+ SEQ_NIL, SEQ_LISTLIKE, SEQ_VECLIKE, SEQ_HASHLIKE, SEQ_NOTSEQ
+} seq_kind_t;
+
+typedef struct seq_info {
+ val obj;
+ type_t type;
+ seq_kind_t kind;
+} seq_info_t;
+
+extern const seq_kind_t seq_kind_tab[MAXTYPE+1];
+
INLINE cnum tag(val obj) { return coerce(cnum, obj) & TAG_MASK; }
INLINE int is_ptr(val obj) { return obj && tag(obj) == TAG_PTR; }
INLINE int is_num(val obj) { return tag(obj) == TAG_NUM; }
@@ -486,6 +498,7 @@ val identity(val obj);
val typeof(val obj);
val subtypep(val sub, val sup);
val typep(val obj, val type);
+seq_info_t seq_info(val cobj);
val throw_mismatch(val obj, type_t);
INLINE val type_check(val obj, type_t typecode)
{