2

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

(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
4

2 回答 2

4

nil是的返回值maphash。仅此而已。

这是您评估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 手册 nodeHash Access中。它也应该但没有记录在文档字符串中。

于 2013-11-07T02:42:13.157 回答
1

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

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

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

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

于 2013-11-07T07:44:47.093 回答