テキスト書式

PictureFan では、タイトルバーやタブなど様々な箇所で、書式を指定して任意の内容を表示することができます。
また、ファイル名の一括変換などでも、書式によって自由度の高い指定を行うことができます。

メインウィンドウ及びサムネイルのメニューにある [ヘルプ] -> [テキスト書式のテスト] で、書式を試してみることができます。

目次

  1. 概要
  2. リテラル
  3. 条件式
  4. 繰り返し
    1. 整数
    2. 実数
    3. 論理型
    4. 文字列
    5. null
  5. 変数
    1. プロパティ
  6. 定数
  7. 配列
  8. 連想配列
  9. 演算子
    1. 論理否定演算子
    2. 正符号演算子
    3. 負符号演算子
    4. 乗算演算子
    5. 除算演算子
    6. 加算演算子
    7. 減算演算子
    8. 小なり演算子
    9. 大なり演算子
    10. 以下演算子
    11. 以上演算子
    12. 等値演算子
    13. 非等値演算子
    14. 論理積演算子
    15. 論理和演算子
    16. 代入演算子
    17. 順次評価演算子
  10. サンク
  11. 関数
  12. ユーザー関数
  13. 組み込み関数
    1. 型変換関数
    2. 型判定関数
    3. 論理演算関数
    4. 文字列関数
    5. 配列関数
    6. 数学関数
    7. ビット演算関数
    8. 制御構造関数
    9. 式評価関数
    10. 入出力関数
    11. 乱数関数
    12. 日時関数
    13. パス関数
    14. ユーザー入力関数
  14. Tips

概要

テキスト書式は、テキストの中に式を埋め込めるようにした表記法です。

例えば、一括変換で出力するファイル名に以下のように連番を付けたいとします。

File1.jpg
File2.jpg
File3.jpg
...

この場合、ファイル名の指定を File$(number).jpg とすることで、$(number) の部分が連番に置き換えられます。

このようにテキストの中に変化する値を入れるのが、テキスト書式の基本的な使い方です。

リテラル

$ 記号以外の文字は、そのままの文字列になります。
$ 記号には後述する特殊な役割があります。
$ を文字として表したい場合は $$ と記述します。

以下は「Hello, World!」を出力します。

Hello, World!

$(式) の形式で、() 内の式を評価し、その結果の値を取ります。
式の中では変数や関数、演算子などが使用できます。

$:(式) の形式で、() 内の式を評価し、null 値を取ります。
代入などの副作用のある式を記述し、その結果の値は不要である場合などに使用します。

すべての式は値を持ちます。

リテラル中に現れた式は、その値が文字列に変換され、前の文字列に連結されます。

条件式

$?(式) の形式で、その式を評価した結果が真である場合に、対応する $^ までを評価します。

$?(x==0)xは0です$^

条件式は入れ子にすることができます。

$?(x>0)xは0より大きい$?(x>100)さらに100より大きい$^$^

$! で else を表し、式が偽である場合対応する $^ までを評価します。
$?(式)式が真の場合$!式が偽の場合$^ という形式で使用します。

$?(x==0)xは0です$!xは0ではありません$^

また、$!?(式) で else if を表します。
$?(式1)式1が真の場合$!?(式2)式1が偽で式2が真の場合$^ という形式になります。

$?(x==0)xは0です$!?(x<0)xは負数です$^

$! の直後にリテラルとして ? を書くことはできないので、代わりに $!$('?') のように記述します。

条件式は if 関数を使って実現することもできます。

$(if(x==0,'xは0です','xは0ではありません'))

繰り返し

$@(条件式)実行文$^ の形式で、条件式を評価した結果が真である間、実行文を繰り返し評価します。

