タグ付けされた質問 「clojure」

Clojureは、関数型プログラミングスタイルを奨励し、マルチスレッドプログラミングを簡素化する対話型開発をサポートする汎用言語です。

4
Rich Hickeyは、「[インターフェイス/クラス/タイプ]のすべての特異性があなたの再利用を殺します!」と言ったとき、何を意味しましたか?
Rich Hickeyの思考を刺激するgoto会議の基調講演「価値の価値」で29分間、彼はJavaのような言語のオーバーヘッドについて話し、「これらのインターフェースはすべて再利用を殺します」のような声明を出します。彼はどういう意味ですか?本当? 私は答えを探して、次のことを見つけました。 最小知識の原則別名、気密APIインターフェイスを奨励するデメテルの法則。ウィキペディアには、いくつかの欠点もリストされています。 再利用ではなく、その使用が適切な目標であると主張するケヴリン・ヘニーのインペリアル衣料危機。 ジャック・ディーデリッヒの「クラスを書くのをやめなさい」は、一般的なオーバーエンジニアリングに反対する議論をしています。 明らかに、不適切に書かれたものは何も役に立たないでしょう。しかし、適切に作成されたAPIのインターフェースは、そのコードの使用をどのように防ぐのでしょうか?1つの目的のために作られたものが他のものにより多く使用されている歴史の中に例があります。しかし、ソフトウェアの世界では、意図していない目的で何かを使用すると、通常は壊れます。 私は、いくつかのコードの正当であるが意図しない使用を防ぐ良いインターフェースの良い例を探しています。それは存在しますか?想像できません。

3
Clojureの素晴らしいところは何ですか?[閉まっている]
私は最近Clojureを見ていて、Stackoverflowのこの投稿に出くわしました。これは、ベストプラクティスに従っているいくつかのプロジェクトと、全体的に優れたClojureコードを示しています。いくつかの基本的なチュートリアルを読んだ後、私は言語を理解したかったので、いくつかの「現実の」プロジェクトを見てみました。 見た後ClojureScriptとCompojure Clojureのは冗談であるように(前述の2つの「良い」プロジェクト)、私は感じています。誰かが私はClojureのは、使用するのに対し、ピックアップすることを愛し、きれいな構文を持っており、非常に簡単であることを、たとえば、RubyやPythonの上で二つの言語をClojureのを選ぶだろう、なぜ私は理解していないので、多くのそれはのための読みやすさを台無しにすることをどこでも括弧や記号を私。 RubyとPythonは美しく、読みやすく、エレガントだと思います。言語を完全に知らない人でも読みやすいです。しかし、Clojureは私には不透明であり、コードを理解するためには、言語の実装に関するあらゆる詳細を知る必要があると感じています。 だから、私を啓発してください! Clojureの優れている点は何ですか? 言語を理解するために私が知っておくべき絶対的な最低限は何ですか?
40 clojure 

6
「関数とデータ間の密結合」が悪いのはなぜですか?
この引用は、「Clojureの喜び」のp。32、しかし誰かが先週の夕食で私に同じことを言って、私はそれを他の場所でも聞いた: [A]オブジェクト指向プログラミングの欠点は、関数とデータの間の密結合です。 アプリケーションで不要な結合が悪い理由を理解しています。また、オブジェクト指向プログラミングであっても、可変状態と継承を避けるべきだと言っています。しかし、なぜクラスに関数を貼り付けるのが本質的に悪いのかはわかりません。 つまり、クラスに関数を追加すると、Gmailでメールにタグを付けたり、ファイルをフォルダーに貼り付けたりするように思えます。それはあなたが再びそれを見つけるのを助ける組織的なテクニックです。いくつかの基準を選択してから、同じようなものをまとめます。OOP以前は、プログラムはファイル内のメソッドのかなり大きな袋でした。つまり、関数をどこかに配置する必要があります。整理してみませんか? これが型に対するベール攻撃である場合、関数への入力および出力の型を制限することは間違っていると言うだけではありませんか?それに同意できるかどうかはわかりませんが、少なくともプロとコンタイプの安全性に関する議論には精通しています。これは、ほとんど別の懸念のように思えます。 確かに、時々それを間違え、機能を間違ったクラスに置きます。しかし、他の間違いと比較すると、これは非常に小さな不便さのようです。 そのため、Clojureには名前空間があります。OOPのクラスに関数を貼り付けることは、Clojureの名前空間に関数を貼り付けることとどのように異なりますか?クラスの関数は、必ずしもそのクラスのメンバーだけで動作するとは限らないことを忘れないでください。java.lang.StringBuilderを見てください。これは、すべての参照型で動作するか、オートボクシングを通じて、すべての型で動作します。 PSこの引用は、私が読んだことのない本を参照しています:Multiparadigm Programming in Leda:Timothy Budd、1995。

