【Lua5.3】記号の意味


はじめに

ググりにくい、見慣れないということで初心者の壁になりやすい記号の意味。
TIC-80」のデフォルトのスクリプト言語である「Lua5.3」の記号について列挙してみました。
stringライブラリ経由で利用する記号(パターン記号)は割愛しています。
メタテーブルにより、記号(演算子)の動作はカスタマイズできますが、通常の動作の場合です。

書式文字列(フォーマット記号)は補足としてまとめておきました。
(Cとだいたい一緒、~がなくて~を追加、程度の記述だったので)

詳細な説明は「意味」や「種別」のフィールドに日本語リファレンスへのリンクを張っているので
確認をお願いします。

漏れや間違いがありましたらご指摘お願いします。

一覧表(アスキーコード順)

記号 意味 種別 文法 返値の型
" 文字列
リテラル
字句規約 ‘"’文字列‘"’ string
# 長さ演算子 ‘#’ number(整数)
% 剰余 算術演算 ‘%’ number
& 論理積 ビット演算 ‘&’ number(整数)
' 文字列
リテラル
字句規約 ‘'’文字列‘'’ string
( ) 優先評価 優先順位 ‘(’‘)’
( ) 接頭式化 文法 ‘(’リテラル ‘)’
( ) 引数指定 関数呼び出し 接頭式 ‘(’[引数リスト] ‘)’ 値 or 無
( ) 仮引数指定 関数定義
関数定義
‘function’ ‘(’[式リスト] ‘)’
‘function’関数名‘(’[式リスト] ‘)’
function
* 乗算 算術演算 ‘*’ 数値
+ 加算 算術演算 ‘+’ number
, データ区切り
- 減算 算術演算 ‘-’ number
符号反転 算術演算 ‘-’ number
‐- コメント 字句制約 ‘--’~ 行末
. 小数点 字句制約 number
. インデックス検索 変数 接頭式 ‘.’ 名前
.. 連結 ‘..’ string
... 可変長引数 ‘...’ 値(複値)
/ 除算 算術演算 ‘/’ number(浮動小数)
// 整数除算 算術演算 ‘//’ number
(整数or整数部)
: メソッド 関数呼び出し
関数定義
接頭式 ‘:’ メソッド名 引数
関数名 ‘:’ メソッド名

function
:: ラベル 制御構造 ‘::’ ラベル名 ‘::’
; 空文 ‘;’
; フィールド
区切り
テーブル生成 フィールド {‘;’ フィールド} [‘;’] (table)
< 小なり 比較演算 ‘<’ boolean
<< 左シフト ビット演算 整数 ‘<<’ 整数 number(整数)
<= 以下 比較演算 ‘<=’ boolean
= 代入 変数リスト ‘=’ 式リスト
== 等値 比較演算 ‘==’ boolean
> 大なり 比較演算 ‘>’ boolean
>= 以上 比較演算 ‘>=’ boolean
>> 右シフト ビット演算 ‘>>’ number(整数)
[ ] インデックス検索 変数 接頭式 ‘[’‘]’
[[ ]]
[=[ ]=]
...
文字列
リテラル
字句規約 ‘[[’‘]]’
‘[=[’‘]=]’
‘[==[’‘]==]’
string
¥ エスケープ
シーケンス
字句規約 ‘ ¥ ’ddd など string
^ べき乗 算術演算 ‘^’ number(浮動小数)
{ } テーブル生成 ‘{’ フィールドリスト ‘}’ table
| 論理和 ビット演算 整数 ‘|’ 整数 number(整数)
~ 排他的論理和 ビット演算 整数 ‘~’ 整数 number(整数)
~ 否定 ビット演算 ‘~’ 整数 number(整数)
~= 等値否定 比較演算 ‘~=’ boolean

補足

( )の「接頭式化」が分かりづらいと思いますので補足を。まずは例から。

print( {'first','second','third'}[2] )  --> error
print( ({'first','second','third'})[2] ) --> "second"
print( "Hello!":rep(3) ) --> error
print( ("Hello!"):rep(3) ) --> "Hello!Hello!Hello!"
print( function(x)return x*x end(3) ) --> error
print( (function(x)return x*x end)(3) ) --> "9"

要は

  • テーブルコンストラクタ({}
  • 文字列リテラル(""など)
  • 関数式(function(~)~end

といったものはそのままではインデックス検索や関数呼び出しはできませんが、()で囲うとできますよ、ということです。

var ::= prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name
functioncall ::=  prefixexp args | prefixexp ‘:’ Name args
prefixexp ::= var | functioncall | ‘(’ exp ‘)’

辺りの文法(BNF表記)の制約からですが、

  • ()を付けると無名変数に代入するようなもの
  • ()を付けると一旦評価するようなもの

くらいの認識で捉えた方がいいのかなと思います(ダメかも)。

書式文字列(string.format で利用)

書式文字列 出力文字列 指定する値の型
%c 長さ1の文字列(下位8bit) 整数
%d 10進数整数 整数
%x 16進数表記(小文字) 整数
%X 16進数表記(大文字) 整数
%o 8進数表記 整数
%f 10進数浮動小数 数値
%e 指数表記(小文字) 数値
%E 指数表記(大文字) 数値
%s 文字列 任意
%q ‘"’付き文字列 文字列
%u 符号なし10進数整数 整数
%g 最適な形式 数値

感想

使用する記号の種類および組み合わせの数は他の言語と比べてかなり少ない方ではないでしょうか。
また一つの記号が表す概念・機能が少ない(だいたい1つ)のも易しいと言われる所以でしょうか。
*だけで複数の意味がある言語は多いので)