問題タブ [clojure]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
emacs - Emacs Clojureモードのタブインデントが巨大な場合がある
SLIME と swank-clojure で Emacs の Clojure モードを使用しています。インデントに問題があります。ほとんどの場合、インデントは希望どおりに機能します。TAB を押すと、2 つのスペースでインデントされます。しかし、たとえば、プロキシの場合、TAB で得られるインデントは非常に大きく、10 個のスペースがあります。例:
...
上記の actionPerformed などのプロキシ メソッドについても同じことが言えます。
この設定はどこにあり、どうすれば変更できますか? 私の理解では、それは Clojure モードの問題に違いありません。
python - Python のイディオム "if __name__ == '__main__'" に相当する clojure は何ですか?
私は clojure に手を出していますが、この一般的な python イディオムに相当する clojure (および/または Lisp) を特定しようとして少し苦労しています。
慣用句では、Python モジュールの下部には、多くの場合、少しのテスト コードと、コードを実行するステートメントがあります。たとえば、次のようになります。
これは、単純なアドホック テストに役立ちます。通常、このモジュールは と書くことfrom mymodule import MyClass
で使用されますが、この場合_runTests()
は が呼び出されることはありませんが、最後にスニペットがあればpython mymodule.py
、コマンド ラインから直接入力して実行することもできます。
Clojure (および/または一般的な Lisp) に同等のイディオムはありますか? 私は本格的な単体テストライブラリを求めていません(まあ、私はそうですが、この質問ではそうではありません)、特定の状況でのみ実行されるコードをモジュールに含めたいだけです。私が取り組んできたコードを実行する簡単な方法ですが、通常のモジュール/名前空間のようにファイルをインポートできます。
android - Android は動的言語に不利
Android が Dalvik VM で実行されているため、JVM 用の動的言語 (Clojure、Jython、JRuby など) は Dalvik (したがって Android) で良好なパフォーマンスを得るのが難しいと、ある時点で読んだことがあると思います。私の記憶が正しければ、その理由は、動的型付けを実現するために、内部で Java バイトコードをいじるのにかなりの手間がかかり、バイトコードから dalvik への変換ではこれを簡単に検出できないということでした。
では、Android 向けに開発したい場合、動的 JVM 言語を避けるべきでしょうか?
編集:もう少しコンテキストを提供する必要があったと思います。Clojure を使用して Android 向けのアプリを開発することを検討していました。Clojure を使用することを考えていた理由はいくつかあります。
FPを学びたい
私はJavaを学ぶことにあまり興味がありません
Clojure には、非常に興味深い言語概念がいくつかあるようです (たとえば、STM)。
しかし、Clojure で Android 用のアプリを作成しようとすると、容認できないパフォーマンスの問題があることがわかりました。しかし、動的型付けを取得するために必要なバイトコード操作が原因で、動的型付け言語 (Clojure など) に問題があるというブログ投稿を見つけました。だから私は、これが真実かそうでないかの独立した確認を探していました. この特定の問題では、動的に型指定されたすべての JVM 言語を同じものとして扱うことができると仮定するよりも、私はよく知っていたはずです。私はかなり幅広い質問をしたと思うので、人々が私が尋ねていることをよく理解していなくても驚かないでください.
lisp - 関数定義にメタデータを自動的に追加するClojureマクロの作成を手伝ってください
Macro Clubの最初のルールはマクロを使用しないことであると理解しているので、次の質問は、他の何よりもClojureを学習するための演習として意図されています(これは必ずしもマクロの最良の使用ではないことを理解しています)。
(defn)
通常のマクロのラッパーとして機能し、定義された関数にメタデータを追加する単純なマクロを作成したいと思います。だから私はこのようなものが欲しいです:
...次のようなものに拡張します:
原則として、これは私にはそれほど難しいことではないように思われます[args]
が、定義された関数のおよびその他のフォームを正しく解析するための詳細を特定するのに苦労しています。
ボーナスとして、可能であれば、マクロがdefnのすべての異なる形式(つまり、docstring、複数のアリティ定義などの有無にかかわらず)を処理できるようにしたいと思います。clojure-contrib/def
パッケージには役立つと思われるものがいくつかありましたが、それらを使用したサンプルコードを見つけるのは困難でした。
clojure - Clojureでマップ/構造体を永続化する最も簡単な方法は何ですか?
明らかな方法は、Clojure Contrib から JDBC サポートをロードし、マップ/構造体をテーブルに変換する関数を作成することです。これの欠点の 1 つは、あまり柔軟性がないことです。構造を変更すると、DDL の変更が必要になります。これは、DDL 生成を記述する (難しい) か、手動で移行をコーディングする (退屈) ことを意味します。
どのような代替案が存在しますか? 回答は ACID である必要があり、ファイルへのシリアル化などを除外します。
python - テールコールの最適化を実装するために、jvm は何を犠牲にする必要がありますか?
テールコールの最適化がないという制限 (clojure 実装ではなく jvm の制限) を除けば、clojure 実装は優れていると人々は言います。
http://lambda-the-ultimate.org/node/2547
TCO を Python に実装すると犠牲になると言われてきました
- スタック トレース ダンプ、および
- デバッグの規則性。
テールコール最適化の重要性と、Python がそれを必要とする理由を説明してください
TCO の jvm 実装のために同じ犠牲を払わなければならないでしょうか? 他に何かを犠牲にする必要がありますか?
python - Clojureで2つのシーケンスからの値のペアを処理する
Clojureコミュニティに入ろうとしています。私はPythonで多くの作業を行ってきましたが、私が広く使用している機能の1つは、値のペアを反復処理するためのzip()メソッドです。Clojureで同じことを達成するための(賢くて短い)方法はありますか?
apache - Apache Tomcat で動作する Lisp 方言はありますか?
Lisp のような Web 言語で使用できる Apache Tomcat のようなアプリケーション サーバーはありますか?
最近、Arc/Anarki と Clojure で少し遊んでいます。しかし、私が本当に見逃しているのは、Apache の mod_arc や mod_clojure のようなものです。私が本当に恋しいのは、Lispy Web 言語のための優れた Apache 統合です。
Arc と Clojure はどちらも、コード内で起動する独自の組み込み Web サーバーを使用します。Apache httpd が提供するすべての機能、回復力、およびスケーラビリティが必要です。Arc または Clojure 用の Apache モジュールに取り組んでいる人はいますか? Apache で使用できる Lisp のような言語は他にありますか?
私は PHP と Perl のバックグラウンドを持っています。しかし、C と /bin/sh の経験も豊富です。Web アプリを書き始めたときから、cgi-bin と stdin を C バイナリに使用していました。
multithreading - Clojure 可変ストレージ タイプ
サイトで入手できる API とドキュメントから Clojure を学ぼうとしています。Clojure の変更可能なストレージについては少しよくわかりません。私の理解が正しいことを確認したいと思います。私が間違っているという考えがあれば教えてください。
編集:その正確性についてコメントを受け取ったので、これを更新しています。
免責事項: この情報はすべて非公式であり、間違っている可能性があります。Clojure の仕組みを理解するためにこの記事を使用しないでください。
Varsには常にルート バインディングが含まれ、場合によってはスレッドごとのバインディングも含まれます。これらは命令型言語の通常の変数に相当し、スレッド間で情報を共有するのには適していません。(アーサー・ウルフェルトに感謝)
参照は、単一のトランザクションで任意の数の参照の状態を変更できるアトミック トランザクションをサポートするスレッド間で共有される場所です。トランザクションは同期式 (dosync) の終了時にコミットされ、競合は STM マジック (ロールバック、キュー、待機など) で自動的に解決されます。
エージェントは、独立したアクション関数をディスパッチしてエージェントの状態を変更することにより、最小限のオーバーヘッドでスレッド間で情報を非同期的に共有できるようにする場所です。エージェントはすぐに返されるため、非ブロッキングですが、ディスパッチされた関数が完了するまでエージェントの値は設定されません。
アトムは、スレッド間で同期的に共有できる場所です。異なるスレッド間の安全な操作をサポートします。
これらの構造をいつ使用するかに基づいた私のわかりやすい要約は次のとおりです。
- Var は、命令型言語の通常の古い変数のようなものです。(可能な限り避けてください)
- Atom は Var に似ていますが、即時の読み取りと安全な設定を可能にするスレッド共有の安全性を備えています。(ありがとうマーティン)
- エージェントは Atom に似ていますが、ブロックするのではなく、新しいスレッドを生成してその値を計算し、値の変更中にのみブロックし、割り当てが完了したことを他のスレッドに知らせることができます。
- Ref は、トランザクションで自分自身をロックする共有の場所です。ロックされたコードのすべての部分について競合状態で何が起こるかをプログラマーに決定させる代わりに、トランザクションを開始し、Clojure にそのトランザクション内の参照間のすべてのロック状態を処理させます。
また、関連する概念として function がありますfuture
。私には、将来のオブジェクトは、計算が完了するまで値にまったくアクセスできない同期エージェントとして記述できるように思えます。ノンブロッキング Atom と表現することもできます。これらは正確な未来の概念ですか?
java - 優れたSlimeチュートリアルまたはスクリーンキャストをお勧めします
私のJavaでの冒険は、Clojureを調べるようになり、それからEmacsを(再)発見し、それがSLIMEにつながりました。
私はEmacs自体をかなり適切に処理しており、emacs-starter-kit、clojure-mode / slime / swank、その他の無関係なモードをいくつか持っており、セットアップと実行を微調整しています。
しかし、プログラムの設定とその機能の理解は同じではありません。そこで、Clojureの実験に戻る前に、まずSlimeIDE自体とその機能についてもう少し理解したいと思います。
誰かが私にいくつかの基本的なスライムの使用法を教えてくれるチュートリアル/スクリーンキャストをお勧めできますか?私はすでにSlimeと対話的にClojureを実行することに精通していますが、それがSlimeの唯一の機能であることは確かではありません。
チュートリアルはClojureを含む必要はありませんが、含まれている場合はプラスになりますが、私の関心の主な焦点はSlimeです。したがって、Clojureコードを対話的に実行するだけでなく、Slimeの使用法を強調しない限り、Clojureチュートリアルを投稿しないでください。