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 マニュアルの node に記載されていますHash Access。また、ドキュメント文字列にドキュメント化する必要がありますが、ドキュメント化されていません。

于 2013-11-07T02:42:13.157 に答える
1

すべての Lisp 式には値があります。

c-x c-e式を評価し、結果を出力します。

評価(+ 1 2)すると、 に評価されることがわかります3maphash式を評価すると、 に評価されNILます。というわけで印刷です。

コードは出力を生成する関数を呼び出すため、出力が戻り値の前に表示されることがわかります。だから余分なものはありませんNIL。それだけがNIL結果です。

于 2013-11-07T07:44:47.093 に答える