【问题标题】:Has anyone a case implementation for clojurescript?有人有clojurescript的案例实现吗?
【发布时间】:2012-02-26 12:34:55
【问题描述】:

我需要一个 case 宏的实现。无法使用原始的 clojure 实现,因为它在内部使用了 Java case 语句。

http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/case

案例宏

用法:(case e &从句)

我可以尝试自己构建一个宏,但这都是clojure。也许甚至有一种方法可以使用真正的 js 功能。

有没有人为此提供函数或宏?

【问题讨论】:

  • #clojure 的 bsteuber 建议如下:(defmacro case [& args] `(condp = ~@args)) 或简单地使用 condp。这当然没问题,但我想也许有人可以帮助构建一个更多的 js 原生版本。
  • 这以微妙的方式破坏了交叉兼容性,我不建议这样做 - 例如,考虑(case 'x x 1 y 2)。要么手动使用condp,要么使case 在语义上等同于Clojure 版本。

标签: javascript clojure clojurescript


【解决方案1】:

更新: 案例已被添加到 ClojureScript。虽然我们不能提供性能保证,但可移植性的好处更为重要。

case 涉及在 JavaScript 中不可能实现的保证 - 文字上的恒定时间分派。以下是否有任何原因对您不起作用?

(condp = x
   ...)

【讨论】:

  • 你好大卫,谢谢你的回答。对于我的问题(简单的字符调度) condp 工作正常,我对解决方案感到高兴。但我认为有人有一个可能集成到 cljs 的实现。就我个人而言,我不会将持续调度视为关键功能,但人们肯定会使用案例,希望获得性能优势。似乎有些浏览器甚至提供了 goo.gl/4UxKs 和 cljs 可能会从中受益。我担心 seqs 可能是个问题,但 cljs 可以打印警告并使用一些后备 impl。我担心这个讨论应该在 ml 上继续。
  • case 被添加到 Clojure 是出于性能原因,而不是语义原因 - 否则 condp = 就足够了并且是惯用的。此外,据我所知,V8 和 JavaScriptCore 都没有使 switch/case 表达式比一系列 if/else if 表达式更有效。
  • 非常感谢您的更新。很高兴看到便携性变得更加重要,因为这对我来说确实是一个痛点。我首先在 clojure 中编写应用程序,然后是 clojurescript。也许我现在可以再试一次 clojurescript 并重新评估我遇到的问题。
猜你喜欢
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多