「Scheme」の版間の差分
削除された内容 追加された内容
M編集の要約なし |
Semi-Brace (トーク | 投稿記録) M +syntax highlight, code |
||
65 行
Schemeでは一貫して括弧の入れ子構造になっているのがおわかりになると思います。これがまさにSchemeの言語仕様がシンプルであるという所以です。Schemeではプログラムの実行を進めていくことを「評価」と呼びますが、これも簡単に言えば数式を変形して簡単にしていくことに似ています。たとえば、数学では次のように式を変形し、値を求めていきます。
<syntaxhighlight lang="scheme">
1 + ((4 - 2) + 1)
= 1 + (2 + 1)
= 1 + 3
= 4
</syntaxhighlight>
これ以上簡単にしようがない「4」が出てきた時点で変形は終了です。これで答えが求まりました。このような変形をSchemeで表せば次のようになります。
100 ⟶ 101行目:
===文字列リテラル===
文字列の値を記述する場合は、その文字列をダブルクォーテーション
特別な文字を表す表現もあります。たとえば改行は
リテラルを評価すると、そのリテラルそのものが示す値を返します。
▲リテラルを評価すると、そのリテラルそのものが示す値を返します。「1」を評価すると「1」、「"こんにちは"」を評価すると「"こんにちは"」がそのまま返ります。
===文字リテラル===
単一の文字を表現するには文字リテラルを使います。これは
これは文字列リテラルとは扱いが異なりますので注意してください。たとえば
===真偽値リテラル===
条件が真か偽かを表すのには真偽値型の値を使います。
==コメント==
ソースコード中には[[w:コメント (コンピュータ)|コメント]]と呼ばれる注釈を書くことができます。コメント部分はプログラムの評価に一切関与しません。Schemeでは
>(define hoge 10) ;ここがコメント
hoge
Wikipedia:サンドボックス#ここから下に書き込んでください。
注釈を書く用途のほか、プログラムの一部分を一時的に評価しないようにするためにも使われます。もし評価して欲しくない部分を単純に削除してしまうと、あとで戻そうと思ったときに書き直さなければならず手間がかかるからです。コメントにしておけば先頭のセミコロンを削除するだけで元に戻せます。このように評価して欲しくない部分をコメントにすることをコメントアウトと呼びます。
==手続き==
Schemeには「手続き」(procedure)という概念があります。これは幾つかの処理を行いその結果を返すまとまりで、[[w:数学]]における[[w:関数]]と非常に良く似ています。たとえば、数学では「f(x,y) = x + y のとき、 f(1,2) = 3である」などといいますよね。Schemeでは
では、手続きの呼び出しを表現してみましょう(実は下記の手続きの解説には幾つか方便が含まれています。ですが、ここで詳細を解説すると難しくなりすぎるので、詳しくは後述します。手続きの定義は少し難しいので後回しにします)。
132 ⟶ 131行目:
===手続きの文法===
Schemeの手続きの呼び出しは
手続き呼び出しの丸括弧は数学の優先順位を示す括弧とは異なり、省略'''できません'''。このため、数学のような乗算が加算に優先する、といった優先順位はSchemeには'''存在しません'''。この仕様は記号の優先順位を覚える必要がない反面、数式を煩雑にしがちで、Schemeらしい点でもあります。手続きの呼び出しが何重にもなると括弧の数を間違いやすいです。括弧は
===実際に試してみる===
Schemeには加算をする手続き「+」が予め定義されています。さっきの構文にのっとると、数学での
>(+ 1 2)
151 ⟶ 150行目:
-270.008408
なんだか変な構文だと思われるかもしれませんが、これらの構文は
===注意===
幾つか手続き呼び出しに関して気をつけておくことがあります。手続きには「手続き名」「引数の数」「引数の型」「返り値の型」などの要素を持っています。たとえば、幾つ引数をとるかは手続きごとに決められており、多すぎたり少なかったりすると実行したときに[[w:エラー]]になります。ただ、たまたま「+」は引数が幾つあってもよい手続きです。
また、手続きは引数の型が決まっています。たとえば、[[w:加算]]をする手続き
たまたま「+」は引数の順番を変えても同じ値が返ってきますが、ほとんどの手続きは引数はその順番に意味があります。たとえば、
Schemeには予め幾つかの手続きが定義されており、ユーザは新たに手続きを定義することもできます。そのScheme処理系にどの手続きが用意されているか確かめるには、その処理系の[[w:ヘルプ]]と言語仕様を確認する必要があります。
168 ⟶ 167行目:
2005
変数yearには数{{code|2004}}が束縛されましたので、変数yearが評価されるとyearに束縛された値{{code|2004}}が返ります。手続き+は{{code|2004}}と{{code|1}}の和{{code|2005}}を返します。今まで説明に使ってきた手続き+も、じつはインタプリタ起動と同時に+に加算をする手続きが束縛されていたから使えるのです。手続きも一種の値として扱えるため、defineで束縛することができるのです。また、何も束縛されていない変数を評価しようとするとエラーです。
==構文==
178 ⟶ 177行目:
year
下のdefineでは、yearはすでに2004が束縛されています。手続きは引数を評価してから渡すのですから、yearは2004を返すはずです。従って、
実はSchemeには手続き呼び出しと同じような構文でありながら、引数を評価せずに受け取る手続き呼び出しとはまったく別の式も存在します。defineは引数(のように見える部分)は評価しないのです。defineは手続きではなく、定義を行う「構文」に分類されます。
185 ⟶ 184行目:
Schemeなど[[w:Lisp]]系の言語が何故これほどまでにシンプルな構文にこだわったかには訳があります。Schemeプログラムは「リスト」と呼ばれるツリー状の構造をとるようになっているのです。Lispが[[w:人工知能]]研究の分野に使われてきたのは、プログラム上でプログラムを組み立てるのが非常に容易だからです。
たとえば、
[[画像:scheme.png]]
グレーの矩形は
==Schemeの重要な手続きや構文==
204 ⟶ 203行目:
consはペアを作る手続きです。
{{code|(cons 1 2)}} =>
このペアから無限に続くリストが作れ
{{code|(cons 1 (cons 2 (cons 3 '())))}}と定義され、
{{code|(
特に、Schemeでは、リスト構造が根本であり、それは、リストは再帰的(recursive)に定義される構造だからです。
<syntaxhighlight lang="scheme">
(cons 1 2) => (1 . 2)
(car (cons 1 2)) => 1
218 ⟶ 217行目:
(car (cons 1 (cons 2 '()))) => 1
(cdr (cons 1 (cons 2 '()))) => (2)
</syntaxhighlight>
この例だけ見ると、リストの重要性は判らないかも知れません
===四則演算===
234 ⟶ 233行目:
1010
表示できるのは、Schemeの処理系が受け付けるすべての S式です。数値、文字、文字列、クオートされたリストなど、何でも表示できます。ただし、関数は内部表現が処理系毎に異なることに注意して下さい。{{code|(display 10)}} の評価値は、未定義です。他の変数に束縛する意味はありません。複数の値を表示するとき、Scheme では以下のように書くことができます。
>(define x "Xvalue")
241 ⟶ 240行目:
newline
準引用により {{code|,}} が前に付くと、値が展開されます。それから
>(display 10 output-port)
255 ⟶ 254行目:
15
新たに定義した手続きは二つの引数をとり、その平均を返します。その手続きは変数averageに束縛しています。インタプリタは
> ((lambda (x y) (/ (+ x y) 2)) 10 20)
292 ⟶ 291行目:
hoge ;quoteを使うと、変数は変数そのものを返す
特別な構文(Schemeの機能の「構文」ではなく、一般的な意味の構文)として、
== 関連項目 ==
|