emacs - 为什么哈希末尾有一个额外的值?

标签 emacs lisp elisp

我编写了一个将 alist 转换为 hash 的函数:

(defun hash-alist (alist)
  "Convert association list to a hash table and return it."
  (let ((my-hash (make-hash-table :test 'equal)))
    (dolist (entry alist)
      (if (gethash (car entry) my-hash)
          (error "repeated key"))
      (puthash (car entry) (cdr entry) my-hash))
    my-hash))

但是当我按如下方式运行它时,为什么最后会得到nil

运行:

(setq a '(("a" . 2) ("b" . 1)))
(setq b (hash-alist a))
(maphash (lambda (x y) (princ (format "%s:%d " x y) t))
         b)

输出:

a:2 b:1 nil

最佳答案

nilmaphash的返回值。仅此而已。

这是您评估maphash sexp 的方式,导致打印返回值。 如果您查看缓冲区*Messages*,您可能会看到类似这样的内容(取决于您如何计算表达式):

Evaluating...
a:2 b:1 
Buffer `*Pp Eval Output*' is in mode `Emacs-Lisp'.   For info on the mode: `C-h m'.
nil

返回值记录在 Elisp 手册的节点 Hash Access 中。它也应该(但没有)记录在文档字符串中。

关于emacs - 为什么哈希末尾有一个额外的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19826867/

相关文章:

emacs - startup.el真的有用吗?

LISP 仅在特定情况下从列表中提取元素

lisp - 如何将字符串转换为符号以用作 Lisp "assoc"函数中的键?

Emacs:在交互式命令中激活标记的问题

emacs - 在 Emacs Lisp 中获取当前监视器的宽度

emacs - 如何从组织模式表的列中导出以逗号分隔的值列表

search - 在 emacs lisp 中,有没有办法搜索与当前点重叠的字符串相匹配的文本?

emacs - 如何让emacs shell自动执行init文件?

lisp - 确保 lisp 中的 2 个列表长度相同的最简单方法是什么?

lisp - 执行一个函数直到它返回一个 nil,将它的值收集到一个列表中