小さな、作品
課題ではなく、作品
これが、この庭の最後のレッスンです。今日は、新しい文法をほとんど習いません。かわりに、作品を作ります。
課題と作品は、似ているようでちがいます。課題には正解があって、合っているかどうかを誰かが判定します。作品には正解がなく、「これでいい」と言えるのはあなただけです。
ここまでの9つのレッスンは、課題の側にいました。今日は誰の指示でもなく、自分のために書きます。題材は、世界でいちばんあなたに近いことば——あなたの名前です。
名前を、ほどく
まず JavaScript で、名前という文字列をほどきます。最後の新しい道具をふたつだけ渡します。.length と [ ] です。
const namae = "ここね"; console.log(namae.length); console.log(namae[0]); console.log(namae[1]); console.log(namae[2]);
Ctrl+Enter でも実行できます
namae.length は、文字列の文字数です。namae[0] は 0番目の文字——コンピュータは0番から数えはじめるので、最初の文字が namae[0] になります。
文字列は、ひとかたまりに見えて、実は番号のついた文字の列でした。ほどけるなら、編みなおせます。"ここね" をあなたの名前に書きかえてから、先へ進んでください。
名前の滝
くりかえしの i は、実行のたびに 0、1、2 と進む数でした。この i を、文字の番号と字下げの深さの、ふたつの役に同時に使います。
const namae = "ここね";
for (let i = 0; i < namae.length; i++) {
console.log(" ".repeat(i) + namae[i]);
}Ctrl+Enter でも実行できます
i 行目には、全角スペースが i 個と、i 番目の文字がひとつ。名前が一文字ずつ、階段を降りていきます。これを「名前の滝」と呼ぶことにします。
スペースを "・" にしたら、.repeat(i) を .repeat(i * 2) にしたら、滝はどう変わるでしょう。予想して、ためして、ずれを面白がる——いつもの動作です。
名前の方陣
同じ道具の、別の編みかたです。今度は i 番目の文字を、文字数ぶん横に並べます。
const namae = "ここね";
for (let i = 0; i < namae.length; i++) {
console.log(namae[i].repeat(namae.length));
}Ctrl+Enter でも実行できます
3文字の名前なら3×3、5文字なら5×5。名前の長さが、そのまま方陣の大きさを決めています。プログラムは1行も変えていないのに、名前がちがえば、出てくるものがちがう——これが「生成する」ということです。
名前を、かたちにする
つぎは、にわ語でかたちの作品を作ります。にわ語は文字列の中身までは覗けませんが、数なら渡せます。あなたの名前の、文字数です。
レッスン3の種明かしを思い出してください。回数×角度が360になると、模様はちょうど一周してつながるのでした。だから文字数で360を割れば、文字数がそのまま紋様の対称性になります。
3 を もじすう とよぶ
いろ を あお にする
もじすう かい くりかえす {
さんかく を かく
みぎ へ 360 / もじすう まわる
}ここに絵があらわれます
Ctrl+Enter でも実行できます
3文字の名前なら、120度ずつ3回——三角の系譜。もじすう を自分の名前の文字数に変えて、実行してください。4文字の人と5文字の人では、生まれる紋様の骨格がちがいます。
回数を増やしたければ、文字数の倍数にすれば閉じたまま育ちます。おおきさ を中で育てると、紋様は渦を巻きはじめます。
3 を もじすう とよぶ
いろ を むらさき にする
おおきさ を 30 にする
もじすう * 6 かい くりかえす {
ほし を かく
20 すすむ
みぎ へ 360 / (もじすう * 6) まわる
おおきさ を おおきさ + 2 にする
}ここに絵があらわれます
Ctrl+Enter でも実行できます
⟡ よりみち:生成する芸術
1960年代、ゲオルク・ネースやヴェラ・モルナールといった人たちが、プロッタ——ペンを機械の腕で動かす装置——にプログラムで絵を描かせました。人間は規則を書き、結果は機械が生む。当時は「これは芸術なのか」と論争になりましたが、いまでは「ジェネラティブアート」というひとつの分野です。名前から紋様を生成しているあなたは、今日からその60年の系譜の上にいます。
あなたの番
ここからは、道具の説明をしません。あなたの作品の時間です。
✎ 作品:名前から、何かを生成する
ことばの作品(JavaScript)でも、かたちの作品(にわ語)でも、両方でもかまいません。完成の条件はひとつだけ——名前を入れかえると、出てくるものが変わること。それがあなたの作品の「生成する」部分です。
const namae = "ここね";
// ここから先は、あなたの作品です
for (let i = 0; i < namae.length; i++) {
console.log(namae[i]);
}Ctrl+Enter でも実行できます
3 を もじすう とよぶ
もじすう かい くりかえす {
まる を かく
もじすう * 10 すすむ
みぎ へ 360 / もじすう まわる
}ここに絵があらわれます
Ctrl+Enter でも実行できます
手が止まったら、下のギャラリーを開いてください。人の作品を見るのは、写すためではなく、自分が次に作りたくなるためです。
ギャラリー1(ことば):山びこ
くりかえしを逆から回すと、名前が遠くから一文字ずつ返ってきます。for (let i = namae.length - 1; i >= 0; i--) として、中身を console.log(" ".repeat(i) + namae[i] + "…") に。滝を下から読む、と言ってもいい。
ギャラリー2(ことば):名前の鏡
新しい文字を「前に」つなぐと、名前が裏返ります。let kagami = ""; のあと、くりかえしの中で kagami = namae[i] + kagami; として、最後に console.log(namae + "|" + kagami);。「ことは」なら ことは|はとこ ——逆さに読むと別のことばになる名前の発見です。
ギャラリー3(かたち):文字数の二乗
回数を もじすう * もじすう かい にして、角度を 360 / (もじすう * もじすう) に。4文字なら、16枚のしかくが一周します。さらに中で おおきさ を おおきさ + 3 にする と育てると、紋様が貝殻のようにふくらみます。どれもあなたの作品の出発点であって、終点ではありません。
世界で、あなたしか書かなかったもの
完成した作品の前で、ひとつ伝えたいことがあります。このプログラムは、世界であなたしか書かなかったものです。
あなたの名前から出発して、あなたの選んだ数と色と形でできています。同じレッスンを読んだ人が一万人いても、この滝とこの紋様にたどり着いたのは、あなただけです。動く・動かないという判定の向こう側に、署名の入った一枚があります。
「まる を かく」からの、距離
最初のレッスンで、あなたは まる を かく と書きました。3語です。意味も知らずにボタンを押して、円がひとつ描かれました。
今日あなたが書いたものを見てください。名前をほどき、くりかえしの中でふたつの役を i に演じさせ、文字数で360を割って紋様の対称性を決めた。しかも、にわ語と JavaScript というふたつの言語で。
いちばん変わったのは、行数ではないはずです。あの日エラーは、こわいものでした。いまのあなたにとって、エラーは返事です——読み手がどこで困ったかを教えてくれる、会話の続きです。
この庭で身につけたこと
最後なので、レッスンひとつぶんではなく、庭ぜんぶを振り返ります。
- プログラムは、察しない誠実な読み手に宛てて書く、曖昧さのない文
- エラーは失敗ではなく、どこで困ったかを知らせる返事
- 名前(変数)は箱ではなく値へのあだ名。名前を使えば、変更は1か所で済む
- よい名前を選ぶことは、未来の読み手への手紙
- くりかえしは、日本語にもとからある省略の形式化。「またこれか」は短くできる印
- 小さなまとまりは入れ子にできる。フレーズが重なって曲になるように
- 「もし」があれば、プログラムは場合に応じて道を選べる
- 「とは」で定義すれば、自分のことばを言語に足せる
- 値には種類がある。数、文字列、色、形——種類がちがえば、できることもちがう
- 言語が変わっても(にわ語から JavaScript へ)、考え方はそのまま持ち運べる
そして今日、もうひとつ。正解のない問いに、自分の答えを作れるようになりました。
次の庭へ
ところで——最後に、ひとつ妙な問いを置いていきます。にわ語は、誰が作ったのでしょう。
「まる を かく」という語順も、「を」のあとに置けることばの一覧も、エラーの文面のやさしさも、自然に生えてきたものではありません。ぜんぶ、誰かがひとつずつ決めたことです。あなたがこの10レッスンで快適に歩けたのだとしたら、それは誰かがそう設計したからです。
言語は、与えられるものではなく、設計するものでした。次のコース「じぶんの言語をつくる」では、あなたが決める側にまわります。庭の門は、開いたままにしておきます。