90

私は現在、主にDプログラマーであり、ツールボックスに別の言語を追加しようとしています。できれば、D のような静的にコンパイルされた言語では実行できないメタプログラミング ハックをサポートする言語を追加したいと考えています。

私は Lisp について少し読んだことがありますが、Lisp の奇妙な構文などを使わずに、Lisp が行ういくつかのクールなことを可能にする言語を見つけたいと思っています。私は言語の炎上戦争を始めたくありません。また、Ruby と Python の両方にトレードオフがあると確信しているので、私にとって何が重要かをリストします。Ruby、Python、または他の言語のどれが私に最適か教えてください。

重要:

  1. 優れたメタプログラミング。実行時にクラス、メソッド、関数などを作成する機能。できれば、コードとデータの区別を最小限に抑えた Lisp スタイル。
  2. 素晴らしく、クリーンで、健全な構文と、一貫性のある直感的なセマンティクス。基本的によく考え抜かれた、楽しく使える現代的な言語です。
  3. 複数のパラダイム。すべてのプロジェクト、またはプロジェクト内のすべての小さなサブ問題にさえ、1 つのパラダイムが適切というわけではありません。
  4. プログラミングについての考え方に実際に影響を与える興味深い言語です。

やや大事な:

  1. パフォーマンス。パフォーマンスがまともであればいいのですが、パフォーマンスが本当に優先される場合は、代わりに D を使用します。
  2. 十分に文書化されています。

重要ではありません:

  1. コミュニティの規模、ライブラリの可用性など。これらはいずれも言語自体の特性ではなく、すべて非常に急速に変化する可能性があります。
  2. ジョブの可用性。私はフルタイムのプロのプログラマーではありません。私は大学院生であり、プログラミングは私の研究に関連しています。
  3. 100 万のコード モンキーが取り組んだ非常に大規模なプロジェクトを念頭に置いて主に設計された機能。
4

31 に答える 31

69

私は Lisp について少し読んだことがありますが、Lisp の奇妙な構文などを使わずに、Lisp が行ういくつかのクールなことを可能にする言語を見つけたいと思っています。

私たち全員ではないでしょうか。

コードとデータの最小限の区別、Lisp スタイル

悲しいことに、コードとデータの最小限の違いと「奇妙な」構文は、相互の結果です。

読みやすい構文が必要な場合は、Python があります。ただし、コードは、一般的に使用される組み込みデータ構造のいずれにも表示されません。ほとんどの言語がそうであるように、「重要」リストの項目 1 では失敗します。そのため、有用なヘルプを提供することが難しくなっています。

あなたはそれをすべて持つことはできません。この考えを持ったのはあなたが初めてではないことを忘れないでください。あなたの理想とする言語のようなものが存在するなら、私たちは皆それを使っているでしょう。現実の世界はあなたの理想に達していないため、ウィッシュ リストの優先順位を再設定する必要があります。「重要」セクションは、自分にとって本当に重要なものを特定するために再配置する必要があります。

于 2008-09-28T00:11:51.917 に答える
17

正直なところ、メタプログラミング機能に関する限り、Ruby と Python は、一部の支持者が認めているよりもはるかに似ています。両方の言語のこのレビューは、かなり良い比較/レビューを提供します:

したがって、いくつかの基準に基づいて1つを選択してください。Rails が好きで、そのコードを勉強したいと思っているかもしれません。多分SciPyはあなたのものです。ライブラリ、コミュニティなどのエコシステムを見て、1 つを選択します。どちらを選択したかに基づいて、メタプログラミングの至福を逃すことはありません。

于 2009-07-30T07:48:57.373 に答える
16

免責事項:私はどちらかの言語で手を出すだけですが、少なくとも両方で小さな動作するプログラム(Perl、bash、またはGNU makeを使用するクイックスクリプトだけでなく)を作成しました。

Rubyは、ドメイン固有言語を簡単に作成できるようにするために一生懸命働いているため、「複数のパラダイム」のポイント3に非常に適しています。たとえば、オンラインで閲覧して、RubyonRailsコードのいくつかとRakeコードのいくつかを見てください。これらは両方ともRubyであり、類似点を確認できますが、通常は同じ言語と考えているものとは異なります。

