diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-06-16 20:41:25 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-06-16 20:41:25 -0700 |
commit | 9435f6a3ed7b211c92810d3e6470677d2b03c319 (patch) | |
tree | 49a6fbbad527734ad9f6a09df11e626bae287b6b /lib.h | |
parent | 6ef95aee02b53e3bba0778ef2a94291c33c21cfb (diff) | |
download | txr-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.h | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -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) { |