7
C#Dev-Lispを試しましたが、うまくいきません[非公開]
CLと少しのClojureの両方についてLispを学び、遊んだ数ヶ月後、C#の代わりにLispで何かを書く説得力のある理由がまだ見当たりません。 いくつかの説得力のある理由、または誰かが私が本当に大きなものを見逃していることを指摘してほしい。 Lispの長所(私の研究による): コンパクトで表現力豊かな表記法-C#よりも、そうです...しかし、私はそれらのアイデアをC#でも表現できるようです。 関数型プログラミングの暗黙的なサポート-LINQ拡張メソッドを使用したC#: mapcar = .Select(lambda) mapcan = .Select(lambda).Aggregate((a、b)=> a.Union(b)) car / first = .First() cdr / rest = .Skip(1)....など ラムダおよび高階関数のサポート-C#にはこれがあり、構文は間違いなく簡単です。 「(lambda(x)(body))」対「x =>(body)」 Clojureでは、「#(」と「%」、「%1」、「%2」が適切です オブジェクトから分離されたメソッドディスパッチ-C#には拡張メソッドを介してこれがあります マルチメソッドディスパッチ-C#にはこれがネイティブにありませんが、数時間で関数呼び出しとして実装できます。 コードはデータ(およびマクロ)-マクロを「取得」していないかもしれませんが、マクロの概念を関数として実装できない単一の例を見たことはありません。「言語」は変更されませんが、それが強さかどうかはわかりません DSL-関数合成を介してのみ行うことができます...しかしそれは動作します 型なしの「探索的」プログラミング-構造体/クラスの場合、C#の自動プロパティと「オブジェクト」は非常にうまく機能します。 Windows以外のハードウェアで実行します-そうですか?大学以外では、自宅でWindowsを実行していない人、または* nix / Macで少なくともWindowsのVMを実行している人は1人しか知りませんでした。(もう一度、多分これは思ったよりも重要で、洗脳されたばかりです...) ボトムアップ設計のためのREPL-わかりました、これは本当にすてきで、C#では見逃しています。 Lispに欠けているもの(C#、. NET、Visual Studio、Resharperが混在しているため): 名前空間。静的メソッドであっても、コンテキストを分類するために「クラス」に結び付けるのが好きです(Clojureはこれを持っているようですが、CLはそうではないようです)。 優れたコンパイルおよび設計時サポート 型システムにより、渡すデータ構造の「正確さ」を判断できます つづりの間違いはリアルタイムで下線が引かれます。ランタイムまで知る必要はありません コードの改善(命令的なアプローチの代わりにFPアプローチを使用するなど)が自動的に提案されます GUI開発ツール:WinFormsおよびWPF(ClojureがJava GUIライブラリにアクセスできることは知っていますが、それらは私にとってまったく異質なものです。) GUIデバッグツール:ブレークポイント、ステップイン、ステップオーバー、値インスペクター(テキスト、xml、カスタム)、ウォッチ、スレッドごとのデバッグ、条件付きブレークポイント、任意のレベルのコードにジャンプできるコールスタックウィンドウスタック内 (公平を期すために、Emacs + Slimeでの私の仕事はこれの一部を提供しているように見えましたが、VS …
37 clojure  lisp 

7
命令的なbreakステートメントと他のループチェックの機能的に同等なものは何ですか?
私が以下のロジックを持っているとしましょう。関数型プログラミングでそれを書く方法は? public int doSomeCalc(int[] array) { int answer = 0; if(array!=null) { for(int e: array) { answer += e; if(answer == 10) break; if(answer == 150) answer += 100; } } return answer; } ほとんどのブログ、記事の例では、単純な数学関数「Sum」の単純な例を説明しています。しかし、私は上記のようなJavaで書かれたロジックを持っているので、それをClojureの機能コードに移行したいと思っています。FPで上記を実行できない場合、FPのプロモーションの種類はこれを明示しません。 上記のコードは完全に必須であることを知っています。将来的にFPに移行するという先入観に基づいて書かれたものではありません。

