2010-03-18 3 views

ответ

1

Нет эквивалента eval, Haskell - это статически скомпилированный язык, такой же, как C или C++, который также не имеет eval.

+1

Он не всегда статически компилируется. Взгляните на 'ghci' – Yacoby

+1

Да, но вы не можете легко вставлять всю ghci repl в свое автономное приложение. Конечно, вы можете, скажем, использовать TCC с C, но это не то же самое, что «eval» на достойных динамических языках, это всегда взломать. –

+1

... или действительно объятия. – dave4420

11

У него нет встроенной функции eval. Однако некоторые пакеты на хаке that can do the same sort of thing. (docs). Благодаря @luqui есть также hint.

+1

Подсказка - более простая версия того же: http://hackage.haskell.org/package/hint – luqui

25

Это правда, что в Haskell, как на Java или C++ или аналогичных языках, вы можете вызвать компилятор, затем динамически загружать код и выполнять его. Однако это, как правило, тяжелый вес и почти никогда, почему люди используют eval() на других языках.

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

Например, если вы хотите разрешить пользователям вводить не только числа в поле ввода, но и простые арифметические выражения в Perl или Python, будет намного проще просто вызвать eval() на входе, чем написать синтаксический анализатор для языка выражений, который вы хотите разрешить. К сожалению, такой подход почти всегда приводит к плохой работе пользователей (сообщения об ошибках компилятора не предназначены для не-программистов) и открывает дыры в безопасности. Решение этих проблем без использования eval(), как правило, связано с честным кодом.

В Haskell, благодаря таким вещам, как Parsec, на самом деле очень легко написать анализатор и оценщик для этих проблем ввода, и значительно удаляет стремление к eval.

+0

Это может быть все, но это не относится к вопросу. –

10

В языке не существует «eval», хотя Template Haskell позволяет оценивать время компиляции.

Для выполнения «eval» - например, метапрограммирование времени выполнения - в Hackage есть несколько пакетов, которые по сути импортируют GHC или GHCi, включая старый пакет hs-plugins и пакет подсказок.

+4

Это не имеет ничего общего с концептом стиля Python. У вас не будет доступа к вашим метаданным кода. То, о чем вы говорите, это просто построить код Haskell изнутри Haskell, он остается отсоединенным. Единственный способ иметь правильный eval для статически скомпилированного языка (особенно если есть отдельная компиляция) - это сохранить все метаданные (типы, таблицы имен и т. Д.) И связать компилятор или интерпретатор с любым двоичным кодом. –

+2

Btw., См. Первый пример в вопросе. Вы никогда не сможете это сделать в Haskell. Невозможно передать информацию о локальной привязке «x» в вашу функцию «eval». –

+5

См. Документ hs-plugins для сохранения метаданных - это выполняется с помощью возможности отражения во времени компиляции Haskell (TH) в сочетании с механизмом динамического типа Data.Dynamic для точек сращивания. http://www.cse.unsw.edu.au/~dons/hs-plugins/ Отражение + генерация кода исполнения + динамика для точек сращивания дает вам полную многоэтапную модель метапрограммирования. –

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