fluorite-7　日本語チュートリアル　Part 1　fl7の基礎


[チュートリアルトップ](https://qiita.com/MirrgieRiana/items/a0906c72ebfb46693ab5)

[次回→](https://qiita.com/MirrgieRiana/items/27cd5c4f73b9c65eb168)

このパートでは、fluorite-7の概要の理解からHello, worldを出力するまでを追います。

# レッスン1　fluorite-7とは

fluorite-7は、Linux上もしくはブラウザ上で動作するスクリプト型プログラミング言語です。
Windows上では、Windows Subsystem for Linuxの上でなら動作します。

----

この言語の正式名称は**fluorite-7**ですが、コマンド名に合わせて**fl7**と呼ばれることもあります。

# レッスン2　インストール

## 前提プログラムのインストール

fluorite-7の動作には、次のソフトウェアが必要です。

- bash
- git
- node
- npm

これらをまず次のシェルコマンドでコンピュータにインストールします。

```bash:
# apt update
# apt install -y npm git
```

## プログラムの実行環境のダウンロード

次のリポジトリから言語の実行環境をダウンロードします。それには、次の2通りの方法があります。

- https://github.com/MirrgieRiana/fluorite-7

次のシェルコマンドでは、カレントディレクトリにfluorite-7のリポジトリをダウンロードし、コマンドをその場に生成します。

```bash:
$ curl https://raw.githubusercontent.com/MirrgieRiana/fluorite-7/master/install.bash | bash
```

次のシェルコマンドでは、
同じことを`/usr/local/bin`上で行い、結果的にコンピュータにインストールされます。

```bash:
# (cd /usr/local/bin; curl https://raw.githubusercontent.com/MirrgieRiana/fluorite-7/master/install.bash | bash)
```

アンインストールは、生成された以下のファイルを単に削除すればよいです。

- `fl7` ファイル
- `fluorite7` ファイル
- `fluorite-7` ディレクトリ

## 動作テスト

その場にインストールした場合は、次のシェルコマンドで実行します。

```bash:
$ ./fl7 '1~10|Fizz*!(_%3)&Buzz*!(_%5)||_'
```

コンピュータ上にインストールした場合は、次のシェルコマンドを使います。

```bash:
$ fl7 '1~10|Fizz*!(_%3)&Buzz*!(_%5)||_'
```

以下のチュートリアルでは、コンピュータ上にインストールしたものとして話が進みますが、その場にインストールした場合は、コマンドの形を変えて解釈してください。

次の出力が得られれば成功です。

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
```

## Tips　Google Colaboratory上でのインストール

Google Colaboratory上では、次の内容のセルを実行するとfluorite-7が環境にインストールされます。

```bash:
%%bash
(cd /usr/local/bin; curl https://raw.githubusercontent.com/MirrgieRiana/fluorite-7/master/install.bash | bash)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/3a0de282-584f-0454-5b9d-d0bf96ef7840.png)

fluorite-7を直接実行するセルマジックはありませんが、次のように書くと実行できます。

```bash:
%%bash -c 'fl7 "$(cat)"'
1~10|Fizz*!(_%3)&Buzz*!(_%5)||_
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/ba28d944-0a83-0c03-51c6-411ec8e48d4f.png)

## Tips　ブラウザ版fluorite-7

次のURLにfluorite-7コードが実行可能なオンラインエディタがあります。

- https://mirrgieriana.github.io/fluorite-7/editor/

インストールも不要でアクセスするだけで簡単に利用できますが、標準入出力やファイルの操作、EVALといったいくつかの機能が利用できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/938b75e1-88d2-b28a-3f05-80eb6e23fdd8.png)

# レッスン3　偽のHello, world!

ここでは最初のプログラムを作ります。

「Hello, world!」という文字列を出力するのもいいですが、最初はもっと簡単に「HelloWorld」という文字列を出力することを目指してみます。

コンソール上で以下のシェルコマンドを入力します。

```bash:
$ fl7 HelloWorld
```

以下の出力が得られれば成功です。

```
HelloWorld
```

これで最初のプログラムは完成しました。

## 解説

`fl7`コマンドの第1引数にfluorite-7ソースコードを記述することで、そのソースコードを実行できます。

上記のコマンドで使われたソースコードは`HelloWorld`です。

----

fluorite-7のソースコード全体は、一つの評価可能な式として解釈されます。
`100`というソースコードは、数値の100を表す式です。
`"abc"`というソースコードは、文字列の「abc」を表す式です。
同様に、`HelloWorld`というソースコードは、`HelloWorld`というラテン文字の塊が意味するものを表す式です。
そして、式を評価した結果は特にprint系の命令を書かなくとも自動的に出力されす。

1個の数値や文字列だけでなく式を書くことができるので、例えば次のように書くこともできます。

```bash:
$ fl7 '1 + 2'
3
```

`fl7`コマンドは簡易的な計算機コマンドとして使うことができます。

----

数字の塊はそれが表す10進表記の数値を意味しますが、`HelloWorld`というラテン文字の塊は何を意味するのでしょうか。
これは、他の多くのプログラミング言語で変数名や関数名などに使われているものと同じ**識別子**です。
識別子は通常、何らかの「名前の付いたもの」を呼び表すために使います。

例えば次のように入力すると、入力した文字列以外の何かが得られます。

```bash:
$ fl7 PI
3.141592653589793
```

しかしここでは`HelloWorld`という名前の変数も関数も何もなく、完全に初出の識別子です。
他の多くの言語では未定義の識別子に対してコンパイルエラーにしたり「空」を表したりしますが、fluorite-7ではどうなるのでしょうか。
fluorite-7には、（デフォルトでは）初出の識別子を同内容の文字列として解釈する仕様があります。
これによって、`HelloWorld`という初出の識別子は「HelloWorld」という文字列を意味するようになります。

fluorite-7にはいくつかの組み込みの名前が存在しますが、それらは例外なく小文字のラテン文字を含みません。
そのため、`HelloWorld`という名前を明示的に使用しない限り、この識別子は必ず未定義となります。

「HelloWorld」という未定義の識別子1個で構成された式が書かれたソースコードを与えたので、それが意味する「HelloWorld」という文字列が出力されました。

# レッスン4　真のHello, world!

今回は「Hello, world!」を出力してみましょう。

fluorite-7で文字を標準出力に出すには、それを表す式を書いて、`fl7`コマンドの第1引数に与えればよいのでした。
前回は未定義の識別子を使って文字列を得る式を書いていましたが、「Hello, world!」という文字列には記号や空白が含まれています。
これをそのまま`fl7`に与えても、次のように失敗します。

```bash:
$ fl7 'Hello, world!'
/usr/local/bin/fluorite-7/fluorite-7.js:16557
    throw peg$buildStructuredError(
    ^

SyntaxError: Expected "!=", "!==", "!|", "%", "&", "&&", "(", "*", "**", "+", ",", "-", "->", ".", "..", "/", ":", "::", "::=", ":=", ";", "<", "<<", "<=", "<=>", "=", "==", "===", "=>", "=~", ">", ">=", ">>", "?", "?:", "?|", "@", "@@", "[", "^", "`", "{", "|", "||", "~", or end of input but "!" found.
    at peg$buildStructuredError (/usr/local/bin/fluorite-7/fluorite-7.js:777:12)
    at Object.peg$parse [as parse] (/usr/local/bin/fluorite-7/fluorite-7.js:16557:11)
    at parse ([eval]:10:25)
    at [eval]:257:14
    at ContextifyScript.Script.runInThisContext (vm.js:50:33)
    at Object.runInThisContext (vm.js:139:38)
    at Object.<anonymous> ([eval]-wrapper:6:22)
    at Module._compile (module.js:652:30)
    at evalScript (bootstrap_node.js:463:27)
    at startup (bootstrap_node.js:164:9)
```

----

「Hello, world!」という文字列を得るには、文字列リテラルを使用します。

```bash:
$ fl7 '"Hello, world!"'
Hello, world!
```

文字列をダブルクォート`"`で囲んだものは**埋め込み可能文字列**です。
埋め込み可能文字列には、バックスラッシュ`\`・ドル`$`・ダブルクォート`"`以外の文字は、そのまま含めることができます。

# まとめ

- fluorite-7（fl7）はLinux上で動作するスクリプト言語です。
- fluorite-7はどこにでもインストールできます。
- `fl7`コマンドの第1引数にfluorite-7ソースコードを与えて実行すると、ソースコードを評価した結果を標準出力に書き出します。
- 未定義の識別子は同内容の文字列になります。
- `\` `$` `"`以外の文字列を`"`で囲むと文字列リテラルになります。

# Part 2

[次回→](https://qiita.com/MirrgieRiana/items/27cd5c4f73b9c65eb168)