Pythonはもう少し予測しやすいように思えますが(おそらく「クリーン」と「正常」のポイント2に相関している)、それが言語自体によるものなのか、それとも異なる値を持つ人々によって通常使用されているだけなのかはわかりません。 。私はPythonでディープマジックを試みたことがありません。私は確かに両方の言語がよく考えられていると言うでしょう。

どちらも1と4で良いスコアを出します。[編集:実際には1はかなり議論の余地があります。通訳言語で一般的なように、両方に「eval」がありますが、概念的に純粋ではありません。クロージャを定義したり、オブジェクトにメソッドを割り当てたりすることができます。これがあなたが望むところまで行くかどうかわからない。]

個人的にはRubyの方が楽しいと思いますが、それは部分的には、物事を行うためのクールな方法を考えることに気を取られやすいためです。私は実際にPythonをもっと使用しました。時々あなたはクールになりたくない、あなたはそれをやりたいのでそれは就寝前に行われます...

どちらも難しいことではないので、次のマイナーなタスクを一方で実行し、次のタスクをもう一方で実行することを決定できます。または、図書館からそれぞれの入門書を手に取り、両方をざっと読んで、何があなたを魅了するかを見てください。

于 2008-09-27T23:35:19.743 に答える
15

Smalltalkを検討しましたか?リフレクティビティとイントロスペクション機能を備えた非常にシンプルで明確で拡張可能な構文と、これらの機能を利用する完全に統合された開発環境を提供します。たとえば、Squeak Smalltalk で行わている作業のいくつかを見てください。Squeak を使用している多くの研究者がSqueak メーリング リストや freenode の #squeak にたむろしているので、複雑な問題について非常に簡単にヘルプを得ることができます。

現在の関連性を示すその他の指標: 名前を付けたい任意のプラットフォーム ( iPhoneを含む) で動作します。Gilad Bracha は Newspeak の仕事の基礎を Squeak に置いています。V8 チームはSmalltalk VMに慣れました。そして、Dan Ingalls と Randal Schwartz は、荒野で何年も過ごした後、最近 Smalltalk の仕事に戻ってきました。

検索の成功をお祈りします。最終的に決定した内容をお知らせください。

于 2008-09-28T08:54:17.527 に答える
15

少なくともイデオロギーのレベルでは、Python と Ruby の間に大きな違いはありません。ほとんどの場合、それらは同じものの異なるフレーバーにすぎません。したがって、どちらが自分のプログラミング スタイルにより合っているかを確認することをお勧めします。

于 2008-09-28T00:31:09.827 に答える
14

Lispは、パフォーマンスを含むすべての基準を満たし、(奇妙な)構文を持たない唯一の言語です。あなたがそのような驚くほど情報不足/間違った方向にそれを避け、その結果、例えばEmacs + SLIME + CLを使用した経験を逃した場合、あなたは自分自身に大きな不利益をもたらすでしょう。

于 2008-09-29T21:34:03.980 に答える
11

Rubyについて説明しています。

  • 優れたメタプログラミング。実行時にクラス、メソッド、関数などを作成する機能。できれば、コードとデータの区別を最小限に抑えた Lisp スタイル。

実行時に既存のプリミティブを拡張および変更するのは非常に簡単です。ruby では、すべてがオブジェクト、文字列、整数、さらには関数です。

class_evalなどを使用して、シンタックス シュガーのショートカットを構築することもできます。

  • 素晴らしく、クリーンで、健全な構文と、一貫性のある直感的なセマンティクス。基本的によく考え抜かれた、楽しく使える現代的な言語です。

Ruby は驚きの少ない原則に従っており、Ruby のコードと他の言語の同等のコードを比較すると、多くの人がより「美しい」と考えます。

  • 複数のパラダイム。すべてのプロジェクト、またはプロジェクト内のすべての小さなサブ問題にさえ、1 つのパラダイムが適切というわけではありません。

命令型、オブジェクト指向、機能的、内省的に従うことができます。

  • プログラミングについての考え方に実際に影響を与える興味深い言語です。

それは非常に主観的なものですが、私の観点からすると、多くのパラダイムを同時に使用できるということは、非常に興味深いアイデアを可能にします。

私は Python を試しましたが、あなたの重要な点に適合しません。

