Function: make-hash-table
make-hash-table is a function defined in fns.c.
Signature
(make-hash-table &rest KEYWORD-ARGS)
Documentation
Create and return a new hash table.
Arguments are specified as keyword/argument pairs. The following arguments are defined:
:test TEST -- TEST must be a symbol that specifies how to compare
keys. Default is eql. Predefined are the tests eq, eql, and
equal. User-supplied test and hash functions can be specified via
define-hash-table-test.
:size SIZE -- A hint as to how many elements will be put in the table.
The table will always grow as needed; this argument may help performance
slightly if the size is known in advance but is never required.
:weakness WEAK -- WEAK must be one of nil, t, key, value,
key-or-value, or key-and-value. If WEAK is not nil, the table
returned is a weak table. Key/value pairs are removed from a weak
hash table when there are no non-weak references pointing to their
key, value, one of key or value, or both key and value, depending on
WEAK. WEAK t is equivalent to key-and-value. Default value of WEAK
is nil.
The keywords arguments :rehash-threshold, :rehash-size, and :purecopy are obsolete and ignored.
Other relevant functions are documented in the hash-table group.
Probably introduced at or before Emacs version 21.1.
Shortdoc
;; hash-table
(make-hash-table)
=> #s(hash-table ...)
Aliases
cl-make-hash-table (obsolete since 24.3)
Source Code
// Defined in /usr/src/emacs/src/fns.c
{
Lisp_Object test_arg = Qnil;
Lisp_Object weakness_arg = Qnil;
Lisp_Object size_arg = Qnil;
if (nargs & 1)
error ("Odd number of arguments");
while (nargs >= 2)
{
Lisp_Object arg = maybe_remove_pos_from_symbol (args[--nargs]);
Lisp_Object kw = maybe_remove_pos_from_symbol (args[--nargs]);
if (BASE_EQ (kw, QCtest))
test_arg = arg;
else if (BASE_EQ (kw, QCweakness))
weakness_arg = arg;
else if (BASE_EQ (kw, QCsize))
size_arg = arg;
else if (BASE_EQ (kw, QCrehash_threshold) || BASE_EQ (kw, QCrehash_size)
|| BASE_EQ (kw, QCpurecopy))
; /* ignore obsolete keyword arguments */
else
signal_error ("Invalid keyword argument", kw);
}
const struct hash_table_test *test;
if (NILP (test_arg) || BASE_EQ (test_arg, Qeql))
test = &hashtest_eql;
else if (BASE_EQ (test_arg, Qeq))
test = &hashtest_eq;
else if (BASE_EQ (test_arg, Qequal))
test = &hashtest_equal;
else
test = get_hash_table_user_test (test_arg);
EMACS_INT size;
if (NILP (size_arg))
size = DEFAULT_HASH_SIZE;
else if (FIXNATP (size_arg))
size = XFIXNAT (size_arg);
else
signal_error ("Invalid hash table size", size_arg);
hash_table_weakness_t weak;
if (NILP (weakness_arg))
weak = Weak_None;
else if (BASE_EQ (weakness_arg, Qkey))
weak = Weak_Key;
else if (BASE_EQ (weakness_arg, Qvalue))
weak = Weak_Value;
else if (BASE_EQ (weakness_arg, Qkey_or_value))
weak = Weak_Key_Or_Value;
else if (BASE_EQ (weakness_arg, Qt) || BASE_EQ (weakness_arg, Qkey_and_value))
weak = Weak_Key_And_Value;
else
signal_error ("Invalid hash table weakness", weakness_arg);
return make_hash_table (test, size, weak);
}