Schemeから何を学ぶべきですか?


10

優れたプログラマーになるのに役立つ、Schemeから学べるユニークな機能は何でしょうか。

私は主流の言語で多くの経験があり、私の視野を広げ、他の言語にはない機能的な側面について学びたいと思っています。私はjavascriptのクロージャー、C#のラムダ式に精通しており、他の言語にはないことに焦点を当てることができるものに疑問を感じていましたか?Lisp構文を除いて、私はこれまでに他の言語で遭遇し​​たことがあるような気がします。

何か新しいことを教えてくれるScheme / Lispに固有のものは何ですか?


3
Lispは、ついにそれを手に入れたときに得られるであろう、深い啓発の経験について学ぶ価値があります。その経験は、あなたが実際にLisp自体をたくさん使ったことがないとしても、あなたの残りの日のためのより良いプログラマーになります。-エリックレイモンド
ロバートハーベイ


1
@Robert Harvery:また:xkcd.com/224
Poindexter

2
現在の形では、この質問は特に建設的ではありません。より具体的な情報を求めるためにそれを作り直すことができるなら、それは役に立つかもしれません。
ChrisF

参照してくださいプログラミングポスト・リンネ時代における言語教育この論文が参照すること、および教科書を:プログラミング言語:アプリケーションと解釈、使用ラケット言語、スキームの方言を。
Robert Harvey、

回答:


7

おそらくLispの最も重要な定義特性は「データとしてのコード」でしょう  他の言語を使用した場合とまったく同じ方法でそのような経験をすることはできません。C#では、最も近いものは式ツリーです。

Lispを解析のための優れた言語にするのは、その品質です。それはまた、Paul GrahamがLispについて語る動機となった品質でもあります。セルフホスティングコンパイラは新しいものではありませんが、Lispほどエレガントな言語はありません。

メタプログラミング(Lispも優れているもの)も学ぶ価値のあることです。

ポールグラハムの平均を打ち負かす
http://www.paulgraham.com/avg.html


1
あれがなかった理由は「あはは!」ESRが私に約束した瞬間は、Prologで「データとしてのコード」の啓示がすでにあったことです。
Frank Shearar、2010

1
Haskellには「データとしてのコード」属性はありますか?それとも美しさは動的なタイピングとリフレクションに大きく依存していますか?
ジョーイアダムス

1
@Joey:テンプレートHaskellが存在するという事実は、Haskellが「データとしてのコード」属性を欠いていることを意味すると思います。
j_random_hacker

4

はい、それはあなたが再帰的に考えるのに役立ちます。私は1か月ほどプログラミング言語のクラスでそれ(スキーム)を勉強しただけで、プログラミングの問題の考え方と解決方法を進化させるのに役立ちました。

他のプログラミングパラダイムを試すことは常に価値があります。その後、新しいアイデアでリフレッシュしてOOの世界に戻ります。

構文ではなく、推論です。それは素晴らしい脳の運動です。再帰とリストの興味深い使用からのアパート、他に私見はあまりありませんが、それだけの価値があります。


スキームに固有ではありません。再帰を実行するには、どんな(まあ、ほとんどすべての)関数型言語でも問題ありません。

私は同意しますが、OPは「主流」の言語と比較してSchemeに興味を持っているようです...
Xavier Nodet

1

継続

コンピュータサイエンスとプログラミングでは、継続とはコンピュータプログラムの制御状態の抽象的な表現です。継続はプログラム制御状態を具体化します。つまり、継続は、プロセス実行の特定の時点での計算プロセスを表すデータ構造です。作成されたデータ構造は、ランタイム環境に隠されるのではなく、プログラミング言語からアクセスできます。これには、プロセスの現在のスタック(寿命がプロセス内にあるすべてのデータ、たとえば「ローカル変数」など)や、計算におけるプロセスのポイントなどの情報が含まれています。継続のインスタンスは、後で制御構造として使用できます。呼び出し時に、それが表すコントロールポイントから実行を再開します。「現在の続き」

そして、マッカーシーの曖昧な演算子を実装してみてください:

1963年、Lispの発明者であるJohn McCarthyは、「計算の数学的理論の基礎」という論文を発表しました。その中で、彼は(コンピュータープログラムの意味で)amb(。、。)という関数を提案しました。考え方は、amb(x、y)が最初にxに等しいということです。しかし、計算の後半でこれが何らかの矛盾につながることが判明した場合、xの値は取り消され、yに置き換えられます。これは、最初に思われるよりもはるかに複雑なビジネスです。値を取り消すということは、本質的には、計算の状態全体を、ambが値xを返したときの状態に巻き戻し、次にyの値を挿入することを意味します。これは、xが最初に返されたときに、何らかの方法で状態全体をフリーズしてコピーすることを意味します。矛盾が見つかった場合、プログラムの状態全体が破棄され、再アクティブ化されたフリーズバージョンに置き換えられます。これらの凍結状態は継続と呼ばれます。多くの点で、酸に関するGOTOステートメントのようなものです。コードの任意の場所にジャンプする可能性があります。ただし、継続はGOTOよりも論理的な推論を受け入れやすいため、優れています。


1

私は次のことを考えることができます:

  • 実際のマクロ(言語を最大限に活用してコードを生成)
  • 同型性(コードとしてのデータ、データとしてのコード)
  • 遅延評価
  • 継続

私はまた、lisp言語はドメイン固有言語(DSL)を定義するのに素晴らしいはずだと思います。これは、まだ知らない場合に読みたいと思うかもしれません。

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