Короткий ответ
Для вызова функции выражение функции должно быть либо именем, либо индексированным значением, либо другим вызовом функции, либо выражением в круглых скобках.
Длинный ответ
Я не знаю, почему это так устроено, но я просмотрел грамматику , чтобы точно узнать, как это работает. Вот запись для вызова функции:
functioncall :: = prefixexp args | prefixexp ':' Имя args
«args» - это просто список аргументов в круглых скобках. Соответствующая часть - «prefixexp».
prefixexp :: = var | functioncall | '(' exp ')'
Хорошо, теперь мы можем вызвать еще один «вызов функции». «exp» - это обычное выражение:
exp :: = nil | ложь | правда | Цифра | LiteralString | '...' | functiondef | prefixexp | настольный конструктор | exp binop exp | unop exp
Таким образом, мы можем вызывать любое выражение, если оно заключено в круглые скобки. "functiondef" охватывает анонимные функции:
functiondef :: = function funcbody
funcbody :: = '(' [parlist] ')' конец блока
Итак, анонимная функция - это выражение «exp», но не «prefixexp», поэтому нам нужны круглые скобки вокруг него.
Что такое «var»?
var: : = Имя | prefixexp '[' exp ']' | prefixexp '.' Имя
«var» - это либо имя, либо индексированное значение (обычно таблица). Обратите внимание, что индексированное значение должно быть "prefixexp", что означает, что строковый литерал или конструктор таблицы должны быть в круглых скобках, прежде чем мы сможем их проиндексировать.
В итоге: вызываемая функция должна быть либо именем, либо индексированное значение, вызов функции или какое-либо другое выражение в круглых скобках.
Большой вопрос: почему «prefixexp» обрабатывается иначе, чем «exp»? Я не знаю. Я подозреваю, что это как-то связано с сохранением вызовов функций и индексацией вне обычного приоритета оператора , но я не знаю, зачем это нужно.