Luaでは「関数のパラメータがテーブルコンストラクター1個の時、関数コールの丸括弧を省略できる」という書式があります。
これはつまり
function f(a) for key,val in pairs(a) do print(key.."="..val) end end f( { param1="12345" , param2="abcdef" } )
の関数コール部分を
f{ param="12345" , param2="abcdef" }
と書けることを意味します。これは、ほとんど他の高級言語の名前付きパラメータと同じですね。
これについて、ドキュメントを見ると、関数のパラメータの記載には以下の三種類が許されているようです。
args ::= ‘(’ [explist] ‘)’ args ::= tableconstructor args ::= LiteralString
どうやら、引数が文字列1個の場合も関数コールの丸括弧を省略できるようです。これはすなわち
require "モジュール名"
で使われている文法です。
この機能、他にも応用が聞きそうです。例えばC++ではワイド文字列を L"..."
と表現しますが、Lua でも、ANSI文字列をUnicode文字列へ変換する関数 L
を定義してやれば同等のことができそうです。
このように、Lua では文法や機能をいたずらに増やすのではなく、ちょっとしたシンタックスシュガーの追加で少数の機能で多くの表現ができるような工夫が随所に見られます。
こういった工夫が Lua のコンパクトさを実現し、多くの環境で動作する強みにつながっているのではないかと考えられます。
みんなも使おうぜ、Lua