summaryrefslogtreecommitdiffstats
path: root/hash.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-03-14 13:27:06 -0700
committerKaz Kylheku <kaz@kylheku.com>2012-03-14 13:27:06 -0700
commit0592949de3e274b7d9700ec74466b541055c3bca (patch)
tree7782121888bf42e1719834cf23594b51bb3ce4a4 /hash.c
parent96f072cfdb5d1eac3e32dbdb15704b0a32258a37 (diff)
downloadtxr-0592949de3e274b7d9700ec74466b541055c3bca.tar.gz
txr-0592949de3e274b7d9700ec74466b541055c3bca.tar.bz2
txr-0592949de3e274b7d9700ec74466b541055c3bca.zip
Allow quasi-quoting over hash table literals,
to express dynamic hash table construction * eval.c (expand_qquote): Recognize hash-construct forms: expand the hash arguments and pairs separately, then rewrite to a new hash-construct form. (eval-init): hash-construct intrinsic function added. * hash.c (hash_construct_s): New symbol variable. (hash_construct): New function. (hash_init): Initialize hash_construct_s. * hash.h (hash_construct_s, hash_construct): Declared. * parser.y (hash): Rule rewritten to emit either a literal hash table object, or a hash-construct form, based on whether quasiquote unquotes occur within the syntax. (hash_from_notation): Function removed.
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/hash.c b/hash.c
index bc086ae9..713034c7 100644
--- a/hash.c
+++ b/hash.c
@@ -65,6 +65,7 @@ struct hash_iter {
};
val weak_keys_k, weak_vals_k, equal_based_k;
+val hash_construct_s;
/*
* Dynamic list built up during gc.
@@ -580,9 +581,22 @@ val hashv(val args)
return make_hash(wkeys, wvals, equal);
}
+val hash_construct(val hashv_args, val pairs)
+{
+ val hash = hashv(hashv_args);
+
+ for (; pairs; pairs = cdr(pairs)) {
+ val pair = car(pairs);
+ sethash(hash, first(pair), second(pair));
+ }
+
+ return hash;
+}
+
void hash_init(void)
{
weak_keys_k = intern(lit("weak-keys"), keyword_package);
weak_vals_k = intern(lit("weak-vals"), keyword_package);
equal_based_k = intern(lit("equal-based"), keyword_package);
+ hash_construct_s = intern(lit("hash-construct"), user_package);
}