3

私はここで猫の箱のような問題を抱えているようです 次のコードは、キーとハッシュテーブルを指定すると、キーに対応する値を返すか、キーがマップに存在しない場合はエラーを返します:

(defun get-graph-node (key graph)
  (let ((result (gethash key graph)))
    (if (nth-value 1 result)
      (nth-value 0 result)
      (error "no node matches the key"))))

ほとんどの場合はそうですが、次のような奇妙な状況が発生しています。

(gethash 0 *g*)

戻り値

   #S(GRAPH-NODE$
      :DATA "("$
      :EDGES (#S(GRAPH-NODE :DATA "b" :EDGES NIL)$
              #S(GRAPH-NODE :DATA "a" :EDGES NIL)))
   T

しかし

(get-graph-node 0 *g*)

get-graph-node で定義されたエラーを通知します

*g* を検査すると、次のようになります。

Count: 5
Size: 16
Test: EQL
Rehash size: 1.5
Rehash threshold: 1.0
[clear hashtable]
Contents: 
0 = #S(GRAPH-NODE :DATA "(" :EDGES (#S(GRAPH-NODE :DATA "b" :EDGES NIL) #S(GRAPH-NODE :DATA "a" :EDGES NIL))) 
[remove entry]
1 = #S(GRAPH-NODE :DATA "a" :EDGES NIL) [remove entry]
2 = #S(GRAPH-NODE :DATA "|" :EDGES (#S(GRAPH-NODE :DATA ")" :EDGES (NIL)))) [remove entry]
3 = #S(GRAPH-NODE :DATA "b" :EDGES NIL) [remove entry]
4 = #S(GRAPH-NODE :DATA ")" :EDGES (NIL)) [remove entry]

では、キー 0 はマップにあるはずですか? 私が欠けているものを教えてくれる紳士への私の帽子の大きなヒント。

4

1 に答える 1

6

gethash の結果を変数 result に代入すると、関数によって返される複数の値の最初の値のみが格納されます。両方を保存するには、次のようにする必要があります。

(defun get-graph-node (key graph)
  (multiple-value-bind (result exists)
      (gethash key graph)
    (if exists
      result
      (error "no node matches the key"))))
于 2013-07-27T21:32:03.883 に答える