概要
"
"
で囲うと文字列が作れる。
$ fl7 ' "abc 123 !#%&()" '
abc 123 !#%&()
"
"
内ではいくつかのエスケープが使える。
$ fl7 ' "Tab[\t] Break[\n]" '
Tab[ ] Break[
]
$identifier
で変数の埋め込みができる。
$ fl7 ' "$PI" '
3.141592653589793
$%.2f(formula)
とかでフォーマット付き埋め込みができる。
$ fl7 ' "$%.2f(PI) $%05d(456)" '
3.14 00456
'
'
で囲うと埋め込みは無効になりエスケープの挙動が変わる。
'[$PI][\t][\n]'
$ fl7 ' '\''[$PI][\t][\n]'\'' '
[$PI][t][n]
中置&
で文字列を連結できる。
$ fl7 ' "abc" & "123" '
abc123
前置&
で値を文字列に変換できる。
$ fl7 ' TYPE(PI), TYPE(&PI) '
NUMBER
STRING
前置$#
で文字列の長さが得られる。
$ fl7 ' $#"abcdef" '
6
リテラル
文字列リテラル
文字列リテラル'contents'
は、'
で始まり、0個以上の文字列リテラルコンテントを含み、'
で終わるリテラルである。
文字列リテラルコンテントは、次のうちのいずれかである。
- 一般文字
- エスケープ
Tips 文字列リテラルはbash上のワンライナーとしてfluorite-7を使う際に不便なので、多くの場合、代わりの文字列リテラルを使った方がよい。
$ fl7 \''abc123 "[]'\'
abc123 "[]
$ fl7 '%>abc123 "[]<%'
abc123 "[]
一般文字
'
\
以外のあらゆるUTF-16符号単位を指す。
サロゲートペアは2文字分の扱いである。
改行は、実際にそこに埋め込まれている改行文字を表す。
'abc123 "[]'
$ fl7 \''abc123 "[]'\'
abc123 "[]
エスケープ
エスケープ\a
は、\
と任意の一つのUTF-16符号単位a
の列であり、a
がどのような文字であってもa
そのものを表す。
例えば'\n'
は'n'
と同一である。
'[\n][\'][\\]'
$ fl7 \''[\n][\'\''][\\]'\'
[n]['][\]
埋め込み文字列リテラル
埋め込み文字列リテラル"contents"
は、"
で始まり、0個以上の埋め込み文字列リテラルコンテントを含み、"
で終わるリテラルである。
埋め込み文字列リテラルコンテントは、次のうちのいずれかである。
- 一般文字
- エスケープ
- ドル埋め込み
- 識別子埋め込み
- 式埋め込み
- 書式付き式埋め込み
一般文字
"
\
$
以外のあらゆるUTF-16符号単位を指す。
サロゲートペアは2文字分の扱いである。
改行は、実際にそこに埋め込まれている改行文字を表す。
"abc123 '[]"
$ 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符号単位 |
"[\\][\"][\'][\$][\t][\n][\x3D][\u3042]"
$ fl7 '"[\\][\"][\'\''][\$][\t][\n][\x3D][\u3042]"'
[\]["]['][$][ ][
][=][あ]
ドル埋め込み
ドル埋め込み$$
は、$
を表す。
$ fl7 '"$$"'
$
識別子埋め込み
識別子埋め込み$identifier
は、identifier
が示す識別子が表す値の文字列化したものを表す。
$ fl7 '"$PI"'
3.141592653589793
$ fl7 'list : [1 .. 3]; "$list"'
1,2,3
式埋め込み
式埋め込み$(expression)
は、expression
が示す式の値の文字列化したものを表す。
$ 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
が指定されている場合、実数の埋め込みにおいて、小数点以下の桁数を指定する。
$ fl7 '"$%f(3.1415)"'
3.141500
$ fl7 '"$%.2f(3.1415)"'
3.14
$ fl7 '"$%.10f(3.1415)"'
3.1415000000
W
が指定されている場合、少なくともその幅になるように右詰めで半角空白が追加される。
幅がW
を超過する場合は何も作用しない。
$ fl7 '"[$%5d(123)]"'
[ 123]
$ fl7 '"[$%d(123)]"'
[123]
$ fl7 '"[$%2d(123)]"'
[123]
L
に0
が指定されている場合、W
において詰められる文字が0
になる。
$ fl7 '"[$%5d(123)]"'
[ 123]
$ fl7 '"[$%05d(123)]"'
[00123]
L
に-
が指定されている場合、W
は左詰めとなる。
$ fl7 '"[$%5s("abc")]"'
[ abc]
$ fl7 '"[$%-5s("abc")]"'
[abc ]
負の数値を0
を使用して右詰めにするとき、符号は追加される0
の左側に付けられる。
$ fl7 '"[$%05s(-123)]"'
[0-123]
$ fl7 '"[$%05d(-123)]"'
[-0123]
ヒアドキュメント
ヒアドキュメント<< 'delimiter'LBstringLB delimiter
は、delimiter
が現れるまでのすべての行を文字列にするリテラルである。
delimiter
は任意の識別子である。
LB
は改行([\r\n]|\r\n
)である。
string
はdelimiter
の行によって挟まれた任意の文字列である。
ヒアドキュメントは次の3個の部分に分かれる。
- デリミタ宣言
- ヒアドキュメントコンテント
- デリミタ
各部分の間には、必ず1個の改行LB
が挟まる。
str : << 'END'
string string string string
string string string string
string string string string
END
$ 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'
の間には任意の空白文字やコメントを入れてもよい。
str : << /*
コメント
*/
// コメント
'END'
string string string string
string string string string
string string string string
END
'delimiter'
を囲っている'
は省略できる。
str : << END
string string string string
string string string string
string string string string
END
ヒアドキュメントコンテント
ヒアドキュメントコンテントは、デリミタを含まない任意のUTF-16符号単位列である。
行中に埋め込まれる形でデリミタと同じ文字列が現れた場合、それはデリミタとして判定されない。
str : << END
string END string string
END string string string
string string string string
END
ヒアドキュメントコンテントの前後には自動的に改行が付与されない。
すなわち、次のコードは真を返す。
"string" === << END
string
END
デリミタ
デリミタは次のシーケンスである。
delimiter
delimiter
は行頭に来なければならない。
ただし、delimiter
の前に半角空白およびタブ文字を任意個挿入してもよい。
<< 'END'
string
END
delimiter
の直後は行末かソースコードの末尾でなければならない。
埋め込みヒアドキュメント
埋め込みヒアドキュメント<< "delimiter"LBstringLB delimiter
は、delimiter
が現れるまでのすべての行を文字列にするリテラルであるヒアドキュメントの亜種である。
大まかな仕様はヒアドキュメントに準ずる。
埋め込みヒアドキュメントでは、ヒアドキュメントコンテントの代わりに埋め込みヒアドキュメントコンテントを使用する。
str : << "END"
string string string string
string string string string
string string string string
END
$ 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の記述に向いた文字列リテラルである。
ただし、ERBやPHPと異なり、EFLは純粋な「ただの」文字列リテラルであり、標準出力への影響は一切なく、式の一部である。
%>
<ul>
<%= 1 .. 5 | %>
<li><%= _ * 10 %></li>
<% %>
</ul>
<%
$ 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符号単位を指す。
言い換えると、「直後に%
が続く<
」以外のすべての文字である。
$ fl7 '%>abc123 "[\n][\<][<][\"][\%][%][$][$PI][\$][$$]<%'
abc123 "[\n][\<][<][\"][\%][%][$][$PI][\$][$$]
<%
埋め込み
<%%
は、<%
を表す。
$ fl7 '%>....<%%....<%'
....<%....
EFLコメント
EFLコメント<%# comment %>
は、<%#
で始まり、%>
を含まない任意の文字列comment
が続き、%>
で終わるシーケンスである。
EFLコメントは通常のコメントと同様、完全に無視される。
$ fl7 '%>....<%#ここから....<%.<%=....ここまで%>....<%'
........
式埋め込み
式埋め込み<%= expression %>
は、<%=
で始まり、任意の式expression
が続き、%>
で終わるシーケンスである。
式埋め込みはexpression
の文字列化したものを表す。
$ fl7 '%>..<%= PI %>..<%= "abc" %>..<%= [1 .. 3] %>..<%'
..3.141592653589793..abc..1,2,3..
Tips 式埋め込みの中にEFLを記述できる。
$ fl7 '%>..<%= 1 .. 3 | %><b><%= _ %></b><% %>..<%'
..<b>1</b><b>2</b><b>3</b>..
下のコードは上のコードを見やすく改変したものである。
%>
..
<%= 1 .. 3 | %>
<b>
<%= _ %>
</b>
<% %>
..
<%
入れ子にされたEFLは、テンプレートエンジンのように振る舞う。
ループのほか、関数化や条件分岐も可能である。
EFLは飽くまで文字列リテラルであるため、柔軟な記述ができる。
%>
<%=
f : _ -> _ ? %>
Yes
<% : %>
No
<%;
f(TRUE), f(FALSE)
%>
<%
$ fl7 '%><%= f : _ -> _ ? %>Yes<% : %>No<%; f(TRUE), f(FALSE) %><%'
YesNo
ストリーマの埋め込み
式埋め込みはストリーマを改行無しで埋め込む。
$ fl7 '%><%= 1 .. 9 %><%'
123456789
変換
文字列化
文字列の文字列化は、その文字列そのものである。
$ fl7 '&"abc"'
abc
数値化
文字列の数値化は、文字列を10進数としてパースする。
$ fl7 '+"00100", +"00100.001", +"00100.001E2"'
100
100.001
10000.1
論理値化
文字列の論理値化は、その文字列が空文字でない場合にTRUE、空文字の場合にFALSEを返す。
$ fl7 '?"", ?"false", ?"FALSE", ?"0", ?" "'
FALSE
TRUE
TRUE
TRUE
TRUE
長さ取得
文字列の長さは、その文字列に含まれるUTF-16符号単位の個数である。
サロゲートペアは長さ2の文字として扱われる。
$ fl7 '$#"𩸽", $#"", $#" ", $#"abc", $#"あ"'
2
0
1
3
1