我编写了一个将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
答案 0 :(得分: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手册中,节点Hash Access
。它也应该,但不是,记录在文档字符串中。
答案 1 :(得分:1)
每个Lisp表达式都有一个值。
c-x c-e
计算表达式并打印结果。
如果您评估(+ 1 2)
,则会看到它评估为3
。如果您评估maphash
表达式,那么它的计算结果为NIL
。所以这是印刷的。
由于您的代码调用产生输出的函数,您会看到在返回值之前打印输出。所以没有额外的NIL
。结果就是NIL
。