Racket哈希表默认失败结果不够有帮助

6
在Racket中,如果你尝试使用hash-ref去获取一个哈希表中不存在的键值,例如:
(define a-hash #hash((1 . "a")
                     (2 . "b")))
(hash-ref a-hash 3)

出现了一个exn:fail:contract异常。

...\Racket\collects\racket\private\more-scheme.rkt:263:2: hash-ref: 根据键没有找到值

不幸的是,exn:fail:contract异常的信息非常笼统。这种异常与尝试将一个值作为过程应用时得到的异常相同。

(with-handlers ((exn:fail? print))
  (10 11))

(exn:fail:contract "应用程序:不是一个过程;\n期望可以应用于参数的过程\n给定:10\n参数...:\n 11" #)

有没有办法在使用hash-ref时从外部更改failure-result的默认值? 我能否进入我的Racket安装并在那里更改它? 这似乎很糟糕和危险。 我有哪些选项? 我可以解析异常消息,但这看起来很hacky且容易出错。


你无法传递不同的“失败结果”吗? - stchang
1
我并不直接调用哈希引用,而是调用调用它的代码。 - Matt G
1
好的,我会针对调用hash-ref的代码提交一个错误报告。 - stchang
4
我认为默认值应该是通用的。但这就是为什么hash-ref允许程序员提供不同的failure-result的原因。您在看Racket中的特定库吗? - stchang
1
好的。我之所以看那里是为了猜测stchang对你的问题的答案:你调用了哪个函数,该函数又调用了hash-ref?因为实际上,这似乎是一个情况,_那个_函数并不希望hash-ref失败——而_那就是_需要更改的地方。否则,我认为你无法像你想象的那样对hash-ref进行monkey-patch。这只留下了exn msg parse hack idea的选项。 - Greg Hendershott
显示剩余3条评论
1个回答

1

hash-ref中有failure-result

(define a-hash #hash((1 . "a")
                     (2 . "b")))
(hash-ref a-hash 3 #f) ; => #f

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接