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.

View in manual

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);
}