4
JVMがテールコールの最適化に課す制限
Clojureは、単独で末尾呼び出しの最適化を実行しません。末尾再帰関数があり、それを最適化する場合は、特別な形式を使用する必要がありますrecur。同様に、相互に再帰的な関数が2つある場合、を使用してのみ最適化できますtrampoline。 Scalaコンパイラは、再帰関数に対してTCOを実行できますが、2つの相互再帰関数に対してはできません。 これらの制限について読んだときはいつでも、JVMモデルに固有の制限に常に起因していました。コンパイラについてはほとんど何も知りませんが、これは少し困惑します。から例を見てみましょうProgramming Scala。ここで機能 def approximate(guess: Double): Double = if (isGoodEnough(guess)) guess else approximate(improve(guess)) に翻訳されています 0: aload_0 1: astore_3 2: aload_0 3: dload_1 4: invokevirtual #24; //Method isGoodEnough:(D)Z 7: ifeq 10: dload_1 11: dreturn 12: aload_0 13: dload_1 14: invokevirtual #27; //Method improve:(D)D 17: dstore_1 18: goto 2 そのため、バイトコードレベルでは、が必要gotoです。この場合、実際には、ハードワークはコンパイラーによって行われます。 基礎となる仮想マシンのどの機能により、コンパイラはTCOをより簡単に処理できますか? …
36 scala  clojure  jvm  tail-call 

13
人気のない言語を使用した開発の問題(メンテナンスなど)
私は私のチームでclojure(lisp)のみを使用してアプリケーションを開発しています。小さなアプリケーションとして起動します。問題ない。しかし、機能を備えてエリアを拡張しているため、重要なプログラムになりつつあります。 メンテナンスなどが心配でした。私のチームの誰もclojureやlispを知らず、それらのような言語にも興味がありません。 だから、人気のない言語でプログラミングをするのは間違っていませんか?(自分の楽しみのために?)もっと人気のある言語を使うべきですか?(少なくともpythonなど) チームを辞めるかどうかはわかりますが、辞めるとは言いません。:)-誰もそれを維持しません。このプログラムは破棄され、一部は他の言語で開発されます。 clojureでの開発はとても楽しんでいますが、これは私のチームには向かないかもしれないと思いました。 これについてどう思う?人気のない言語を愛する多くのプログラマーは、同様の問題を懸念していると思います。

3
啓発への道:Scheme、Common Lisp、Clojure?[閉まっている]
私よりも賢い人の多くは、あなたがLispを学ぶとき、それをあなたが「得る」ので、あなたをより良いプログラマにすることについて書き続けます。 あなたの人生を変えるLisp(s)について聞いたのは、初心者にとっては大きな実用的な冗談だけかもしれませんが、スナイプや何かの後に送られてきたことがわかっても、世界についてもっと知ることに害はないと思います。 私はSICPの本、またはANSI Common Lispをフォローしたいのですが、同時に、個人的なプロジェクトで使用できる方言と実装を勉強しています。 SICPはSchemeに焦点を当てているため、これは1つの大きな投票です。ポール・グラハムは、初心者に教えるなら、Schemeでそれをやると言ったが、SchemeはまだCommon Lispより劣っているようだ。しかし、Clojureがあります。これは方法が限られていると言われていますが、他のもの(JVMライブラリ)ではより実用的です。 Schemeのマテリアルを簡単に使いこなしたり、CLから「本物の」啓発を達成したり、Clojureに十分に近づいて、長期的にはより多くのことができるように思えます。 そのすべてが真実ですか?何について学ぶべきか考えることをやめ、ただそれについて学びに行くべきですか?

5
Lispコミュニティが関数の最後にすべての括弧を蓄積することを好むのはなぜですか?
Lispコミュニティが関数の最後にすべての括弧を蓄積することを好む理由: (defn defer-expensive [cheap expensive] (if-let [good-enough (force cheap)] good-enough (force expensive))) CやJavaのような規則を採用しないのはなぜですか? わかりました、Lispはそれらの言語よりはるかに古いですが、私は現代のLispersについて話しています。 (defn defer-expensive [cheap expensive] (if-let [good-enough (force cheap)] good-enough (force expensive) ) ) 注:コードスニペットは、「The Joy of Clojure」という本からのものです。

