fluorite-7　日本語リファレンス　文字列


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

# 概要

`"` `"`で囲うと文字列が作れる。

```bash:
$ fl7 '  "abc 123 !#%&()"  '
abc 123 !#%&()
```

`"` `"`内ではいくつかのエスケープが使える。

```bash:
$ fl7 '  "Tab[\t] Break[\n]"  '
Tab[    ] Break[
]
```

`$identifier`で変数の埋め込みができる。

```bash:
$ fl7 '  "$PI"  '
3.141592653589793
```

`$%.2f(formula)`とかでフォーマット付き埋め込みができる。

```bash:
$ fl7 '  "$%.2f(PI) $%05d(456)"  '
3.14 00456
```

`'` `'`で囲うと埋め込みは無効になりエスケープの挙動が変わる。

```perl:
'[$PI][\t][\n]'
```

```bash:
$ fl7 '  '\''[$PI][\t][\n]'\''  '
[$PI][t][n]
```

中置`&`で文字列を連結できる。

```bash:
$ fl7 '  "abc" & "123"  '
abc123
```

前置`&`で値を文字列に変換できる。

```bash:
$ fl7 '  TYPE(PI), TYPE(&PI)  '
NUMBER
STRING
```

前置`$#`で文字列の長さが得られる。

```bash:
$ fl7 '  $#"abcdef"  '
6
```

# リテラル

## 文字列リテラル

文字列リテラル`'contents'`は、`'`で始まり、0個以上の文字列リテラルコンテントを含み、`'`で終わるリテラルである。

文字列リテラルコンテントは、次のうちのいずれかである。

- 一般文字
- エスケープ

**Tips** 文字列リテラルはbash上のワンライナーとしてfluorite-7を使う際に不便なので、多くの場合、代わりの文字列リテラルを使った方がよい。

```bash:
$ fl7 \''abc123 "[]'\'
abc123 "[]
$ fl7 '%>abc123 "[]<%'
abc123 "[]
```

### 一般文字

`'` `\`以外のあらゆるUTF-16符号単位を指す。
サロゲートペアは2文字分の扱いである。
改行は、実際にそこに埋め込まれている改行文字を表す。

```perl:
'abc123 "[]'
```

```bash:
$ fl7 \''abc123 "[]'\'
abc123 "[]
```

### エスケープ

エスケープ`\a`は、`\`と任意の一つのUTF-16符号単位`a`の列であり、`a`がどのような文字であっても`a`そのものを表す。

例えば`'\n'`は`'n'`と同一である。

```perl:
'[\n][\'][\\]'
```

```bash:
$ fl7 \''[\n][\'\''][\\]'\'
[n]['][\]
```

## 埋め込み文字列リテラル

埋め込み文字列リテラル`"contents"`は、`"`で始まり、0個以上の埋め込み文字列リテラルコンテントを含み、`"`で終わるリテラルである。

埋め込み文字列リテラルコンテントは、次のうちのいずれかである。

- 一般文字
- エスケープ
- ドル埋め込み
- 識別子埋め込み
- 式埋め込み
- 書式付き式埋め込み

### 一般文字

`"` `\` `$`以外のあらゆるUTF-16符号単位を指す。
サロゲートペアは2文字分の扱いである。
改行は、実際にそこに埋め込まれている改行文字を表す。

```perl:
"abc123 '[]"
```

```bash:
$ fl7 '"abc123 '\''[]"'
abc123 '[]
```

### エスケープ

エスケープ`\a`は、`\`と決められた文字列`a`で構成される列である。

エスケープは、`a`に応じて異なる文字を表す。
以下は取りうる`a`と対応する文字の組である。
表中で`F`で示した個所には任意の1文字の16進数（`[a-zA-Z0-9]`）が入る。

|`a`|対応する文字|
|:-:|:-:|
|`\`|`\`|
|`"`|`"`|
|`'`|`'`|
|`$`|`$`|
|`b`|\x08　後退|
|`f`|\x0C　書式送り|
|`n`|\x0A　改行（ラインフィード）|
|`r`|\x0D　復帰（キャリッジリターン）|
|`t`|\x09　水平タブ|
|`0`|\x00　NULL文字|
|`xFF`|`FF`部分の16進数によって表されるUTF-16符号単位|
|`uFFFF`|`FFFF`部分の16進数によって表されるUTF-16符号単位|

```perl:
"[\\][\"][\'][\$][\t][\n][\x3D][\u3042]"
```

```bash:
$ fl7 '"[\\][\"][\'\''][\$][\t][\n][\x3D][\u3042]"'
[\]["]['][$][   ][
][=][あ]
```

### ドル埋め込み

ドル埋め込み`$$`は、`$`を表す。

```bash:
$ fl7 '"$$"'
$
```

### 識別子埋め込み

識別子埋め込み`$identifier`は、`identifier`が示す識別子が表す値の文字列化したものを表す。

```bash:
$ fl7 '"$PI"'
3.141592653589793

