Где определяется «требуется»? - PullRequest
0 голосов
/ 05 декабря 2018

Я искал в источнике Rakudo реализацию require, сначала из любопытства, а затем из-за того, что я хотел знать, возвращал ли он что-то.

Я посмотрел вверх sub require, и он вернул этот хит , который на самом деле кажется источником для require, но он называется sub REQUIRE_IMPORT.Он возвращает Nil и объявляется как таковой, что в значительной степени отвечает на мой первоначальный вопрос.Но теперь мой вопрос: где находится сопоставление от этого сабвуфера до require?Это действительно реализация этой функции?Есть ли другие функции, которые объявлены таким образом?

1 Ответ

0 голосов
/ 05 декабря 2018

require - это не sub, а скорее оператор управления (то есть, в той же категории вещей, как use, if, for и т. Д.). Он анализируется Perl6 грамматика и есть несколько разных случаев, которые принимаются.Он скомпилирован в действиях Perl 6 , который имеет достаточно много для обработки.

Большая часть работы делегирована различным CompUnit объектам, которые также связаны с use / need.Также необходимо позаботиться о заглушке символов, которые принесет require, поскольку набор символов в заданной лексической области видимости фиксируется во время компиляции, а вспомогательная подсистема REQUIRE_IMPORT также участвует в импорте символов времени выполнения.

Ответ на ваш вопрос о том, что он будет оценивать, дается в конце метода:

    $past.push($<module_name>
               ?? self.make_indirect_lookup($longname.components())
               !! $<file>.ast);

Что означает:

  • Если это былоrequire Some::Module, затем оцените поиск в Some::Module
  • Если это был случай в стиле require $file, оцените имя файла
...