2016-05-12 3 views
1

HHVM 3.9 не является таким фанатом тройных выражений с именованными функциями, даже если он прошел через fun(), но ≥ 3.10 полностью в порядке с ними. Кажется, что это один из немногих случаев, однако, из-за 3,9 делает принимают названные функции, возвращенных из конкретных функций, а также прием названных функций передаются в другие функции (3v4l):Являются ли Hack названными функциями полностью первоклассные граждане?

<?hh 
echo ((() ==> fun('strlen'))())('Hello'); // 5 
echo (($f, $v) ==> $f($v))(strlen, 'Hello'); // 5 + Notice: Use of undefined constant strlen - assumed 'strlen' 
echo (true ? strlen : intval)('100'); // Fatal error: syntax error, unexpected '(', expecting ',' or ';' on line 3 

Что изменилось между 3,9 и 3,10? Существуют ли какие-либо случаи в HHVM ≥ 3.10, где названные функции нельзя ссылаться и использовать таким образом?

ответ

1

Во-первых, при записи Hack, don't write your code at toplevel; the hh_client typechecker can't check anything at toplevel. И 3v4l не запускает typechecker вообще, вам нужно запустить его локально.

Это говорит, что нет, Hack действительно не имеет первоклассных функций. Большая часть его поведения здесь унаследована от PHP, который также не имеет их. Назад, когда я работал над командой Hack, мы бросили вокруг много идей, чтобы добавить их к языку; это очевидное дополнение и необходимость. Но потребность никогда не была довольно достаточно сильной, чтобы мы сели и фактически разработали детали как для системы типов, так и для использования во времени; в частности, как разработать некоторые из проблем, связанных с текущими вызовами. Анонимные функции достаточно заполняют необходимость, особенно с Hack's short lambda syntax, что всегда было что-то более насущное для решения.

Итак, у Hack есть обычные вызываемые формы PHP; fun is one of a few special functions which give information to the typechecker that the string you specified actually represents a function, поэтому typechecker может выполнять правильный анализ типов. Но в конце дня fun просто сводится к обычным формулам, вызываемым PHP, с немного дополнительной магией в typechecker.

Что касается поведения, которое вы указываете в своей ссылке 3v4l. Использование strlen и intval, как это могло бы вызвать ошибку типа в Hack, поскольку они являются синтаксически константами, но константы с этими именами не существуют, поскольку Hack не имеет первоклассных функций, или если бы код не был в toplevel, и вы запускали typechecker. Что касается причины, по которой он вызывает ошибку синтаксического анализа в HHVM 3.9 (которая маскирует ошибки «недопустимой константы», которые вы видите в 3.10), я не уверен на 100%. Судя по this example, который работает в PHP7 и HHVM 3.10, но не PHP5 и HHVM 3.9, думаю, это PHP7 feature that is backwards compatible and so is always enabled in HHVM.

+0

А, так что это больше вопрос о том, что _PHP7_ поддерживает по названным функциям. Мне любопытно, почему 'Notice ... undefined constant' подавляется' fun', если он «просто сводится к обычным формулам, вызываемым PHP», но это небольшая деталь, которую я подозреваю. Чтобы уточнить: вне ошибок типа, нет случаев, когда 'fun ('foo')' и 'foo' интерпретируются по-разному, не так ли? – concat

+0

Ошибки типа - это целая точка; они категорически не то же самое в typechecker. Однако [во время выполнения, да] (https://github.com/facebook/hhvm/blob/cc7f35361e5dfc934631e1e19e2f2b9f66890391/hphp/system/php/lang/fun.ns.php#L31-L67). EDIT: имейте в виду, что комментарии в коде, который я связал, имеют код на уровне и, как таковые, неправильные, но [обычные общедоступные документы] (https://docs.hhvm.com/hack/callables/special-functions) являются правильными , –

 Смежные вопросы

  • Нет связанных вопросов^_^