Почему должен 'потребовать' быть оцененным в отдельном выражении к использованию пакета

Отражение является способностью языка осмотреть и динамично назвать классы, методы, атрибуты, и т.д. во времени выполнения.

, Например, все объекты в Java имеют метод getClass(), который позволяет Вам определить класс объекта, даже если Вы не знаете это во время компиляции (например, если бы Вы объявили его как Object) то - это могло бы казаться тривиальным, но такое отражение не возможно на менее динамических языках такой как C++. Более усовершенствованное использование позволяет Вам перечислить и назвать методы, конструкторов, и т.д.

, Отражение важно, так как оно позволяет Вам записать программы, которые не должны "знать" все во время компиляции, делая их более динамичными, так как они могут быть связаны во времени выполнения. Код может быть записан против известных интерфейсов, но фактические классы, которые будут использоваться, можно инстанцировать с помощью отражения от конфигурационных файлов.

Партии современных платформ используют отражение экстенсивно по этой самой причине. Большинство других современных языков использует отражение также, и в языках сценариев (таких как Python) они еще более тесно интегрируются, так как это чувствует себя более естественным в общей модели программирования тех языков.

5
задан John McAleely 7 July 2009 в 13:47
поделиться

2 ответа

Следующее может быть неточным в некоторых деталях, но это примерно так:

«Движок» Лиспа проходит четыре фазы: время чтения, время раскрытия макроса, компиляция время и время выполнения.

Каждая форма верхнего уровня сначала читается полностью. Чтение, однако, требует разрешения соответствующих символов. Поскольку ASDF еще не загружен во время чтения вашей формы eval-when , символ asdf: * central-registry * еще не может быть разрешен, и это вызывает указанную ошибку чтения.

9
ответ дан 18 December 2019 в 14:50
поделиться

См. Ответ Сванте.

Иногда вы можете решить эту проблему. Затем вам нужно найти символ в коде в RUNTIME.

(push somepath (symbol-value (find-symbol "*CENTRAL-REGISTRY*" "ASDF")))

Вышеупомянутый код может использоваться, потому что символ asdf: * central-registry * не используется напрямую, а просматривается во время выполнения, используя имя символа и имя пакета .

4
ответ дан 18 December 2019 в 14:50
поделиться