于 2008-09-29T00:42:39.853 に答える
11

あなたの4つの「重要な」ポイントは正確にRubyにつながりますが、2つの「やや重要な」ポイントはPythonによって支配されています。そうです。

于 2008-09-28T08:36:39.520 に答える
8

異なる言語で同じことを行う(リストからの項目の改行の空でない説明と結合する)コード例を比較しますmyList(言語はアルファベットの逆順で配置されます)。

ルビー

myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")

または

myList.map(&:description).reject(&:empty?).join("\n")

Python

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions)) 

または

"\n".join(f.description() for f in mylist if f.description())

Perl

join "\n", grep { $_ } map { $_->description } @myList;

または

join "\n", grep /./, map { $_->description } @myList;

Javascript

myList.map(function(e) e.description())
      .filter(function(e) e).join("\n")

イオ

myList collect(description) select(!="") join("\n")

これがIoガイドです。

于 2008-12-28T08:58:21.850 に答える
6

@ジェイソン私はそれぞれ同意しません。Ruby がメタプログラミングに関して Python よりも優れている点には、哲学的および実用的な違いがあります。手始めに、Ruby は Single Inheritance と Mixins で正しく継承されます。そして、メタプログラミングに関して言えば、それはすべて自己に関するものであることを理解する必要があります。ここでの標準的な違いは、Ruby では実行時にselfオブジェクトにアクセスできることですが、Python ではそうではありません!

Python とは異なり、Ruby には個別のコンパイル フェーズやランタイム フェーズはありません。Ruby では、コードのすべての行が特定の自己オブジェクトに対して実行されます。Ruby では、すべてのクラスがオブジェクトと非表示のメタクラスの両方から継承されます。これにより、いくつかの興味深いダイナミクスが生まれます。

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

self.nameを使用すると、Ninja クラスのメタクラスメソッドにアクセスして、Ninja のクラス名を返します。メタプログラミングは、Python でとても美しく花開きますか? 私は心からそれを疑う!

于 2011-01-30T02:13:59.913 に答える
6

「主流」であるという点では、Ruby は Lisp よりも優れているでしょう (それが実際に何を意味するにせよ、現実的な懸念の 1 つは、Lisp プログラミングを採用した場合に、Lisp プログラミングに関する質問への回答がいかに簡単に見つかるかということです)。 、 Ruby はとても簡単に手に入れることができました。最初に Python (またはその他の言語) を学習するのに費やしたのと同じ時間で、以前よりもはるかに効率的に優れたコードをすぐに記述できるようになりました。ただし、これは 1 人の意見にすぎません。一粒の塩でそれを取ると思います。この時点で、私は Python や Lisp よりも Ruby について多くのことを知っています。

Lisp は間違いなく非常にクールで、調べる価値があります。あなたが言ったように、コミュニティのサイズなどは非常に急速に変化する可能性があります。そうは言っても、サイズ自体はコミュニティの質ほど重要ではありません。たとえば、#ruby-langチャンネルは今でも信じられないほど賢い人でいっぱいです。Lisp は、本当に頭のいい人たちも惹きつけているようです。私は直接の経験があまりないので、Python コミュニティについて多くを語ることはできませんが、「大きすぎる」ように思えることがあります。(人々が IRC チャンネルで非常に失礼なことを言ったことを覚えています。Python に夢中になっている友人から聞いた話によると、それは例外ではなく規則のようです。)

とにかく、役に立つと思われるいくつかのリソースは次のとおりです。

1) Pragmatic Programmers Ruby Metaprogramming シリーズ ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) -- 無料ではありませんが、後のエピソードは非常に興味深いものです。(コードは無料です。ダウンロードして学習内容を確認したい場合)。