$:(#i=0)$@(#i<5)$(#i)$:(#i=#i+1)$^

繰り返しは $/ で抜けることができます。
繰り返し外で $/ が現れた場合、そこで解析を終了します。

$:(#i=0)$@(true)$?(#i<5)$/$^$:(#i=#i+1)$^

誤って無限ループになってしまったり、実行に時間が掛かり過ぎてしまうことの無いように、繰り返しの回数は上限を100回までに制限しています。
繰り返し内で更に繰り返しが行われた場合、繰り返し回数を累積して制限が適用されます。

繰り返しは loop 関数を使って実現することもできます。

$:(#i=0;loop(~(#i<5),~(out(#i);#i=#i+1)))

以下の型が存在します。

識別子型名内容
integer整数符号付き64ビット整数
real実数64ビット倍精度浮動小数点数(IEEE 754)
boolean論理型true (真) 及び false (偽) の二値
string文字列UTF-16 文字列
nullnull無効値を表す型
array配列配列
dictionary連想配列連想配列
function関数関数を表す型
thunkサンクサンクを表す型

整数

0x で始まると16進数、0o で始まると8進数、0b で始まると2進数の整数となります。
それ以外の数字は10進数となります。

実数

数字と小数点 . を使用して実数を表します。実数の表記は常に10進数とします。
指数表現も使用でき、数値の後に e もしくは E と、それに続けて数値 N を指定して、10の N 乗を表します。
例えば 2.0e3 は 2000 に、2.0e-3 は 0.002 になります。
指数は整数でなければなりません。

論理型

論理型は true (真) または false (偽) のいずれかの値を取ります。

論理型が要求される文脈で論理型以外の型が指定された場合には、以下の規則に従って論理型に変換されます。

論理型への変換規則
integer0 でなければ真
real0.0 でなければ真
string空でなければ真
array要素数が0でなければ真
dictionary要素数が0でなければ真
null常に偽

文字列

' で囲むことで、文字列を表します。
その際、文字列内で \ 記号を使用することで特殊な文字を表します。

指定内容
\\\ 記号
\'' 記号
\tタブ
\r復帰
\n改行

\x に続けて16進数4文字で、指定されたコード(UTF-16)の文字を表します。

リテラルも文字列として扱われますが、\ 記号による特殊な文字の表現は行えません。
例えば \n と記述しても、そのまま \ と n の2文字の文字列と解釈されます。

関数などで文字列の位置を指定する時は、最初の要素の位置を0とします。

null

null 型は無効値を表す型で、null 型が取れる値は定数 null のみです。

変数

変数には予め定義されているものと、ユーザーが定義できるユーザー変数があります。
予め定義されている変数の値を変更することはできません。

変数は動的型付けであり、変数それ自身は特定の型を持たず、いずれの型の値も代入することができます。

変数の識別子は1文字目がアルファベットで、2文字目以降はアルファベット、数字、_ のいずれかです。
ユーザー変数の識別子は、予め定義されている変数や組み込み関数などとは異なる名前空間を持ちます。

ユーザー変数には明示的な宣言は存在せず、その変数が最初に評価される時点でインスタンスが生成されます。
その際、初期値は null になります。

ユーザー変数はグローバル変数とローカル変数に分けられます。
グローバル変数は、先頭に # を付けて表します。
ローカル変数は、末尾に # を付けて表します。
いずれも # と識別子の間には空白などを入れずに続けて記述します。

$:(#x=0)

同名のグローバル変数は、テキスト書式全体で唯一の実体を持ちます。
ローカル変数は同名でも出現場所により異なる実体を持つ可能性があります。
ローカル変数のスコープは以下の ... で示された範囲になります。

スコープがネストしている場合、内側のスコープから外側のスコープのローカル変数を利用することはできません。

ローカル変数が関数やサンクによって束縛されている間、同じスコープ内のすべてのローカル変数の寿命が延長されます。

プロパティ

ユーザー変数にはそれ自身の値とは別に、名前を付けた任意の値をプロパティとして設定することができます。
プロパティにアクセスするには、変数名の後に . を付けて 変数名.プロパティ名 のように記述します。

プロパティ名は変数名と同様に1文字目がアルファベットで、2文字目以降はアルファベット、数字、_ のいずれかです。

以下の例では変数 #a の値として0を、変数 #a のプロパティ b の値として 'foo' を設定しています。

$:(#a=0;#a.b='foo')$(#a.b)

プロパティが関数またはサンクの値を持っている時、その関数またはサンクの中で識別子 self がそのプロパティを持つ変数の参照を表します。

以下の例では変数 #a のプロパティ b の値として 'foo' を設定し、プロパティ b の値を返す関数をプロパティ f に設定しています。

$:(#a.b='foo';#a.f=^()(self.b))$(#a.f())

定数

以下の定数が定義されています。

識別子内容
true論理値の真boolean
false論理値の偽boolean
null無効値null
pi円周率(π)real
epsilon計算機イプシロンreal
infinity正の無限値real
nan非数(Quiet NaN)real

配列

配列を作成するには、array 関数を使用します。
array 関数は作成する配列の要素数を最初の引数に取り、作成した配列を返します。
配列の各要素の初期値は array 関数の2番目の引数で指定し、指定がない場合は null になります。

配列の各要素にアクセスするには、配列[添字] のように記述します。
添字は整数値で 0 から 配列の要素数-1 までの範囲で指定します。

以下の例では、要素数10の配列を作成し、最初の要素に文字列 'zero' を代入しています。

$:(#a=array(10);#a[0]='zero')

配列の各要素は、それぞれの要素ごとに異なる型の値を保持できます。

配列の要素数は length 関数によって取得できます。
また、resize 関数によって要素数を変えることができます。
要素を削除するには remove 関数を使用します。

以下の例では、要素数10の配列を作成し各要素を0で初期化したあと、要素数を15に変更し増えた分の要素は1で初期化しています。

$:(#a=array(10,0))$:(resize(#a,15,1))

連想配列

連想配列を作成するには、dictionary 関数を使用します。
dictionary 関数は空の連想配列を返します。

連想配列の各要素にアクセスするには、連想配列[キー] のように記述します。
キーは1文字以上の長さの文字列です。

以下の例では、連想配列を作成しキー 'zero' に値0を代入しています。

$:(#a=dictionary();#a['zero']=0)

連想配列の各要素は、それぞれの要素ごとに異なる型の値を保持できます。

連想配列の要素数は length 関数によって取得できます。
要素を削除するには remove 関数を使用します。
要素を列挙するには foreach 関数を使用します。

演算子

以下の演算子が使用できます。
優先度の数値が小さいものほど先に評価されます。

優先度演算子記号結合規則内容
1!右結合論理否定(not)
+右結合正符号
-右結合負符号
2*左結合乗算
/左結合除算
3+左結合加算
-左結合減算
4<左結合小なり(より小さい)
>左結合大なり(より大きい)
<=左結合以下
>=左結合以上
5==左結合等値
!=左結合非等値
6&左結合論理積(and)
7|左結合論理和(or)
8=右結合代入
9;左結合順次評価

論理演算子(& 及び |)は短絡評価せずに常に両辺を評価します。
短絡評価を行いたい場合は、サンクを利用してください。

論理否定演算子

論理否定演算子 ! は !値 の形式で、右辺の値が true である場合は false、false である場合は true の値を取ります。

正符号演算子

正符号演算子 + は +値 の形式で、右辺の値を取ります。
右辺の値の型は整数型または実数型でなければなりません。

負符号演算子

負符号演算子 - は -値 の形式で、右辺の値の反数を取ります。
右辺の値の型は整数型または実数型でなければなりません。

乗算演算子

乗算演算子 * は、左辺の値に右辺の値を乗算した値を取ります。
両辺の値の型は整数型または実数型でなければなりません。
右辺または左辺の両方もしくはいずれかの型が実数型である場合、実数型の値を取ります。
両辺共に整数型である場合は、整数型の値を取ります。

除算演算子

除算演算子 / は、左辺の値から右辺の値を除算した値を取ります。
両辺の値の型は整数型または実数型でなければなりません。
右辺または左辺の両方もしくはいずれかの型が実数型である場合、実数型の値を取ります。
両辺共に整数型である場合は、整数型の値を取ります。
右辺の値が 0 である場合、実行時エラーとなります。

加算演算子

加算演算子 + は、左辺の値に右辺の値を加算した値を取ります。
両辺の値の型は整数型または実数型でなければなりません。
右辺または左辺の両方もしくはいずれかの型が実数型である場合、実数型の値を取ります。
両辺共に整数型である場合は、整数型の値を取ります。

減算演算子

減算演算子 - は、左辺の値から右辺の値を減算した値を取ります。
両辺の値の型は整数型または実数型でなければなりません。
右辺または左辺の両方もしくはいずれかの型が実数型である場合、実数型の値を取ります。
両辺共に整数型である場合は、整数型の値を取ります。

小なり演算子

小なり演算子 < は、左辺の値が右辺の値より小さい場合は true、それ以外の場合は false を取ります。

大なり演算子

大なり演算子 > は、左辺の値が右辺の値より大きい場合は true、それ以外の場合は false を取ります。

以下演算子

以下演算子 <= は、左辺の値が右辺の値より小さいか同じである場合は true、それ以外の場合は false を取ります。

以上演算子

以上演算子 >= は、左辺の値が右辺の値より大きいか同じである場合は true、それ以外の場合は false を取ります。

等値演算子

等値演算子 == は、左辺の値と右辺の値が同じである場合は true、それ以外の場合は false を取ります。

非等値演算子

非等値演算子 != は、左辺の値と右辺の値が異なる場合は true、それ以外の場合は false を取ります。

論理積演算子

論理積演算子 & は、左辺の値と右辺の値がいずれも true である場合は true、それ以外の場合は false を取ります。

論理和演算子

論理和演算子 | は、左辺の値と右辺の値のいずれかが true である場合は true、それ以外の場合は false を取ります。

代入演算子

代入演算子 = は、左辺の変数に右辺の値を代入し、その値を取ります。

順次評価演算子

順次評価演算子 ; は左オペランドと右オペランドを順に評価し、右オペランドの値を取ります。
C/C++ や JavaScript におけるコンマ演算子 , と同等のものです。

サンク

サンクは遅延評価される式を表します。
~(式) の形式で定義します。

サンクを組み込み関数の引数として渡すと、実際に値が必要になった時点で評価が行われます。
例えば以下のように if 関数の引数に副作用を伴う演算を記述したとします。

$(if(#x>0,#a=#a+1,#b=#b+1))

この場合、変数 #x の値に関わらず #a=#a+1#b=#b+1 の両方が評価されます。
これを以下のようにサンクに書き換えると、

$(if(#x>0,~(#a=#a+1),~(#b=#b+1)))

変数 #x の値が正の場合のみ #a=#a+1 が評価され、#x の値が正ではない場合のみ #b=#b+1 が評価されます。

サンクを & や | 演算子の右オペランドとすることで、短絡評価を行うことができます。
以下の例では、変数 #a が 0 の場合のみ #b に 1 加算されます。

$((#a==0)&~((#b=#b+1)==0))

サンクは変数に代入することができます。

$(#t=~(#a=#a+1);if(#a>0,#t,#a))

サンクを評価するには eval または eval_thunk 関数を利用します。

$(#t=~(#a=#a+1);eval(#t))

ユーザー関数の引数にサンクが渡された時、サンク型がそのまま渡ります。
必要に応じて関数内で評価を行います。

サンク中に書けるのは式であり、テキスト書式ではありません。
例えば ~($(#x>0)) のように $ 記号を使った記述はできません。

サンク内に記述されたローカル変数は、そのサンクが定義されたスコープ内の変数を名前で束縛します。
そのサンクを別のスコープから呼び出した場合も、元のスコープのローカル変数とみなされます。

以下の例では、ローカル変数 a# をサンク内で利用していて、同名のローカル変数が存在する別のスコープからそのサンクを評価しています。
サンク内の a# はそのサンクが定義されたスコープのものになり、また a# の値はサンクが評価された時点で評価されるので、eval(#t) の戻り値は 1 になります。

$:(#t=~(a#);a#=1)$(a#=0;eval(#t))

関数内で定義されたサンクが関数の引数をローカル変数として利用している場合、そのサンクが定義された関数と別の関数内で評価された時は、 評価された関数に同名の引数があればその引数の値に評価されます。
同名の引数がなければ null に評価されます。
以下の例では関数内で定義されたサンクを変数 #t に代入して評価し、また別の関数からも評価していますが、サンク内で利用している変数 x# はそれぞれの関数の引数となります。

$:(#f=^(x)(eval(#t=~(x#))))$:(#g=^(x)(x#=x#+1;eval(#t)))$(#f(0))$(#g(0))

サンクはローカル変数のスコープを作りません。
サンク内がスコープのローカル変数を利用したい場合は、サンク内で関数を定義して、その引数としてローカル変数を定義することで実現できます。

以下の例は 1 から 99 までの範囲の乱数を取るサンクを定義していますが、サンク内で関数を定義して、その引数をローカル変数として利用しています。

$:(#rand=~(^(a)(a#=random_seed();random(a#,1,99))(null)))

関数

関数にはユーザー関数組み込み関数があります。
ユーザー関数はユーザーが定義する関数です。
組み込み関数は予め用意されている関数です。

いずれも、関数(引数1, 引数2, ...) のような形で関数を呼び出します。
引数は左から順に評価されます。

関数は変数に代入することができます。

ユーザー関数

ユーザー関数は ^(引数)(式) の形式で定義します。
ユーザー関数の定義は関数そのものが値となります。
ユーザー関数を呼び出した際の戻り値は、式を評価した値になります。

ユーザー関数は無名関数であり、再利用する場合は変数に代入して利用します。

$(#f=^(x)(x#+1);#f(1))

変数に代入せずに呼び出すこともできます。

$(^(x)(x#+1)(1))

引数はローカル変数になるので、式の中で記述する際は末尾に # を付加します。
引数は , で区切って複数取ることができます。

$(#sum=^(x,y)(x#+y#);#sum(1,2))

引数を取らない場合は、空の () を記述します。

ユーザー関数の引数はデフォルトで値渡しされます。
引数を参照渡ししたい場合、reference 関数を使用します。

以下の例では、関数 #f の最初の呼び出しでは引数の変数 #a は値渡しのため変更されませんが、次の #f の呼び出しでは reference 関数を使用しているため参照渡しとなり、変数 #a の値が 1 に変更されます。

$:(#f=^(x)(x#=1))$(#a=0;#f(#a);#a)$(#f(reference(#a));#a)

関数内に記述されたローカル変数は、その関数が定義されたスコープ内の変数を名前で束縛します。
その関数を別のスコープから呼び出した場合も、元のスコープのローカル変数とみなされます。

以下の例では、ローカル変数 a を関数内で利用していて、同名のローカル変数が存在する別のスコープからその関数を呼び出しています。
関数内の a はその関数が定義されたスコープのものになり、また a の値は関数が呼び出された時点で評価されるので、#f(1) の戻り値は 2 になります。

$:(#f=^(x)(x#+a#);a#=1)$(a#=0;#f(1))

関数内でさらに関数を定義した場合、外の関数の引数を中の関数からもローカル変数として利用することができます。
ただし、中の関数と外の関数に同名の引数が存在する場合は、外の関数の当該の引数にはアクセスできません。

$:(#f=^(x)(#g=^(y)(x#*y#));#g(x#+1))

関数内で定義された関数が外の関数の引数を利用していて、外の関数以外の場所から呼び出された場合、その引数の値は null になります。

関数がローカル変数のスコープを作るのは引数のみです。
関数内がスコープのローカル変数を利用したい場合は、関数内で関数を定義して、その引数としてローカル変数を定義することで実現できます。

以下の例は引数の数に 1 を足して二乗した数を返す関数を定義していますが、関数内関数を利用して、ローカル変数として a# を使っています。

$:(#f=^(x)(^(a)(a#=x#+1;a#*a#)(null)))

複数の関数内ローカル変数を使用したい場合、プロパティを使えば変数を一つだけにすることができます。

再帰呼び出しを行いたい場合は、recurse 関数を利用します。
recurse 関数は、それが呼び出されたユーザー関数を再帰呼び出しします。
以下はフィボナッチ関数の例です。

$:(#fibonacci=^(n)(if(n#==0|n#==1,n#,~(recurse(n#-2)+recurse(n#-1)))))

関数を変数に代入した場合、その変数を使用して再帰呼び出しすることもできます。

$:(#fibonacci=^(n)(if(n#==0|n#==1,n#,~(#fibonacci(n#-2)+#fibonacci(n#-1)))))

組み込み関数

以下の組み込み関数が利用できます。

型変換関数

関数の形式内容
boolean(x)x を論理型に変換して返します。論理型への変換規則の表を参照してください。
dereference(x)x が参照である場合、参照先の値を返します。x が参照でない場合、そのままの値を返します。
integer(x)x を整数型に変換して返します。
null(x[, ...])null を返します。$(null(...)) は $:(...) と等価です。
real(x)x を実数に変換して返します。
reference(x)x の参照を返します。x が参照である場合はそのまま返します。
string(x)x を文字列に変換して返します。

型判定関数

関数の形式内容
is_boolean(x)x が論理型の場合は true を、論理型でない場合は false を返します。
is_function(x)x が関数型の場合は true を、関数型でない場合は false を返します。
is_integer(x)x が整数型の場合は true を、整数型でない場合は false を返します。
is_null(x[, ...])x が null の場合は true を、null でない場合は false を返します。
is_real(x)x が実数型の場合は true を、実数型でない場合は false を返します。
is_reference(x)x が参照の場合は true を、参照でない場合は false を返します。
is_string(x)x が文字列型の場合は true を、文字列型でない場合は false を返します。
is_thunk(x)x がサンク型の場合は true を、サンク型でない場合は false を返します。
typeof(x)x の型を表す文字列を返します。の表にある識別子の文字列です。

論理演算関数

関数の形式内容
and(x, y[, ...])2つ以上の引数を取り、引数がすべて真の場合に true を返し、それ以外の場合は false を返します。
equals(x, y[, ...])2つ以上の引数を取り、すべての引数の値が等しい場合に true を返します。
not(x)x が真の場合は false を、x が偽の場合は true を返します。
or(x, y[, ...])2つ以上の引数を取り、引数のいずれかが真の場合に true を返し、引数がすべて偽の場合は false を返します。
xor(x, y)x と y のいずれか片方のみが真でもう片方が偽である場合は true を、それ以外の場合は false を返します。

文字列関数

関数の形式内容
capitalize(x)x の文字列中の単語の先頭の文字を大文字に、それ以外の文字を小文字にして返します。
capitalize_start(x)x の文字列中の単語の先頭の文字を大文字にして返します。それ以外の文字は変更されません。
combine(x, y[, ...])引数の文字列を連結した文字列を返します。
contains(x, y)x の文字列に y の文字列が含まれる場合に true を返します。
digits(x, n)x の数値が最低でも n で指定した桁数になるように、先頭に0を付加した文字列を返します。
ends_with(x, y)x の文字列の終端が y の文字列になっている場合に true を返します。
erase(x, pos, n)x の文字列の pos の位置から n 要素分を削除した文字列を返します。
find(x, y)x の文字列の先頭から y の文字列を検索して、その位置を返します。存在しない場合は length(x) が返ります。
find_last(x, y)x の文字列の末尾から y の文字列を検索して、その位置を返します。存在しない場合は length(x) が返ります。
fullwidth(x)x の文字列の半角文字を全角文字に変換した文字列を返します。
fullwidth_katakana(x)x の文字列の半角片仮名を全角に変換した文字列を返します。
get_charcode(x, pos)x の文字列の pos の位置のコードの整数値を返します。
halfwidth(x)x の文字列の全角文字を半角文字に変換した文字列を返します。片仮名は半角に変換されません。
halfwidth_katakana(x)x の文字列の全角片仮名を半角に変換した文字列を返します。
hex(x)x の整数値を16進数の文字列にして返します。
html_escape(x[, options])x の文字列中の特定の文字を HTML エンティティに変換した文字列を返します。& " < > がそれぞれ &amp; &quot; &lt; &gt; に変換されます。options の文字列に 's' が含まれる場合、' も &apos; に変換されます。また、'd' が含まれる場合、" が変換されません。
insert(x, pos, y)x の文字列の pos の位置に、y の文字列を挿入して返します。
is_alpha(x)x の文字列がアルファベットのみである場合に true を返します。
is_digit(x)x の文字列が数字のみである場合に true を返します。
is_lower(x)x の文字列がアルファベットの小文字のみである場合に true を返します。
is_upper(x)x の文字列がアルファベットの大文字のみである場合に true を返します。
join(list[, delimiter])list の配列の要素の文字列を連結した文字列を返します。delimiter が指定されている場合、その文字列が各要素の間に挿入されます。
length(x)x の文字列の長さを返します。
lower(x)x の文字列のアルファベットを小文字にして返します。
regexp_match(x, regex[, options])x の文字列中の regex で指定された正規表現パターンにマッチした文字列を配列で返します。配列は先頭の要素が全体のマッチに、2番目以降の要素がサブマッチになります。マッチしない場合は null が返ります。options の文字列に 'i' が含まれている場合、大文字と小文字を同一視します。
regexp_replace(x, regex, y[, options])x の文字列中の regex で指定された正規表現パターンにマッチする箇所を y の文字列に置き換えた文字列を返します。options の文字列に 'i' が含まれている場合、大文字と小文字を同一視します。
repeat(x, n)x の文字列を n 回繰り返した文字列を返します。n は0以上10000以下とします。
replace(x, y, z)x の文字列中の y の文字列を z に置き換えた文字列を返します。y が複数存在する場合すべて置き換えられます。
replace_first(x, y, z)x の文字列中にある最初の y の文字列を z に置き換えた文字列を返します。
split(x, delimiter)x の文字列を delimiter の文字列で分割して、その配列を返します。
starts_with(x, y)x の文字列の先頭が y の文字列の場合に true を返します。
string_from_charcode(x[, ...])引数の整数値のコードを文字列に変換して返します。複数の引数を渡すと、最初の引数から順に各文字を連結した文字列が返ります。
substring(x, pos, n)x の文字列の pos の位置から n 要素分の文字列を返します。
trim(x)x の文字列の先頭と末尾にある空白文字を削除した文字列を返します。
upper(x)x の文字列のアルファベットを大文字にして返します。
url_decode(x)UTF-8 のコードでパーセントエンコードされた x の文字列をデコードした文字列を返します。
url_encode(x[, options])x の文字列中の、アルファベットと数字と-_.~/ のいずれでもない文字を、UTF-8 のコードでパーセントエンコードした文字列を返します。options の文字列に '+' が含まれる場合、空白が '+' にエンコードされます。また、'/' が含まれる場合、'/' が '%2F' にエンコードされます。

配列関数

関数の形式内容
append(x, y[, ...])x の配列に y の値の要素を追加します。追加する要素は複数指定できます。この関数は対象の配列への参照を返します。
array(n[, x])n の要素数を持った配列を返します。各要素の初期値は、x が指定されていればその値に、指定されていなければ null になります。
assign(x, y[, ...])x の配列の先頭の要素から順に、y とそれ以降の値を代入します。もし指定された値の数が x の要素数より多い場合、配列の要素数が増加します。それ以外の場合、配列の要素数は変化しません。この関数は対象の配列への参照を返します。
dictionary()空の連想配列を返します。
length(x)x の配列または連想配列の要素数を返します。
pop(x)x の配列の末尾の要素を削除し、削除した要素の値を返します。
push(x, y)x の配列の末尾に y の値を追加し、追加した要素の値を返します。
remove(x, key)x が連想配列の場合、key の要素を削除してその値を返します。要素が存在しない場合は null を返します。
x が配列の場合、key のインデックスの要素を削除してその値を返します。
resize(x, n[, y])x の配列の要素数を n にします。n が x の要素数より大きい場合、新しく作成される要素は y が指定されていればその値に、指定されていなければ null になります。この関数は対象の配列への参照を返します。
reverse(x)x の配列の要素の順序を逆順にします。この関数は対象の配列への参照を返します。
sort(x)x の配列の要素の順序を整列させます。この関数は対象の配列への参照を返します。

数学関数

関数の形式内容
abs(x)x の絶対値を返します。
arccos(x)x の逆双曲線余弦を返します。
arcosh(x)x の逆余弦を返します。
arcsin(x)x の逆正弦を返します。
arctan(x)x の逆正接を返します。
arctan2(y, x)y と x の座標から求めた逆正接を返します。
arsinh(x)x の逆双曲線正弦を返します。
artanh(x)x の逆双曲線正接を返します。
beta(x, y)x と y のベータ関数の値を返します。
cbrt(x)x の立方根を返します。
ceil(x)x 以上の最小の整数値を real 型で返します。
clamp(x, min, max)x の値を、min を最小値、max を最大値として、範囲に収めた値を返します。
cos(x)x の余弦を返します。
cosh(x)x の双曲線余弦を返します。
exp(x)ネイピア数の x 乗を返します。
exp2(x)2の x 乗を返します。
floor(x)x 以下の最大の整数値を real 型で返します。
gamma(x)x のガンマ関数の値を返します。
gcd(x, y)x と y の整数の最大公約数を返します。
hypot(x, y)x と y をそれぞれ二乗した和の平方根を返します。
is_even(x)x の整数が偶数の場合に true を返します。
is_odd(x)x の整数が奇数の場合に true を返します。
lcm(x, y)x と y の整数の最小公倍数を返します。
log(x)ネイピア数を底とする x の対数(自然対数)を返します。
log10(x)10を底とする x の対数(常用対数)を返します。
log2(x)2を底とする x の対数(二進対数)を返します。
max(x, y)x と y のうち大きい方の値を返します。
min(x, y)x と y のうち小さい方の値を返します。
modulo(x, y)x を y で割った余りの値を返します。
power(x, y)x の y 乗を返します。
round(x)x の実数の小数点以下を四捨五入した整数値を real 型で返します。
round_integer(x)x の実数の小数点以下を四捨五入した整数値を integer 型で返します。
sin(x)x の正弦を返します。
sinh(x)x の双曲線正弦を返します。
sqrt(x)x の平方根を返します。
tan(x)x の正接を返します。
tanh(x)x の双曲線正接を返します。

三角関数の単位はラジアンです。

ビット演算関数

関数の形式内容
bit_and(x, y[, ...])2つ以上の整数の引数を取り、引数の値のビット単位の論理積を返します。
bit_not(x)x の整数のビットを反転した値を返します。
bit_or(x, y[, ...])2つ以上の整数の引数を取り、引数の値のビット単位の論理和を返します。
bit_xor(x, y)x と y の整数のビット単位の排他的論理和を返します。
left_shift(x, n)x の整数を左に n ビットシフトした値を返します。
right_shift(x, n)x の整数を右に n ビットシフトした値を返します。負数は算術シフトです。

制御構造関数

関数の形式内容
foreach(x, y)x の配列または連想配列の各要素を y の関数の引数として渡して呼び出します。この関数は null を返します。
foreach_if(x, y)x の配列または連想配列の各要素を y の関数の引数として渡して呼び出し、呼び出した関数が false を返すと以後の呼び出しを行いません。呼び出した関数が false を返した場合は false が、false を返さなかった場合は true が返ります。
if(x, y[, z])x が真の場合は y の値を返し、偽の場合 z があればその値を、なければ null を返します。
loop(x, y)x のサンクを評価した値が真である間、y のサンクを繰り返し評価して、最後に評価された y の値を返します。y が一度も評価されなかった場合は null を返します。
recurse([...])ユーザー関数を再帰呼び出しし、その戻り値を返します。
return(x)ユーザー関数から呼び出し元に戻り、x の値が返るようにします。
select(n, x[, ...])n が0の場合は x の値を評価して返し、n が1増えるごとに1つ後ろの引数の値を評価して返します。n で指定された引数が存在しない場合は null を返します。
select_last(x[, ...])最後の引数の値を評価して返します。

foreach 関数

foreach 関数は配列または連想配列の各要素を列挙します。
最初の引数に配列または連想配列を、2番目の引数に関数を渡すと、各要素を引数として渡した関数が呼び出されます。
渡される引数は、配列の場合は要素の値が、連想配列の場合はキー名の文字列が渡されます。
配列の場合、先頭の要素から順に呼び出されます。連想配列の場合、呼び出される順番は未規定です。
呼び出された関数内で配列の要素の削除や追加などは行わないでください。

$:(#a=dictionary();#a['one']=1;#a['two']=2;#a['three']=3)
$:(foreach(#a,^(x)(out(x#,'=',#a[x#],' '))))

foreach_if 関数

foreach_if 関数は foreach 関数と同様に配列または連想配列の各要素を列挙しますが、途中で止めることが可能です。
2番目の引数に渡した関数が false を返した場合、以後の列挙は行われません。
また、その場合 foreach_if 関数は false を返します。
最後の要素で false が返された場合も、すべての要素の列挙は終わっていますが、foreach_if 関数からは false が返ります。
要素が一つも存在しない場合は true が返ります。

$:(#a=dictionary();#a['one']=1;#a['two']=2;#a['three']=3)
$:(foreach_if(#a,^(x)(out(x#,'=',#a[x#],' ');x#!='three')))

式評価関数

関数の形式内容
eval(x)x が文字列の場合、テキスト書式として評価してその結果を返します。
x がサンクの場合、サンクの式を評価してその結果を返します。
x が文字列でもサンクでもない場合、x の値をそのまま返します。
eval_expression(x)x が文字列の場合、式として評価してその結果を返します。
x がサンクの場合、サンクの式を評価してその結果を返します。
x が文字列でもサンクでもない場合、x の値をそのまま返します。
eval_thunk(x)x がサンクの場合、サンクの式を評価してその結果を返します。
x がサンクでない場合、x の値をそのまま返します。

eval と eval_expression の違いは、eval はテキスト書式を評価するのに対して、eval_expression は式を評価します。

$(eval('$?(#x==0)xは0$^'))
$(eval_expression('if(#x==0,\'xは0\')'))

つまり、eval('$(#x)')eval_expression('#x') が同じ結果となります。
ただし、引数としてサンクを渡した場合、eval と eval_expression は同じ動作となります。

eval 及び eval_expression に渡した式中のグローバル変数は呼び出し元と共有されます。
引数に文字列を渡した場合、ローカル変数は呼び出し元とは別になります。
eval 関数に渡したテキスト書式内のリテラルは出力されず、eval 関数の戻り値となります。
eval から eval を再帰呼び出しすることもできますが、再帰の深さは最大20回までに制限しています。

入出力関数

expand_env_variable(x)x の文字列中に含まれる % で囲まれた環境変数名をその値に展開した文字列を返します。
get_clipboard_string()クリップボードの文字列を返します。クリップボードに文字列が存在しない場合は null を返します。
get_env_variable(x)x の文字列で指定された名前の環境変数の文字列を返します。環境変数が存在しない場合は null を返します。
get_registry_value(x)x の文字列で指定されたパスのレジストリ値を返します。値が取得できない場合は null を返します。
out(x[, ...])引数の値を文字列として出力し、出力した文字列を返します。複数の引数を渡すと、最初の引数から順に連続して出力されます。

get_registry_value 関数

get_registry_value 関数はレジストリから値を取得します。
取得できるのは整数・文字列・文字列の配列です。
パスの区切りは / と \ のどちらでも良いですが、\ の場合文字列中に記述する場合エスケープする必要があるので \\ とします。
以下の例ではレジストリから CPU 名を取得しています。

$(get_registry_value('HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/CentralProcessor/0/ProcessorNameString'))

パスの最後を / または \ で終わらせれば、キー名なしの既定値を取得できます。

out 関数

out 関数はリテラルと同様に文字列を出力します。
式の中で文字列を出力したい場合に利用します。
以下の例では 'Begin 123 End' が出力されます。

Begin $:(#i=0;loop(~(#i<3),~(out(#i=#i+1)))) End

乱数関数

random(x, min, max)乱数の状態を格納した変数 x を使用し、min 以上 max 以下の疑似乱数を返します。x の変数は新しい状態に更新されます。
random_seed([x])x の整数値を種として疑似乱数を初期化し、状態を返します。引数を省略するとランダムな種で初期化されます。

疑似乱数列を生成するには、まず random_seed 関数で初期化して「状態」を変数に代入し、続けて random 関数を呼びます。

乱数列を種 123 で初期化し、0 から 9 までの乱数を取得する例:

$:(#r=random_seed(123))$(random(#r, 0, 9))

「状態」それ自体の値(上記の例でいえば変数 #r の値)は random 関数の最初の引数としてのみ有効です。
また、「状態」の型など具体的な実装は変化する可能性があります。

日時関数

current_time()現在のローカル日時を返します。
current_time_utc()現在の UTC 日時を返します。

current_time 関数などで返された日時は、プロパティとして年/月/日/曜日/時/分/秒/ミリ秒が設定されます。

日時のプロパティ
プロパティ名意味値の範囲
year1601~30827
month1~12
day1~31
dayofweek曜日0~6 (日~土)
hour0~23
minute0~59
second0~59
millisecondミリ秒0~999

以下の例は、現在日時を取得して年/月/日を出力します。

$:(#t=current_time())$(#t.year)/$(#t.month)/$(#t.day)

パス関数

関数の形式内容
long_path(x)x のパスの長いパス(8.3形式でないパス)を返します。x が長いパスである場合は x がそのまま返ります。
path_directory(x)x の文字列からディレクトリ部分の文字列を返します。
path_extension(x)x の文字列から拡張子部分の文字列を返します。拡張子が無い場合は null を返します。返される拡張子に . は含まれません。
path_filename(x)x の文字列からファイル名部分の文字列を返します。
path_remove_extension(x)x のパスの拡張子を削除した文字列を返します。
path_rename_extension(x, y)x のパスに y の拡張子を設定した文字列を返します。y の拡張子に . は含みません。
path_truncate(x, n)x の文字列を最大 n 文字の長さに省略した文字列を返します。
short_path(x)x のパスの短いパス(8.3形式)を返します。x が短いパスであるか、短いパスが存在しない場合は x がそのまま返ります。
wildcard_match(x, y)x の文字列が y のワイルドカードに一致する場合に true を返します。ワイルドカードには * と ? を使用できます。
wildcard_list_match(x, y)x の文字列が y のワイルドカードのいずれかに一致する場合に true を返します。ワイルドカードは ; で区切って複数指定することができます。

path_* 関数は、実際にそのパスが存在するか否かに関わらず、単純に文字列として処理を行います。
例えば path_filename('C:\\Program Files') とすると、Program Files が実際はディレクトリであっても 'Program Files' が返ります。

long_path と short_path は、" で囲うことで複数のパスを渡してまとめて変換することができます。
例えば、short_path('"C:\\Program Files\\Foo.jpg" "C:\\Windows\\Bar Bar.jpg"') のように複数のパスを渡せます。

ユーザー入力関数

関数の形式内容
is_key_down(x)x で指定されたキーが押されている場合に true を返します。x には整数値の仮想キーコード、もしくはキーを表す文字列を指定します。使用できる文字列は下表を参照してください。
is_key_on(x)x で指定されたキーの状態が有効である場合に true を返します。x には整数値の仮想キーコード、もしくはキーを表す文字列を指定します。文字列は capslock / numlock / scrolllock を指定できます。
キー指定文字列
文字列仮想キーコードキー
0~948~57(0x30~0x39)0~9 キー
num0~num996~105(0x60~0x69)テンキー 0~9
A~Z65~90(0x41~0x5A)A~Z キー
F1~F24112~135(0x70~0x87)F1~F24 キー
lbutton1(0x01)マウス左ボタン
rbutton2(0x02)マウス右ボタン
mbutton4(0x04)マウス中央ボタン
backspace8(0x08)Back Space キー
tab9(0x09)Tab キー
enter13(0x0D)Enter キー
shift16(0x10)Shift キー
ctrl17(0x11)Ctrl キー
alt18(0x12)Alt キー
pause19(0x13)Pause キー
capslock20(0x14)Caps Lock キー
esc27(0x1B)Esc キー
space32(0x20)スペースキー
pageup33(0x21)Page Up キー
pagedown34(0x22)Page Down キー
end35(0x23)End キー
home36(0x24)Home キー
left37(0x25)左カーソルキー
up38(0x26)上カーソルキー
right39(0x27)右カーソルキー
down40(0x28)下カーソルキー
printscreen44(0x2C)Print Screen キー
insert45(0x2D)Insert キー
delete46(0x2E)Delete キー
lwin91(0x5B)左 Windows キー
rwin92(0x5C)右 Windows キー
app93(0x5D)アプリケーションキー(メニューキー)
multiply106(0x6A)テンキー *
add107(0x6B)テンキー +
subtract109(0x6D)テンキー -
divide111(0x6F)テンキー /
numlock144(0x90)Num Lock キー
scrolllock145(0x91)Scroll Lock キー

Tips

コメントを書く

$:() や null 関数、; などを使ってください。

$:('コメント')
null('コメント')
$('コメント';#x=0)

大文字・小文字を同一視した文字列比較や検索を行う

対象の文字列を lower 関数または upper 関数で変換して比較や検索をしてください。

lower(filename)=='test'
find(upper(filename), 'A')

一つの $() 内に式を複数書く

順次評価演算子 ; を使うと一つの $() 内に複数の式を入れることができます。

$(#a=200;#b=300;#a*#b)

null 関数や select / select_last 関数を使っても同様のことが行えます。

$(null(#a=200,#b=300))
$(select_last(#a=200,#b=300,#a*#b))