6

LispおよびClojureプログラマーは、REPLで直接プログラムを開発することが多いようです。cf. Clojure開発:IDEまたはREPL?

私の質問は、なぜこのアプローチがRubyでより一般的ではないのかということirbです。これは単なる文化的な違いですか、それともREPL中心の開発がRubyやPythonなどの言語よりもLispで一般的であるという構造的(言語固有の)理由がありますか?

4

8 に答える 8

8

Lisp構文は、REPLとソースファイルを組み合わせたアプローチに非常に適しているようです。各フォームのテキストの制限が明確な場合、プログラムでコードスニペットを移動する方がはるかに簡単です。

于 2011-02-02T23:47:27.803 に答える
2

私はClojureとRubyにEmacsを使用しており、多くの場合、rubyモジュールをirbにロードし、REPLと同じようにemacsでインタラクティブに再生します。

于 2011-02-02T21:21:17.863 に答える
1

実際、それ私のRuby開発の方法です。

通常、私は自分のコードを書き、それからその一部をirbに貼り付け、それらを適合させ、再度貼り付けます。

Lispsには、プログラムでREPLスタイルで開発した「現在の状態」を印刷する方法はありませんか?それはルビーでは不可能だと思います。

于 2011-02-02T21:30:15.413 に答える
1

これの多くは、Rubyistが使用する傾向のあるエディターによるものだと思います。私はvimを使用していますが、REPLと対話するための優れた方法はありません。Textmateは同じボート(AFAIK)にいます。一方、Emacs、Dr Racketなどはすべて、REPLと対話するための素晴らしいメカニズムを備えています。Lispersはこれらのタイプのエディター/環境を使用する傾向があると思います。

于 2011-02-02T23:32:09.827 に答える
1

多分これらは役立つでしょう:

  • Interactive_editorは、vim、emacs、MacVim、nano、TextMateを開き、irbバッファーの編集を行う機能を追加するIRB拡張機能です。
  • irbtoolsには、interactive_editorとその他の優れた追加機能が含まれています。
  • ユーティリティベルトは、その機能を拡張するIRB gemの別のコレクションであり、バッファの編集を可能にするものも含まれています。

私は古い学校なので、通常はエディターを開いて、ターミナルウィンドウでirbを実行しています。古い習慣はあなたが知っているように一生懸命に死にます。私はirbtoolsを使用していますが、ユーティリティベルトに切り替えて、比較してどのように感じるかを確認する予定です。

于 2011-02-03T03:11:30.220 に答える
0

多くの場合、単体テストの実行は、REPLに相当するRubyを介して入力するよりも簡単です。次に、コードにprintfデバッグを追加する必要がある場合があります...

于 2011-02-02T22:00:38.470 に答える
0

私はRubyを17年間使用しており、純粋なIRBを使用するか、RailsアプリにRailsコンソールを使用することで、常にREPLを使用してすべてを支援します。通常、調査/デバッグしたいことの途中でIRBセッションを開きます。多くの場合、実際にはIRBが多くの状況で私にとってメインのデバッガーです。

確かに、RubyでREPLを使用した私の作業では、LISPでの経験全体を思い出せません。おそらく、Lubyでは、CLやSchemeよりも何百倍もインタープリターを開いたり閉じたりします。 emacs内で使用するのではなく、ターミナルから直接使用しますが、これは私の作業環境の利便性のために個人的な選択です)。

Rubyは非常に強力で柔軟性があり、自身を検査できるため、たとえばメソッドの名前を覚えていないが、その一部を覚えているような状況でIRBを使用することは非常に一般的です...メソッドのリストを直接オブジェクト化し、列挙子メソッドを使用して配列をフィルタリングし、必要なものを「選択/検出」してから、適切なメソッドを呼び出し、結果を検査します(my_object.methods.select{|m| m =~ /that_part_of_the_name_i_remember/ }.sort)。

IRBセッションが必要な場所ならどこでも呼び出すことができるbinding.irbので、実行中のテスト内やWebサーバーでのリクエスト処理中に開くかどうかは実際には関係ありません。いつでも簡単に開いて、必要なことを学ぶことができます。そこからのあなたのオブジェクトについて、私はいつもこれをします。