2) Paul Graham による Lisp について ( http://www.paulgraham.com/onlisp.html )。少し古いですが、クラシックです (無料でダウンロードできます)。

于 2009-07-29T20:52:06.810 に答える
5

私は多くのプロジェクトで Python を使用していますが、Python はあなたが求めたすべての機能を提供していると思います。

重要:

  1. メタプログラミング: Python はメタクラスとランタイム クラス/メソッド生成などをサポートします。
  2. 構文: それはなんとなく主観的です。私は Python の構文がシンプルであることを気に入っていますが、Python は空白に敏感であると不満を言う人もいます。
  3. パラダイム: Python は、手続き型、オブジェクト指向、および基本的な関数型プログラミングをサポートしています。
  4. Python は非常に実用的なスタイルを持っていると思います。それは私にとって非常に刺激的でした。

やや大事な:

  1. パフォーマンス: スクリプト言語です。しかし、Python 用の C 拡張機能を作成することは、最適化の一般的な方法です。
  2. ドキュメンテーション: 文句は言えません。誰かがJavaから知っているほど詳細ではありませんが、十分です。

あなたは大学院生なので、科学者が必要とするのは Pythonだけだと主張するこの論文を読みたいと思うかもしれません。残念ながら、Python と Ruby を比較することはできません。なぜなら、私はその言語を使用したことがないからです。

よろしく、デニス

于 2008-09-28T08:27:12.333 に答える
4

Lisp 構文が気に入らない場合は、おそらくアセンブラを使用することをお勧めします。:-)

コードとデータの違いは最小限であり、マルチパラダイム (またはパラダイムではないかもしれません) であり、学習と実行できるトリックの両方の点で (退屈な場合でも) 心を広げる経験です。

于 2008-10-02T16:05:07.893 に答える
4

イオはあなたの「重要」ポイントをすべて満たしています。クレイジーなメタ ハッカリーを行うのに、これほど優れた言語はないと思います。

于 2008-10-15T21:09:45.283 に答える
3

リボルは試しましたか?

于 2009-09-28T22:08:47.423 に答える
3

私の答えはどちらでもありません。私は両方の言語を知っており、Ruby のクラスを受講し、Python でプログラミングを数年間行っています。Lisp は、その唯一の目的がリストを変換することであり、独自のソース コードが単なるトークンのリストであるため、メタプログラミングが自然であるため、メタプログラミングが得意です。私がこの種のものに最も適している言語は、Rebol、Forth、Factor の 3 つです。Rebol は非常に強力な方言言語であり、入力ストリームからコードを取得し、それに対して式を実行し、言語で記述されたルールを使用して変換します。表現力が豊かで、方言がとても上手。Factor と Forth は多かれ少なかれ構文から完全に切り離されており、単語を定義して呼び出すことによってプログラミングします。それらは通常、ほとんどが独自の言語で書かれています。従来の意味でアプリケーションを作成するのではなく、特定のアプリケーションを定義するために独自の言葉を書くことで、言語を拡張します。Factor は、ソース コードの評価と操作に関して、smalltalk でしか見たことのない多くの機能を備えているため、特に優れています。本当に素敵なワークスペース、インタラクティブなドキュメントなど.

于 2012-02-02T23:45:44.840 に答える
3

静的にコンパイルされた言語では実行できないメタプログラミング ハックをサポートするもの

Lispが行ういくつかのクールなことを可能にする言語を見つけたいと思っています。

Lisp はコンパイルできます。

于 2009-07-29T20:15:59.750 に答える
2

Lisp スタイルの code-is-data の概念は好きだが、Lisp の構文は好きでない場合は、Prologを選択するのがよいでしょう。

それが「使うのが楽しく、現代的な言語」であるかどうかは、他の人に判断を委ねます。;-)

于 2008-09-28T06:43:45.017 に答える
2

私は Python を少しだけ使用しましたが、Ruby の方がはるかに多かったです。ただし、どちらもあなたが求めたものを提供していると思います。

あなたの4つのポイントがすべて表示されたら、少なくともチェックしてください: http://www.iolanguage.com/

Mozart/Oz も興味深いかもしれません: http://mozart.github.io/

よろしく フリードリヒ

于 2008-09-28T08:07:03.553 に答える
2

OCaml はどうですか?

OCaml の機能: 静的型システム、型推論、パラメトリック ポリモーフィズム、末尾再帰、パターン マッチング、ファースト クラス レキシカル クロージャ、ファンクタ (パラメトリック モジュール)、例外処理、および増分世代自動ガベージ コレクション。

以下を満たしていると思います。

