F#にインタラクティブモードがあり、C#がないのはなぜですか?


32

F#は、対話型REPLですぐに使用できます。C#には何もありません。実際、完全なプロジェクトをセットアップせずに遊ぶのは少し難しいです(ただし、LINQpadは機能しますが、PowerShell経由でも実行できます)。

F#で対話型コンソールを使用できるようにするが、C#で実装するのが困難になる言語について根本的に異なるものはありますか?


何年も後に人々はまだこの質問に来ているので、私は今多くの選択肢があることに注意すべきです。PowerShell(最新のすべてのWindowsマシンにプリインストールされている)を使用して、.Netフレームワークで遊ぶことができます。または、LINQpadを使用して、任意のc#コードのプロトタイプを作成できます。それとも、使用することができますScriptCsをかあなたのようなオンラインjsfiddle型環境を使用することができますComplify.netまたはJsilを。たくさんのオプション。


4
C#に REPLがあります。イミディエイトウィンドウと呼ばれ、かなり前から使用できます。新しい言語機能がサポートされていないため、C#3.0以降に顕著になっているものもありますが、それでも本格的なREPLです。
アロングラネネク


私は2012年頃プロジェクトロザリンデモリリースはVS2010のためにそれでREPLを持っていた覚えている
ジェームズ

@DanielHakimi:このコメントのおかげで、これがVS2015に含まれているという手がかりがありませんでした。デバッグ中にイミディエイトウィンドウを使用できると思っただけです。VS2015には、[表示]-> [他のウィンドウ]-> [C#Interactive]からアクセスできるC#Interactiveツールウィンドウが含まれています。これは、デバッグ環境から分離された完全なRoslynベースのREPLのようです。
ルー

回答:


56

F#で対話型コンソールを使用できるようにするが、C#で実装するのが困難になる言語について根本的に異なるものはありますか?

はい。

F#はMLプログラミング言語の子孫であり、LispやSchemeなどの言語の影響を強く受けています。これらの言語は、3つの優れたプロパティを持つように初日から設計されました。

まず、これらの言語には、C#で考えているようなステートメントが実際にはありません。むしろ、ほとんどすべてがvalueを持つ式であるため、ほとんどすべての状況で値を評価して印刷するメカニズムが理にかなっています。

第二に、これらの言語は副作用を伴うプログラミングを妨げるため、グローバルな状態を台無しにすることを心配せずに評価を行うことができます。

第三に、これらの言語で行う作業のほとんどは「トップレベル」です。通常、「クラス」や「名前空間」などのコンテキストを囲むことはありません。

対照的に、C#は、副作用を引き起こすステートメントを使用したプログラミング制御フローを強調しており、これらのステートメントは常に名前空間、クラス、メソッドなどの複数のネストされたコンテナーにあります。

したがって、これらはすべて、C#がREPLを持つのを難しくするものですが、確かに不可能ではありませ。通常のコンテキストの外にあるステートメントや式のセマンティクスが何であるか、名前バインディングを変更する突然変異のセマンティクスが何であるかなどを把握する必要があります。

F#にインタラクティブモードがあり、C#がないのはなぜですか?

F#チームは、REPLループを作成することが優先順位1のシナリオであると判断したためです。C#チームはこれまでそうしていませんでした。機能は、予算に収まる最も優先度の高い機能でない限り、実装されません。これまで、C#REPLはリストのトップにはいませんでした。

RoslynプロジェクトにはC#REPLがあります(最終的にはVB REPLもありますが、まだ準備ができていません。)プレビューリリースをダウンロードして、気に入った方法を確認できます。

http://www.microsoft.com/en-us/download/details.aspx?id=27746


7
Pythonには優れたREPLがあり、ステートメント、副作用、名前空間があります。また、Javascript、Bashなども同様です。基準に違反する多くの言語ではREPLが適切に機能します。
ライライアン

2
エリック、おかえりなさい!私たちはあなたからより多くの答えを見ることを願っています。
SolutionYogi

16
@LieRyanあなたは全体のポイントを逃したと思います。インタラクティブREPLループの唯一の「基準」は、誰かが座ってそれを書いたことです。F#では優先度が高く、比較的簡単でした。C#では優先度が低く、比較的難しかったため、F#は早い段階で入手できましたが、C#はそうではありませんでした。
KutuluMike

面白い。VS2010(4つのC#、4つのVB.NET、2つのJ#、2つのC ++ / CLIを数える)の前に.NETフレームワーク用の非常に多くのコンパイラを構築した経験が、新しいコンパイラが新しい.NET言語が構築されました。これは、将来のすべての.NETコンパイラとコンパイラリビジョンを開発する方向性のように思える、コンパイラとしてのサービスシナリオを有効にする方法について多くの考えを持つRoslyn風のスタイルで構築されたと確信しています。私にとっては、F#が生まれた時代は、コンパイラがどのように書かれたかに必然的に関与していたようです。
アロングラネレク

素晴らしい答え。PythonとC#について:{}構文言語はREPLに対してうまく曲がりません。インデントベースの言語はここで大きな進歩を遂げています。インデント構文は{}構文よりも優れていると思います。REPLおよびコードの可読性。したがって、インデントを{}に置き換えるC#メタ構文がない限り、REPLエクスペリエンスは、F#やPythonの場合ほどスムーズにはなりません。
citykid 14年

22

MonoにはC#replがあります:http : //www.mono-project.com/CsharpRepl

さらに、グラフィックオブジェクトを直接操作したり、Gtk#ウィジェットを作成したりできるGUIバージョンもあります。

ここに画像の説明を入力してください


確かに、それは間違いなく可能ですが、C#を難しくしているものはありますか?
ジョージマウアー

2

それはほとんど歴史的なものだと思います。REPL環境は常に関数型言語に関連付けられており、MLファミリー言語が含まれており、F#はその伝統に忠実です。インタラクティブな環境は、機能的なバックグラウンドから来たユーザーが当たり前だと思うものであることに留意してください。そのような機能の欠如は、VSおよび(ひいては)F#に不利になります。

一方、OOPコミュニティではこのような機能は一般的ではありません。

ただし、C、Java、C#など、多くの非機能言語で利用可能なREPLがあります。また、本格的なREPLとはかけ離れていますが、VSのAutos機能は、C#で確実に実行可能であることを示しています。


1
これは私が見た中でもっともらしい説明です。最初は、FortranとLispがあり、Lispにはreplがありました。Lispが生まれた...まあ、あなたはアイデアを得る。Lisp系統言語にはreplがあり、Fortran系統にはありませんでした。
アーロン

@Aaron LISPは1959年ですが、REPLは1973年のLISPマシンに起因しています。その頃には、すでに多くの言語が存在していました。特にPASCALとSmalltalk。
スプレーグ

1

C#は主にオブジェクト指向だと思います。最も単純なコードを記述する場合でも、複数のクラスに分割する必要があります。REPLを使用するには、大量のコードを記述する必要があります。

主に機能するF#にはこの問題はなく、簡単な方法で複雑なコードを簡単に記述し、後でオブジェクトに変換できます。

多くの行にまたがるクラスを作成するよりも、1行の関数を作成する方が簡単です。


1
REPLステートメントの外部ファイルで定義された関数/クラスの使用を妨げるものは何もありません。OOPがより冗長であるという事実は、REPL機能自体を妨げるものではありません。
scrwtp

1
Pythonは非常にオブジェクト指向であり、構文的に重要な改行を特徴としており、まともなREPLがあります。静的に型付けされ、コンパイルされ、むしろオブジェクト指向であるScalaには、REPLがあります。REPLは、既存のクラスのインポートやいくつかのメソッドの呼び出しなどの短い作業に最も役立ちます。言語の冗長性は問題ではありません。たとえば、SQLは非常に冗長ですが、すべてのSQLデータベースにはREPL(「クエリツール」)が付属しています。
9000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.