CSセミナー001 文字列を表示する

こんにちは。若草春男です。これから、コンピュータ・サイエンス(CS)のセミナーを行っていきたいと思います。このセミナーの目標は、「プログラミング言語を作れるようになること」です。参考資料として次のものをおすすめしますが、このシリーズを読む人はこの書籍を用意されなくて結構です。

Michael Sipser著、渡辺治・太田和夫監訳(2000) 計算理論の基礎、共立出版株式会社

# 「kuin」を表示する

デバッグ出力をしてみましょう。まずは、ログ出力に「kuin」と表示させましょう。

```c001.kn
func main()
	do dbg@print("kuin")
end func
```

Kuinエディタでこのプログラムを入力して、[コンパイル＆実行]をクリックしてみましょう。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/64229/0b94e1ad-a352-2e22-c1ac-e420a38e56df.png)
![002.png](https://qiita-image-store.s3.amazonaws.com/0/64229/d7074853-b6d7-0349-18a7-96f93e9e1a3d.png)
ログ出力に、「kuin」と表示されました。

# 「kuin」を２回表示する

それでは、「kuin」と２回出力してみましょう。想定される出力はこんな感じです。
![003.png](https://qiita-image-store.s3.amazonaws.com/0/64229/c4fc2b79-da1e-645a-d131-32de8d719bb6.png)
試しに次のコードを試してみます。

```c002.kn
func main()
	do dbg@print("kuin")
	do dbg@print("kuin")
end func
```

![004.png](https://qiita-image-store.s3.amazonaws.com/0/64229/633d3c7a-f252-65d3-5fc3-6eb9635405bb.png)
想定していた出力とは違う感じになってしまいましたね。どうしてこうなるかというと、１回目の「kuin」を出力してから、**改行コード**を出力していないからです。それでは改行コードの出力をソースコードに追加してみましょう。

```c003.kn
func main()
	do dbg@print("kuin")
	do dbg@print("\n") {改行コードを出力}
	do dbg@print("kuin")
end func
```
![005.png](https://qiita-image-store.s3.amazonaws.com/0/64229/9a53153e-b84f-d2ff-b01d-5eadbdcaf77f.png)
どうやらうまくいったようですね。ところで "\n" のことを改行コードと言います。C言語という言語でそのような決まりになっているので、その他のプログラミング言語においてもたいていはそのようになっています。とにかくログ出力を改行するときには「改行する関数を呼び出すのではなく、ログ出力をする関数に改行コードを入力する」のだと覚えてください。

さて、先ほどの[c003.kn]の中に、**コメント**という記述があります。コメントには２種類あります。`{`と`}`で囲うものと、`;`で始まる行です。コメントの中には自由にメモや文章を書くことができます。`"`と`"`で囲われているものは文字列です。

```c004.kn
func main()
	{私は
	コメント
	です}
	do dbg@print("私はコメントではありません。")
	; 私はコメントです
end func
```

- **演習１** [c003.kn]からコメントを削除してください。
- **演習２** ２回「kuin」を表示するプログラムをdbg@print関数の呼び出しを(３回ではなく)２回に減らしてみてください。
- **演習３** ２回「kuin」を表示するプログラムをdbg@print関数の呼び出しを１回に減らしてみてください。
- **演習４** 「kuin」を表示するプログラムを、dbg@print関数の呼び出しを１文字ずつ４回に分けておこなうようにしてみてください。

# Kuinのドキュメントについて

Kuinにはドキュメントがあります。さっそくこれについて学んでみましょう。
- **演習５** プログラミング言語「Kuin」のドキュメントのトップページを開いてみてください。下の画像のような見た目です。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/64229/9480a895-befc-be75-bd8f-8328ddd15b6d.png)
- **演習６** dbg@print関数の説明が書かれているドキュメントページを開いてください。

Kuinのドキュメントには検索機能がありません。ドキュメント内で特定のことがらについて知りたい場合はどうすればいいのでしょうか。例えば、Kuinのドキュメントから、「文字列」に関連するページを検索してみます。まず、ブラウザのアドレスバーに[site:kuina.ch 文字列]と入力してエンターキーを押します。
![012.png](https://qiita-image-store.s3.amazonaws.com/0/64229/95304ebf-0a4d-fa9b-a47b-8bdf48a47920.png)
すると、「くいなちゃん学院」の中で「文字列」というキーワードにヒットしたページの一覧が表示されます。
![013.png](https://qiita-image-store.s3.amazonaws.com/0/64229/18ff8a0f-353c-7d11-c6c1-245b846a55f9.png)
このように検索することで探したいページが見つかる確率が上がります。ここで注意したいのは、ヒットしたページが全部Kuinのドキュメントではないということです。例えば「第８話 ポインタと配列と文字列～」はKuinのドキュメントではなく「6さいからのプログラミング」というコンテンツの一部なので見間違えのないように注意してください。

ヒットしたページの一番上のページを開いてみます。
![014.png](https://qiita-image-store.s3.amazonaws.com/0/64229/8291b900-7501-c837-5be0-9c367fa43326.png)
Kuinのドキュメントページは長いことがあります。このページを表示しているとき、ブラウザのスクロールバーに注目してみましょう。スクロールバーがウィンドウのだいたい10%くらいの長さなのでこのページは10画面くらいの長さがあることが分かります。このときには、ブラウザの検索機能を使いましょう。Ctrl+Fボタンを押します。
![015.png](https://qiita-image-store.s3.amazonaws.com/0/64229/ee598ee9-cb5d-f24d-717d-8f53ecd56256.png)
このポップアップに検索したいキーワードを入力します。ここに「文字列」と入力すると、「文字列」というキーワードがハイライトされます。また、スクロールバーにキーワードがヒットした箇所がマークされます(Internet Explorerではマークされませんでした)。これらのヒントを頼りに情報を調べていきます。
![016.png](https://qiita-image-store.s3.amazonaws.com/0/64229/2ed788b1-0c20-c147-9c7f-403c19c057e3.png)
- **演習７** `"kuin"`という記述が文字列なのはなぜですか？その論拠となる箇所をKuinのドキュメントから探してみてください。
- **演習８** cui@print関数を使ってコンソールに「くいなちゃん６さい」という文字列を出力してください。

# お疲れさまでした

今回はKuinで文字列を表示する方法とブラウザでKuinのドキュメントを見たり、検索したりする方法を学びました。初回なのでコンピュータサイエンスには触れず、Kuinの基本操作に慣れてもらうことに注力しました。

このシリーズでは「プログラミング言語を作る」ことを目標としていますが、そのための最初の目標は「正規表現エンジンを作る」ことです。プログラミングの段階としてざっくり説明すると次の３段階があるかと思います。

- 初心者: 文字列を出力することができる
- 中級者: 正規表現が扱える
- 上級者: パーサを作成することができる

非常にざっくりとしていますが、正規表現を扱ったりパーサを作成したりする途中に色々な壁があるのでこのような説明でだいたい正しいのかと思います。今回は文字列を出力するということに注力したわけです。次回からは正規表現についてみっちり学んでいきたいと思っています（私も正規表現エンジンを記述したことがありません）。どうぞよろしくお願いいたします。

# 演習の答え

## 演習１
```e001.kn
func main()
	do dbg@print("kuin")
	do dbg@print("\n")
	do dbg@print("kuin")
end func
```
## 演習２
```e002.kn
func main()
	do dbg@print("kuin\n")
	do dbg@print("kuin")
end func
```
(※改行コードを書くときは、行頭ではなく行末に書くのが一般的です。)
## 演習３
```e003.kn
func main()
	do dbg@print("kuin\nkuin")
end func
```
## 演習４
```e004.kn
func main()
	do dbg@print("k")
	do dbg@print("u")
	do dbg@print("i")
	do dbg@print("n")
end func
```
## 演習５
①ブラウザのアドレスバーで[kuina.ch]と入力するか、[kuin]や[くいなちゃん]で検索して[くいなちゃん学院]のトップページを開きます。
![007.png](https://qiita-image-store.s3.amazonaws.com/0/64229/e09a447b-5886-08d2-79b0-cdb3c2dce92c.png)
②[くいなちゃん学院 マップ]の[②研究室]をクリックします。
③表示されたポップアップで、[プログラミング言語「Kuin」]と書かれたリンクをクリックします。
![008.png](https://qiita-image-store.s3.amazonaws.com/0/64229/a5ec186c-0c0e-f425-7b79-d54434d158e4.png)

## 演習６
dbg@print関数は、dbgライブラリのprint関数という意味です。Kuinのライブラリについて知りたい場合はドキュメントのトップページ下方にある[言語仕様]のなかから[dbgライブラリ]と記載のあるリンクを探してクリックします。
![009.png](https://qiita-image-store.s3.amazonaws.com/0/64229/eed1b4f1-2cc5-1484-e017-a1cd91128df1.png)
![010.png](https://qiita-image-store.s3.amazonaws.com/0/64229/bfa2c86c-ff47-3372-a711-f8a4e35ffb73.png)
下記の箇所がdbg@print関数の説明になります。
![011.png](https://qiita-image-store.s3.amazonaws.com/0/64229/9648df86-9476-ebba-54cb-f36de3812f10.png)

## 演習７
Kuinのドキュメント内で、以下の記述がそれに相当します。
![017.png](https://qiita-image-store.s3.amazonaws.com/0/64229/e82e4d29-34c7-affa-3ca9-d6cdc33986c5.png)

`「"abc"」とは「['a', 'b', 'c']」と同じ意味で、文字列型でのみ使える書き方です。`という記述によって、`"`で囲われたテキストが文字列になることが分かります。

## 演習８
Kuinエディタにこのように入力して[コンパイル＆実行]をクリックします。
![018.png](https://qiita-image-store.s3.amazonaws.com/0/64229/76da8ef9-5d70-4848-f356-09774179c134.png)
Kuinエディタ内で、[設定]の[実行環境]の箇所を[ウィンドウ]ではなく[CUI]に設定する必要があります。正しく実行されればこのようなコンソール出力が得られるはずです。
![019.png](https://qiita-image-store.s3.amazonaws.com/0/64229/943363dc-d9d6-d74a-9ec3-95778b780a7f.png)