Почему именно зло? - PullRequest
       80

Почему именно зло?

140 голосов
/ 03 апреля 2010

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

Например, я знаю проблемы GOTO в процедурном программировании (делает программы нечитаемыми и сложными в обслуживании, затрудняет поиск проблем безопасности и т. Д.), Но я никогда не видел аргументов против eval.

Интересно, что те же аргументы против GOTO должны быть действительны против продолжений, но я вижу, что, например, Схемерс не скажет, что продолжения являются "злом" - вы должны быть осторожны при их использовании. Скорее всего, они будут недовольны кодом, использующим eval, чем кодом, использующим продолжения (насколько я понимаю - я могу ошибаться).

Ответы [ 12 ]

2 голосов
/ 05 января 2016

Эвал не зло. Эвал не сложный. Это функция, которая составляет список, который вы ей передаете. В большинстве других языков компиляция произвольного кода будет означать изучение AST языка и копаться во внутренностях компилятора, чтобы выяснить API компилятора. В lisp вы просто звоните eval.

Когда вы должны его использовать? Всякий раз, когда вам нужно что-то скомпилировать, обычно это программа, которая принимает, генерирует или изменяет произвольный код во время выполнения .

Когда не стоит его использовать? Все остальные случаи.

Почему бы вам не использовать его, когда вам это не нужно? Потому что вы будете делать что-то излишне сложным способом, который может вызвать проблемы с читабельностью, производительностью и отладкой.

Да, но если я новичок, как я узнаю, стоит ли мне его использовать? Всегда старайтесь реализовать то, что вам нужно, с помощью функций. Если это не сработает, добавьте макросы. Если это все еще не работает, тогда eval!

Следуйте этим правилам, и вы никогда не будете делать зло с помощью eval:)

0 голосов
/ 09 июня 2016

Мне очень нравится Ответ Зака ​​ очень, и он понял суть вопроса: eval используется, когда вы пишете новый язык, сценарий или модификацию язык. Он на самом деле не объясняет дальше, поэтому я приведу пример:

(eval (read-line))

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

В принципе, вы даже не можете считать это компилируемым утверждением по этой причине. Как правило, когда вы используете eval , вы работаете в интерпретируемой среде, и код больше не может быть скомпилирован. Если вы не используете eval , тогда вы можете скомпилировать программу на Лиспе или Схеме так же, как программу на Си. Следовательно, вы должны убедиться, что хотите и должны находиться в интерпретируемой среде, прежде чем использовать eval .

...