Я черчение дизайна чего-то (машинное обучение функций), которые предпочтительно хочет функциональный язык программирования, а также интроспекция, в частности возможность изучить собственный код программы в некотором хорошо податливом формате, предпочтительно также возможность получить сгенерированный машинным кодом код во время выполнения, и мне интересно, что это лучший язык для его написания. Lisp, конечно, обладает сильными возможностями самоанализа, но у статически типизированных языков также есть преимущества; те, которые я рассматриваю, являются:
Можете ли вы не просто проанализировать исходный код, как обычный интерпретатор или компилятор? Зачем вам нужна интроспекция?
F # - платформа .Net имеет хорошую историю здесь, вы можете прочитать байт-код во время выполнения, а также испустить байт-код и скомпилировать его; Я предполагаю, что нет проблем с доступом к этим объектам из F #.
У F # есть рудиментарный механизм котировки, но вы можете процитировать только некоторые выражения, а не другие типы кода, в первую очередь, типы определений. Кроме того, его механизм оценки на несколько порядков медленнее, чем подлинная компиляция, поэтому он практически бесполезен. Вы можете использовать отражение для анализа определений типов, но, опять же, оно довольно рудиментарно.
Вы можете прочитать байт-код, но он был скомпилирован, поэтому было потеряно много информации и структуры.
У F # также есть технология лексинга и разбора (в первую очередь fslex, fsyacc и FParsec), но она не настолько зрелая, как OCaml.
Haskell, Ocaml - у них есть похожие средства либо с помощью байтового кода, либо с помощью дерева синтаксического анализа?
У Haskell есть шаблон Haskell, но я никогда не слышал, чтобы кто-нибудь его использовал (отказ?).
У OCaml есть макросистема Camlp4, и некоторые люди действительно используют его, но это poorly documented.
Что касается лексинга и разбора, Haskell имеет несколько библиотек (в первую очередь Parsec), а OCaml имеет many libraries.
Есть ли другие языки, над которыми я должен смотреть?
Термины перезаписи таких языков, как Mathematica, были бы очевидным выбором, потому что они делают тривиальным манипулирование кодом. Может быть интересен язык Pure.
Вы также можете рассмотреть MetaOCaml для своих возможностей компиляции во время выполнения.
Зачем вам нужна интроспекция? –
На стороне чтения это важно, потому что центральная особенность рассматриваемой системы - это способность анализировать написанный человеком код. На стороне написания не важно, но приятно, потому что в тех случаях, когда часто генерируется код сгенерированного компьютером, его компиляция заставит его работать быстрее. – rwallace
Хороший вопрос, я действительно об этом задумывался недавно. Моя дневная работа - общий lisp, и я сделал кое-что, чтобы автоматически генерировать графики вызовов graphviz, используя интроспекцию, и мне было интересно, имеет ли haskell что-нибудь достаточно мощное, чтобы я мог сделать что-то подобное. – asm