重要:

  1. 素晴らしく、クリーンで、健全な構文と、一貫性のある直感的なセマンティクス。基本的によく考え抜かれた、楽しく使える現代的な言語です。
  2. 複数のパラダイム。すべてのプロジェクト、またはプロジェクト内のすべての小さなサブ問題にさえ、1 つのパラダイムが適切というわけではありません。
  3. プログラミングについての考え方に実際に影響を与える興味深い言語です。

やや大事な:

  1. パフォーマンス。パフォーマンスがまともであればいいのですが、パフォーマンスが本当に優先される場合は、代わりに D を使用します。
  2. 十分に文書化されています。
于 2008-10-01T19:07:13.567 に答える
2

Python、Smalltalk、Ruby を調べた後、Ruby を選択しました。

于 2008-09-28T13:29:25.977 に答える
2

Python と Ruby を分離することはあまりありません。Python コミュニティは Ruby コミュニティよりも大きく成熟していると思いますが、それは私にとって非常に重要なことです。Ruby はより柔軟な言語であり、プラスとマイナスの影響があります。ただし、これら両方の言語について詳しく説明する人はたくさんいると思います。そのため、3 つ目のオプションを検討します。JavaScriptはどうですか?

JavaScript はもともと、Web 用のスキームとして設計されたもので、プロトタイプに基づいているため、マルチパラダイムとメタプログラミングに関する限り、Python や Ruby よりも優れています。構文は他の 2 つほど優れていませんが、おそらく現存する言語の中で最も広く展開されており、パフォーマンスは日々向上しています。

于 2008-09-28T03:38:38.363 に答える
1

Pythonがあなたが望むすべてのこと(特にコードとデータの最小限の区別についてのポイント)を満たすかどうかはわかりませんが、Pythonを支持する1つの議論があります。DでPythonの拡張機能を簡単にプログラムできるプロジェクトがあるので、両方の長所を活かすことができます。http://pyd.dsource.org/celerid.html

于 2008-09-29T06:10:31.967 に答える
1

Python スタイルの構文と Lisp のようなマクロ (実際のコードであるマクロ) と優れた DSL については、convergeを参照してください。

于 2008-09-28T11:42:21.117 に答える
1

Ruby では POSIX スレッドができないと考えて、Ruby プログラミング言語と Ruby 実装を混在させないでください。

単純に pthread サポートを使用してコンパイルすることができます。これは、このスレッドが作成された時点ですでに可能でした

この質問に対する答えは簡単です。Lisp が好きなら、おそらく Ruby を好むでしょう。または、好きなもの。

于 2010-12-17T21:36:55.927 に答える
1

Ruby を使用することをお勧めします。

私が最初にそれを学び始めたとき、私はそれを拾うのが本当に簡単であることに気づきました.

于 2011-06-20T01:15:06.427 に答える
1

あなたがバラを愛するなら、いばらと一緒に暮らすことを学ばなければなりません:)

于 2008-12-27T23:07:20.437 に答える
0

Haskellをお勧めします。「重要な」基準1(テンプレートHaskellを含めない限り)または3(Haskellはしっかりと関数型言語ですが、必要に応じてHaskellで必須のコーディングが実際にどれほど簡単であるかに驚くでしょうが)の候補にはなりません。に)。ただし、Haskellのファーストクラス関数は確かに楽しめます。

Haskellは、「重要な」基準2および4の堅実な選択です。特に#4:「プログラミングについての考え方に実際に影響を与える興味深い言語」。かなりの量のHaskellを学んだ人なら誰でも、あなたの心を広げるその能力を証明することができます。

于 2011-06-10T06:37:47.337 に答える
0

両方の言語を試して、気に入った方を選ぶことをお勧めします。Python と Ruby の両方で、やりたいことを実行できます。

このスレッドもお読みください。

于 2008-09-27T23:04:12.953 に答える
0

JS を使用する場合は、私の github http://github.com/visionmedia で AJS (Alternative JavaScript Syntax) をチェックしてください。これにより、見た目がすっきりしたクロージャーなどが得られます :D

于 2009-05-11T23:42:49.420 に答える
0

要点 (メタプログラミング) について: Groovy のバージョン 1.6 には、AST (Abstract Syntax Tree) プログラミングが標準の統合機能として組み込まれています。Ruby には RubyParser がありますが、これはアドオンです。

于 2009-07-29T19:59:42.987 に答える