Schemeによるプログラミングに関する世界観です。Lispも参照のこと。
Schemeは、Lispの方言のひとつ。
Common LispがさまざまなLispの仕様を取り入れて巨大になったのとは異なり、Schemeは真にLispに必要な言語仕様とは何かを追究して作られている。
また、言語の大きな特徴として、「静的スコープ」をあるべき正しいスコープであるとしている。Lisp界に静的スコープを普及させた功労者的な存在でもある。
2023.06.07-08
以下のようなページが参考になる。
2023.06.07
Schemeでは、define命令をグローバル変数と関数の両方の宣言に使う。
Schemeには、変数と関数が同じものとして、区別されずに扱われるため、グローバル変数であっても関数であってもdefine命令で宣言する。
これは、Common Lispでいえばdefvalとdefunの両方の機能をdefineが持っているのと同じことである。
また、Schemeには名前空間がひとつしかないので、代入する命令は複数個別に必要なく、define(Common Lispのdefval)とset!(Common Lispのsetq)を使う。
ローカル変数を宣言するにはletを使えばいい。
また、Common Lispではシンボルとして値と関数が区別されるが、Schemeでは区別されない。Schemeでは、変数に紐づけされる値はオブジェクトであっても関数であってもいい。なのでCommon Lispでlambda式などに付けられる#'は、Schemeでは必要なく、単にlambdaと書くだけで構わない。
また、Common Lispのtやnilの代わりのものとして、Schemeでは#tと#fがある。
ほかにもCommon LispとSchemeにはさまざまな違いがある。「On Lisp」などが参考になる。
以下の書籍を参考に執筆しました。
2023.10.31
2024.07.12編集
おそらく、Schemeは「最高のプログラミング言語」でしょう。
多くのエンジニアが言っているように、プログラミング言語の中でもっとも高水準な言語は、Lispです。
しかしながら、Lispの共通標準として作られたはずのCommon Lispは、Lisp界に当時存在した要素を全部取り入れようとしたため、たくさんのLisp方言のすべての機能を網羅した、超スーパーセットのような言語になってしまいました。
また、Common Lispは値としての変数と関数の区別がまだ残っていたため、変数と関数を区別しないHaskellなどに比べると、「関数型なんだけど、関数型言語のいいところがない」ような言語になってしまいました。
Schemeは違います。さまざまなLispのスーパーセットであるCommon Lispと異なり、Schemeは機能と仕様を厳選し、Lispハッカーのセンスを体現させるような言語を目指して、言語仕様が追究されています。また、Schemeでは変数と関数の区別がありません。なので、Haskellなどのような関数型言語のエレガントな言語仕様を本格的に味わうことができます。
そのような理由で、僕はSchemeは「世界最高のプログラミング言語」だと思います。
2024.07.12
GNUによるSchemeの処理系の1つ。GNUの公式の拡張言語であり、Libguileを使うことでGuileを別のアプリケーションの中に埋め込んで使うことが出来る。ただ、採用しているソフトウェアはあまり多くない。(Pythonなどに負けている。)
Schemeの処理系の1つ。ハワイ在住の日本人であり、僕が大好きだったポール・グレアムのエッセイの翻訳者としても知られる川合史朗氏による、Schemeのオープンソースな言語処理系。
特に、ハッカーと画家 コンピュータ時代の創造者たち(ポール・グレアムのエッセイを川合史朗氏が翻訳した書籍)はとても面白かったです。
2023.06.08編集
「計算機プログラムの構造と解釈」(SICP)は、コンピュータ科学における古典的な名著です。
プログラミング言語としてSchemeを用いながら、コンピュータ科学と関数型プログラミングの真髄を教えてくれる、上級者向けの一冊です。
初心者向けの本を一通り読み終えた方におすすめします。
著者はMIT(マサチューセッツ工科大学)の教授陣であり、かつてMITで入門者向けの講義に使われていた標準的な教科書。ウィザード(魔術師)の描かれた表紙から「Wizard Book」とも呼ばれます。表紙には「lambda」「eval/apply」というSchemeの中核技術が明示されています。
2024.07.12-13