$ fl7 'list : [1 .. 3]; "$list"'
1,2,3
```

### 式埋め込み

式埋め込み`$(expression)`は、`expression`が示す式の値の文字列化したものを表す。

```bash:
$ fl7 '"$(PI * 1234)"'
3876.7253345298045
```

### 書式付き式埋め込み

書式付き式埋め込み`$%format(expression)`は、`expression`が示す式の値を`format`に従って文字列化したものを表す。

`format`は、`LWPC`で表される。
`L`は、0個以上の`0`か`-`である。
`W`は、0以外の整数である。
`P`は、`.`の後に整数が続いたものである。
`C`は、`d` `s` `f`のうちのいずれかである。
すなわち、`format`はPerlの正規表現でいうところの`([0\-])*([1-9][0-9]*)?(\.(0|[1-9][0-9]*))?[dsf]`である。

----

`C`が`d`である場合、整数の埋め込みである。
`C`が`s`である場合、文字列の埋め込みである。
`C`が`f`である場合、実数の埋め込みである。

----

`P`が指定されている場合、実数の埋め込みにおいて、小数点以下の桁数を指定する。

```bash:
$ fl7 '"$%f(3.1415)"'
3.141500

$ fl7 '"$%.2f(3.1415)"'
3.14

$ fl7 '"$%.10f(3.1415)"'
3.1415000000
```

----

`W`が指定されている場合、少なくともその幅になるように右詰めで半角空白が追加される。
幅が`W`を超過する場合は何も作用しない。

```bash:
$ fl7 '"[$%5d(123)]"'
[  123]

$ fl7 '"[$%d(123)]"'
[123]

$ fl7 '"[$%2d(123)]"'
[123]
```

----

`L`に`0`が指定されている場合、`W`において詰められる文字が`0`になる。

```bash:
$ fl7 '"[$%5d(123)]"'
[  123]

$ fl7 '"[$%05d(123)]"'
[00123]
```

----

`L`に`-`が指定されている場合、`W`は左詰めとなる。

```bash:
$ fl7 '"[$%5s("abc")]"'
[  abc]

$ fl7 '"[$%-5s("abc")]"'
[abc  ]
```

----

負の数値を`0`を使用して右詰めにするとき、符号は追加される`0`の左側に付けられる。

```bash:
$ fl7 '"[$%05s(-123)]"'
[0-123]

$ fl7 '"[$%05d(-123)]"'
[-0123]
```

## ヒアドキュメント

ヒアドキュメント`<< 'delimiter'LBstringLB delimiter`は、`delimiter`が現れるまでのすべての行を文字列にするリテラルである。
`delimiter`は任意の識別子である。
`LB`は改行（`[\r\n]|\r\n`）である。
`string`は`delimiter`の行によって挟まれた任意の文字列である。

ヒアドキュメントは次の3個の部分に分かれる。

- デリミタ宣言
- ヒアドキュメントコンテント
- デリミタ

各部分の間には、必ず1個の改行`LB`が挟まる。

```perl:
str : << 'END'
string string string string
string string string string
string string string string
END
```

```bash:
$ fl7 'str : << '\''END'\''
string string string string
string string string string
string string string string
END'
string string string string
string string string string
string string string string
```

### デリミタ宣言

デリミタ宣言は次のシーケンスである。

- `<< 'delimiter'`

`<<`と`'delimiter'`の間には任意の空白文字やコメントを入れてもよい。

```perl:
str : << /*
  コメント
*/
// コメント
'END'
string string string string
string string string string
string string string string
END
```

`'delimiter'`を囲っている`'`は省略できる。

```perl:
str : << END
string string string string
string string string string
string string string string
END
```

### ヒアドキュメントコンテント

ヒアドキュメントコンテントは、デリミタを含まない任意のUTF-16符号単位列である。

行中に埋め込まれる形でデリミタと同じ文字列が現れた場合、それはデリミタとして判定されない。

```perl:
str : << END
string END string string
END string string string
string string string string
END
```

ヒアドキュメントコンテントの前後には自動的に改行が付与されない。
すなわち、次のコードは真を返す。

```perl:
"string" === << END
string
END
```

### デリミタ

デリミタは次のシーケンスである。

- `delimiter`

`delimiter`は行頭に来なければならない。
ただし、`delimiter`の前に半角空白およびタブ文字を任意個挿入してもよい。

```perl:
  << 'END'
    string
  END
```

`delimiter`の直後は行末かソースコードの末尾でなければならない。

## 埋め込みヒアドキュメント

埋め込みヒアドキュメント`<< "delimiter"LBstringLB delimiter`は、`delimiter`が現れるまでのすべての行を文字列にするリテラルであるヒアドキュメントの亜種である。
大まかな仕様はヒアドキュメントに準ずる。

埋め込みヒアドキュメントでは、ヒアドキュメントコンテントの代わりに埋め込みヒアドキュメントコンテントを使用する。

```perl:
str : << "END"
string string string string
string string string string
string string string string
END
```

```bash:
$ fl7 'str : << '"'END'"'
string string string string
string string string string
string string string string
END'
string string string string
string string string string
string string string string
```

### デリミタ宣言