また、RubyにはCLで見られるのと同じ方法で開いているクラスと開いているオブジェクトがあるため、必要な結果が得られるまで、IRBセッション内でメソッドを何度も書き直すことができます。唯一の注意点は、コピーする必要があることです。この新しいバージョンを「手動で」適切な場所に貼り付けます(ただし、Rubyを使用するとmy_obj.method(:that_specific_method).source_location、Gems /ライブラリのメソッドを含めて機能するようなものを呼び出すだけで、Rubyにメソッドが正確に定義されている場所を尋ねることができるため、実際にはこれでも簡単になります。詳細私が誇りに思うことよりも、私はただ電話をかけただけ`emacs #{my_obj.method(:that_specific_method).source_location.join(":")}`でした。

そして、これは個人的なスタイルであるだけでなく、インタプリタもコミュニティにとって非常に重要であるため、開発者は強力で、いつでも利用でき、使いやすいツールを手に入れるために多大な努力を払いました。IRBには常にlibreadlineが付属しており、最近でははるかに強力なエディターを受け取りましたが、その中の編集はCLやScheme REPLSよりも常にはるかに簡単でした(LISPを学ぶ何年も前にRubyを学んだので、最初にCLとSchemeを使い始めました直接REPL私はいつも彼らが実際に恐ろしいと感じていました。通訳が同じように使われるように作られていないという考えに慣れるまで、そしてSlimeとGeiserに慣れるまでに多くの時間がかかりました;SBCLを開くコマンドラインで、少なくとも基本的なreadlineがデフォルトでラップされていない-ありがとうrlwrap !!!-最初は非常に奇妙なことでしたが、

(1つのLISP REPLで、使用しないことを選択した行の入力を開始するのがどれほど苛立たしいことかを表現できません。Ctrl-Cを入力して、行を「キャンセル」する代わりに、再起動オプションを表示します。すべてのLISP開発者は、望まない行を入力することは決してない神ですが、私はその1人ではないので、通常は行を再開したいと思います。emacs+ Slimeでも、これにはさらに多くの労力が必要です。行を「Ctrlキーを押しながら」入力するだけではありません)

比較して、IRBがこれやそのREPLよりも優れていると言うことについて話しているのではありませんが、CLまたはScheme REPLがLispersの生活にあるので、これがRuby開発者の生活の大部分であることを示すためです。選択したemacsまたはテキストエディタに埋め込む部分(これを行う人もいれば、行わない人もいます)が、その組み込みエディタは非常に強力になり、今日では、内部にいるときにコードを自動的にインデントします。ブロック、デフォルトで構文が強調表示され、TABを使用してメソッドの名前で自動補完されますが、メソッドの名前全体を入力してもう一度TABに到達すると、そのメソッドのドキュメントが表示されます。 「q」と入力するだけで閉じます。この種の統合により、使用が非常に簡単になり、たとえばSlimeを使用する場合と比較することはめったにありませんが、常に役立ち、新しいツール、新しいライブラリについて学習する多くの探索的作業を促進します。 、あちこちで少し実験してコードを作成するなど。これは、テストを書く習慣と相まって、私の仕事のやり方を左右することがよくあります。テストからIRBを開いてチェックしたり、閉じたりするなど、テストとIRBセッションをクレイジーな方法で組み合わせています。私が大丈夫だと思った時点で、コードを変更してテストを再実行し、続行しました。テストとIRBセッションをクレイジーな方法で組み合わせます。たとえば、テストからIRBを開いて確認し、問題がないと思った時点で閉じ、コードを変更してテストを再実行し、続行します。テストとIRBセッションをクレイジーな方法で組み合わせます。たとえば、テストからIRBを開いて確認し、問題がないと思った時点で閉じ、コードを変更してテストを再実行し、続行します。

私が感じた唯一の経験は、これで私が持っているものを超えて、コーディング、検査、実験の間の障壁がこれよりも低かったSmalltalkとPharoを使用したことでした。

(Obs .:誰かがRubyでSlimeを使用してSwankを作成したことは知っていますが、それを適切に機能させることはできませんでした...しかし、これは誰かがすべての世界で最高のものを持っていることを意味しますよね?)

于 2022-02-04T07:08:05.630 に答える
-1

私はRuby開発者ではありません。しかし、その理由は参照透過性だと思います。

ほとんどの慣用的なClojure関数は、参照透過性に従う純粋関数です。その結果、私は個人的に、独立したスタンドアロンユニットである関数をテストする方がはるかに簡単であり、ユニットテストの目的をいくらか提供していると感じています。非常に評判の良い言語であるClojureは、ほとんどの関数がステートレスであることを好みます。これにより、副作用が発生するコードと、、、などの他のさまざまな代替手段を使用して状態が維持されるコードが明確に区別され、コードvarの大部分がクリーンで、副作用がなく、参照透過性が保たれます。refsagentsatoms

参照透過性でステートレスな関数を中心に構造化されたコードは、Rubyであろうと他のプログラミング言語であろうと、REPLの恩恵を受けるのに自動的に役立つと思います。

ほとんどの実用的な目的では、他の言語によって提供されるCLIも同様に役立ちますがRead, Eval, Print and Loop、LISPの概念は他の言語と同じではありません。どのnon-homoiconic言語にもREADフェーズはなく、テキスト表現または文字列を読み取るだけですが、LISPでは、フェーズは実際には、スローしREADた任意の形式で解析できます。s-expression詳細については、以下の2つの回答を参照してください。

LispはREPLを備えた唯一の言語ですか?

Lispのread-eval-printループはPythonのものとどう違うのですか?

于 2016-08-22T20:54:35.657 に答える