为什么在哈希结束时有额外的值?

时间:2013-11-07 02:26:24

标签: 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

2 个答案:

答案 0 :(得分:4)

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。它也应该,但不是,记录在文档字符串中。

答案 1 :(得分:1)

每个Lisp表达式都有一个值。

c-x c-e计算表达式并打印结果。

如果您评估(+ 1 2),则会看到它评估为3。如果您评估maphash表达式,那么它的计算结果为NIL。所以这是印刷的。

由于您的代码调用产生输出的函数,您会看到在返回值之前打印输出。所以没有额外的NIL。结果就是NIL