diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-03-22 18:44:12 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-03-22 18:44:12 -0700 |
commit | 24bfded1413e45bb949f6c1ee2b3e8ef34f12329 (patch) | |
tree | 2c0ee03aa67f25cde703f6b98b6c33bedcaa0e39 /lib.c | |
parent | 6ff237b689590320f942a195193fed3f95934de1 (diff) | |
download | txr-24bfded1413e45bb949f6c1ee2b3e8ef34f12329.tar.gz txr-24bfded1413e45bb949f6c1ee2b3e8ef34f12329.tar.bz2 txr-24bfded1413e45bb949f6c1ee2b3e8ef34f12329.zip |
New type args with DARG type code.
An object of args type captures into the heap the "struct
args" argument list that normally appears only on the stack.
Such an object also has space for a car and cdr field,
which can come in handy.
* args.c (dyn_args): New function: hoist a struct args *
into an args heap object.
* args.h (dyn_args): Declared.
* gc.c (finalize, mark_obj): Handle DARGS type code.
* hash.c (equal_hash): Handle DARG via eq equivalence.
* lib.c (args_s): New symbol variable.
(code2type): Map DARG to args symbol.
(equal): Handle DARG type, using eq equivalence for now.
(obj_init): Initialize args_s with interned symbol.
* lib.h (enum type, type_t): New type code, DARG.
(struct dyn_args): New struct.
(union obj): New member, a of type struct dyn_args.
* txr.1: Documented args type under typeof.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -95,7 +95,7 @@ val package_s, system_package_s, keyword_package_s, user_package_s; val null_s, t, cons_s, str_s, chr_s, fixnum_s, sym_s, pkg_s, fun_s, vec_s; val lit_s, stream_s, hash_s, hash_iter_s, lcons_s, lstr_s, cobj_s, cptr_s; val atom_s, integer_s, number_s, sequence_s, string_s; -val env_s, bignum_s, float_s, range_s, rcons_s, buf_s, tnode_s; +val env_s, bignum_s, float_s, range_s, rcons_s, buf_s, tnode_s, args_s; val var_s, expr_s, regex_s, chset_s, set_s, cset_s, wild_s, oneplus_s; val nongreedy_s; val quote_s, qquote_s, unquote_s, splice_s; @@ -196,6 +196,7 @@ static val code2type(int code) case RNG: return range_s; case BUF: return buf_s; case TNOD: return tnode_s; + case DARG: return args_s; } return nil; } @@ -2884,6 +2885,8 @@ val equal(val left, val right) case CPTR: if (type(right) == CPTR && left->co.ops == right->co.ops) return left->co.ops->equal(left, right); + case DARG: + break; } if (type(right) != COBJ) @@ -11216,6 +11219,7 @@ static void obj_init(void) rcons_s = intern(lit("rcons"), user_package); buf_s = intern(lit("buf"), user_package); tnode_s = intern(lit("tnode"), user_package); + args_s = intern(lit("args"), user_package); var_s = intern(lit("var"), system_package); expr_s = intern(lit("expr"), system_package); regex_s = intern(lit("regex"), user_package); |