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 GUI駆動のアプローチには部分的です)
私はLispを取り巻く誇大広告が本当に好きで、それにチャンスを与えました。
しかし、Lispでできること、C#ではできないことはありますか?C#ではもう少し冗長かもしれませんが、オートコンプリートもあります。
私は何が欠けていますか?Clojure / CLを使用する理由は何ですか?
AND
かOR
、または関数として見たいのか。それは行うことができます(LAMBDA
これはマクロでもあります)が、完全に吸うわけではない明白な方法はわかりません。