2012-02-26 10 views
2

私はcaseマクロの実装が必要です。内部的にJavaのcase文を使用しているため、元のclojureの実装は使用できません。誰かがクローージャースクリプトのケース実装をしていますか?

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

場合、マクロ

使用法:(ケースE &節)

私は自分でマクロを構築しようとすることができますが、それはすべてのClojureのだろう。実際のjs機能を使用する方法さえあるかもしれません。

誰にもそのための関数またはマクロがありますか?

+0

bsteuberには、次の提案: '(defmacroの場合[&引数] \'(condp =〜引数@)) 'または単にcondpを使用しています。これは確かに大丈夫ですが、おそらく誰かがより多くのjsネイティブバージョンを構築するのに役立つと思っています。 –

+1

これは微妙な方法で相互互換性が壊れているので、私はこれをお勧めしません。たとえば '(case 'x x 1 y 2)'を考えてみましょう。手作業で 'condp'を使うか、Clojureバージョンと意味的に同等な' case'を作ります。 – amalloy

答えて

5

更新日:ケースがClojureScriptに追加されました。パフォーマンスの保証はできませんが、移植性のメリットはより重要です。

ケースでは、JavaScriptでは不可能な保証が含まれています(リテラルの定数時間ディスパッチ)。次のような理由がありますか? #clojureから

(condp = x 
    ...) 
+0

こんにちはDavid、 あなたの答えはthxです。私の問題(単純なcharディスパッチ)のために、condpはうまく動作し、私は解決策について嬉しいです。 しかし、誰かがおそらくcljsに統合できる実装を持っていると思いました。 個人的には、常時ディスパッチはクリティカルな機能だとは思っていませんが、パフォーマンスのメリットを得るためには、人々は確かにケースを使用しています。 ブラウザによっては、http://goo.gl/4UxKsとcljsがその恩恵を受ける可能性があることを示すブラウザもあるようです。 私はseqsが問題になるかもしれないと心配しますが、cljsは警告を出力して、いくつかのfall back implを使用します。 私はこの議論がmlで続行されるべきであると懸念しています。 –

+0

ケースがパフォーマンス上の理由でClojureに追加されました。セマンティックなものではありません。そうでなければ、condp =十分で慣用的です。また、V8もJavaScriptCoreもswitch/case式をif/else if式の一連の式より効率的にすることはできません。 – dnolen

+0

アップデートに感謝します。これは本当に私にとって苦労していたので、移植性がより重要になります。私は最初にclojureでappを書いていました。たぶん私は別の試しにclojurescriptを与えることができ、私が持っていた問題を再評価することができます。 –

関連する問題