1
Clojureデスクトップアプリの出荷は現実的ですか?
現在、デスクトップJavaアプリケーションを出荷しています。これは単純な古いJava 5 Java / Swingアプリであり、これまでのところすべてがうまく機能しました。一部のユーザーは、Java 6を使用しないOS Xバージョン/コンピューターを使用していたため、Java 5がターゲットになりました(この制限をすぐに解除し、新しいJavaに切り替えて、Java 5で動かなくなったユーザーを単に放棄する可能性があります)。 私はClojureにすぐに慣れていますが、まだClojure-to-JavaおよびJava-to-Clojureの多くを実際に実行していないため、Javaアプリケーションの代わりにClojureデスクトップアプリケーションを出荷するのが現実的かどうか疑問に思いました? 私が出荷しているアプリケーションは現在、すべての.jarで約12 MBであるため、Clojureを追加してもそれほど大きな問題にはなりません。 私の計画は、ClojureがJava APIを呼び出すようにすることです。私のアプリケーションはすでにいくつかの独立したjarに分割されています。 ClojureをJavaから正しく呼び出すことがClojureからJavaコードを呼び出すよりも難しいことを理解しているので、基本的にすべてのUIを書き換えます(UIの一部、Swingコンポーネントと自作のBufferedImagesの混合は、上昇のためにとにかく書き換える必要があります)網膜ディスプレイの)、およびClojureからのすべての「配線」を行います。 それが私が直面している問題です。Clojureデスクトップアプリを出荷するのは現実的ですか?(確かにそれほど普及しているようには見えませんが、プレーンなJavaデスクトップアプリを出荷することはそれほど一般的ではなく、私はとにかくやっています) 技術的には、何をする必要がありますか?(Javaアプリの出荷と比較して)



3
Clojureには継続/コルーチン/などがありますか?
私はPythonでプログラミングを始めましたが、コルーチンやクロージャーなどの概念に本当に戸惑っていました。 今、私はそれらを表面的なレベルで知っていると思いますが、その「啓発」の瞬間を一度も感じたことがないので、Clojureを学ぶことにしました。私はスチュアート・ハロウェイの本を買ったが、それは良いが、インデックスを見ると、コルーチンや継続のような言葉はなかった。私はそれらをグーグルで検索しましたが、何もありません。 だから、私の質問は: Clojureには、スタックオーバーフローなしでピンポンのようなタスクを実行するための継続またはコルーチンがありますか? Pythonの例(標準のPythonは、この対称コルーチンの完全な機能を備えたバージョンをサポートしていません): def ping(): while 1: print "ping" function to switching to pong def pong(): while 1: function to switching to ping print "pong"

6
コメント作成とドキュメントのベストプラクティス
この質問はして移行され、それがソフトウェア工学スタック所に答えることができるので、スタックオーバーフローから。 7年前に移行され ました。 最近のコメントはこれまで以上に簡単です。Javaには、コメントをクラスにリンクするための優れた手法がいくつかあり、Java IDEはコメントシェルの作成に適しています。Clojureなどの言語では、関数のコード自体に関数の説明を引数として追加することもできます。 しかし、私たちは今でも良い開発者によって書かれた時代遅れのコメントや劣悪なコメントが頻繁にある時代に生きています。 特にここではJava / Clojure / Pythonに興味がありますが、回答は言語固有である必要はありません。 コメントを検証し、「薄っぺらな」コメント(マジックナンバー、不完全な文などのコメントなど)または不正なコメント(スペルミスなどの検出など)を自動的に検出する新しい手法はありますか。 そしてもっと重要なことは、「コメント政策」や戦略が受け入れられているということですか?コーディング方法に関するアドバイスはたくさんありますが、「コメントの方法」についてはどうでしょうか。

4
「クラスの代わりにマップを使用してデータを表現する」-リッチヒッキー
でリッチヒッキーことで、このビデオ、Clojureの作成者、彼はJavaで行ったように、代わりにそれを表現するためにクラスを使用してのデータを表現するためにマップを使用することを助言します。単にマップとして表されている場合、APIユーザーはどのように入力キーを知ることができるのか、私はそれがどのように改善できるのか理解していません。 例: PersonAPI { Person addPerson(Person obj); Map<String, Object> addPerson(Map<String, Object> personMap); } 2番目の関数では、APIユーザーはどのようにして人を作成するための入力を知ることができますか?
19 java  design  class  clojure  map 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.