埋め込みヒアドキュメントのデリミタ宣言の`delimiter`は、`"` `"`で囲われていなければならない。

### 埋め込みヒアドキュメントコンテント

埋め込みヒアドキュメントコンテントは、0個以上の次のシーケンスで構成される。

- 一般文字
- ドル埋め込み
- 識別子埋め込み
- 式埋め込み
- 書式付き式埋め込み

このうち、一般文字はヒアドキュメントコンテントに準ずる。
ドル埋め込み・識別子埋め込み・式埋め込み・書式付き式埋め込みは、埋め込み文字列リテラルに準ずる。

## EFL（Embedded Fluorite）

EFLリテラル`%>contents<%`は、`%>`で始まり、0個以上のEFLリテラルコンテントを含み、`<%`で終わるリテラルである。

EFLリテラルコンテントは、次のうちのいずれかである。

- 一般文字
- `<%`埋め込み
- EFLコメント
- 式埋め込み

**Tips** EFLはERBを真似て作られた、HTMLの記述に向いた文字列リテラルである。

- [class ERB (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/class/ERB.html)

ただし、ERBやPHPと異なり、EFLは純粋な「ただの」文字列リテラルであり、標準出力への影響は一切なく、式の一部である。

```perl:
%>
  <ul>
    <%= 1 .. 5 | %>
      <li><%= _ * 10 %></li>
    <% %>
  </ul>
<%
```

```bash:
$ fl7 '%>
  <ul>
    <%= 1 .. 5 | %>
      <li><%= _ * 10 %></li>
    <% %>
  </ul>
<%'

  <ul>

      <li>10</li>

      <li>20</li>

      <li>30</li>

      <li>40</li>

      <li>50</li>

  </ul>

```

### 一般文字

`<%`の左側の`<`を除くあらゆるUTF-16符号単位を指す。
言い換えると、「直後に`%`が続く`<`」以外のすべての文字である。

```bash:
$ fl7 '%>abc123 "[\n][\<][<][\"][\%][%][$][$PI][\$][$$]<%'
abc123 "[\n][\<][<][\"][\%][%][$][$PI][\$][$$]
```

### `<%`埋め込み

`<%%`は、`<%`を表す。

```bash:
$ fl7 '%>....<%%....<%'
....<%....
```

### EFLコメント

EFLコメント`<%# comment %>`は、`<%#`で始まり、`%>`を含まない任意の文字列`comment`が続き、`%>`で終わるシーケンスである。

EFLコメントは通常のコメントと同様、完全に無視される。

```bash:
$ fl7 '%>....<%#ここから....<%.<%=....ここまで%>....<%'
........
```

### 式埋め込み

式埋め込み`<%= expression %>`は、`<%=`で始まり、任意の式`expression`が続き、`%>`で終わるシーケンスである。
式埋め込みは`expression`の文字列化したものを表す。

```bash:
$ fl7 '%>..<%= PI %>..<%= "abc" %>..<%= [1 .. 3] %>..<%'
..3.141592653589793..abc..1,2,3..
```

**Tips** 式埋め込みの中にEFLを記述できる。

```bash:
$ fl7 '%>..<%= 1 .. 3 | %><b><%= _ %></b><% %>..<%'
..<b>1</b><b>2</b><b>3</b>..
```

下のコードは上のコードを見やすく改変したものである。

```perl:
%>
  ..
    <%= 1 .. 3 | %>
      <b>
        <%= _ %>
      </b>
    <% %>
  ..
<%
```

入れ子にされたEFLは、テンプレートエンジンのように振る舞う。
ループのほか、関数化や条件分岐も可能である。
EFLは飽くまで文字列リテラルであるため、柔軟な記述ができる。

```perl:
%>
  <%=
    f : _ -> _ ? %>
      Yes
    <% : %>
      No
    <%;
    f(TRUE), f(FALSE)
  %>
<%
```

```bash:
$ fl7 '%><%= f : _ -> _ ? %>Yes<% : %>No<%; f(TRUE), f(FALSE) %><%'
YesNo
```

#### ストリーマの埋め込み

式埋め込みはストリーマを改行無しで埋め込む。

```bash:
$ fl7 '%><%= 1 .. 9 %><%'
123456789
```

# 変換

## 文字列化

文字列の文字列化は、その文字列そのものである。

```bash:
$ fl7 '&"abc"'
abc
```

## 数値化

文字列の数値化は、文字列を10進数としてパースする。

```bash:
$ fl7 '+"00100", +"00100.001", +"00100.001E2"'
100
100.001
10000.1
```

## 論理値化

文字列の論理値化は、その文字列が空文字でない場合にTRUE、空文字の場合にFALSEを返す。

```bash:
$ fl7 '?"", ?"false", ?"FALSE", ?"0", ?" "'
FALSE
TRUE
TRUE
TRUE
TRUE
```

## 長さ取得

文字列の長さは、その文字列に含まれるUTF-16符号単位の個数である。
サロゲートペアは長さ2の文字として扱われる。

```bash:
$ fl7 '$#"𩸽", $#"", $#" ", $#"abc", $#"あ"'
2
0
1
3
1
```