Racket哈希表默认失败结果无效
在Racket中,如果您尝试对密钥进行Racket哈希表默认失败结果无效,racket,Racket,在Racket中,如果您尝试对密钥进行散列ref,则散列不包含,例如 (define a-hash #hash((1 . "a") (2 . "b"))) (hash-ref a-hash 3) 引发了一个exn:fail:contract …\Racket\collects\Racket\private\more方案。rkt:263:2:hash ref:找不到密钥的值 不幸的是,exn:fail:contract的范围太广了。如果尝试将值作为过程应
散列ref
,则散列不包含,例如
(define a-hash #hash((1 . "a")
(2 . "b")))
(hash-ref a-hash 3)
引发了一个exn:fail:contract
…\Racket\collects\Racket\private\more方案。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
的失败结果
的默认值?我可以进入我的球拍安装并在那里更换它吗?这似乎既糟糕又危险。我有什么选择?我可以解析异常消息,但它散发着黑客和容易出错的气味。中有失败结果
您是否无法传入不同的失败结果
?我不是直接调用hash ref,而是调用调用itAh ok的代码。我会针对调用hash ref
的代码提交一个bug。我认为默认值应该是通用值。但这就是为什么hash ref
允许程序员给出不同的失败结果的原因。你在看球拍里的一个特定的图书馆吗?好的。我去那里看的原因是想猜出stchang问你的问题的答案:你在调用什么函数,它反过来调用hash ref
?因为实际上这看起来像是一个函数不希望hash ref
失败的情况——这是需要改变的地方。否则,我不认为你可以像你想象的那样使用monkey-patchhash-ref
。这只剩下exn msg解析黑客想法的选项。
(define a-hash #hash((1 . "a")
(2 . "b")))
(hash-ref a-hash 3 #f) ; => #f