common-lisp之常见的 lisp(多个)值是真还是假

lovecherry 阅读:38 2024-09-07 23:24:14 评论:0

我这里似乎有一个盒子里的猫的问题 以下代码应在给定键和哈希表的情况下返回与键对应的值,如果键不在映射中则返回错误:

(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应该在映射中? 向可以告诉我我缺少什么的绅士致敬。

请您参考如下方法:

将 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")))) 


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号