Clojure:是否有占位符表达式/函数?

3
我使用condp表单并在其文档中注意到: 如果没有提供默认表达式并且没有匹配的子句,则会抛出IllegalArgumentException。 我不需要处理非匹配项,也不想用try表单包围condp。我考虑在那里放一个占位符。最快最简单的Clojure占位符形式是什么? 编辑: 感谢每个人的意见,非常有帮助!此行为的用例是,在用户触发的强制数据恢复任务中,我的应用程序需要动态解析Clojure代码以从日志文件中恢复数据。损坏的数据(非匹配项)将被忽略,而如果使用cond编写相同的表单,需要更多的按键。

1
我越想越觉得aib说得有道理...这是一个非常棘手的问题。在澄清并解决aib的担忧之前,不要轻易点踩反对。这可能会非常误导人。 - Richard Sitze
1
只是为了明确 - 如果副作用在发挥作用,虽然这可能是“不好的形式” - 但它并不像给出一个可能被(他人)断章取义的答案那样糟糕。它只需要被承认,以便完全理解正在处理的内容。 - Richard Sitze
谢谢Richard。使用场景是在强制数据恢复任务中解析Clojure中的动态代码,并忽略损坏/不正确的数据。 - user972946
3个回答

4
如果您不需要处理非匹配情况(即您可以保证始终存在匹配项),则无需在那里放置任何占位符。
如果您的假设总是有匹配项,结果证明是错误的,那么您将得到一个IllegalArgumentException - 但这是一件好事,因为它会立即告诉您代码中存在逻辑错误。这是快速失败原则的良好体现。

2

您可以说:

(condp = option
  :foo 1
  :bar 2
  3)

1
简短回答:使用nil
但是你不需要默认值的原因是你确定至少有一个谓词将成立,对吧?你不是依赖副作用,对吧?

1
我有点喜欢你的编辑...它真的很专注于重点:a)强烈建议测试覆盖所有情况,b)使用nil - 尽管如果你覆盖了所有情况这是不必要的,c)不要使用副作用。 - Richard Sitze
1
好的,又回滚了。我想我还没有完全清醒 :)。 - aib
谢谢。使用场景是在数据恢复任务中解析Clojure中的动态代码并忽略损坏/不正确的数据。 - user972946

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