Во-первых, PAIP написан для Common Lisp, а не для Scheme, поэтому я не знаю, что он сказал бы то же самое. Макросы CL делают то же самое, что и eval
, хотя во время компиляции, а не во время выполнения, и есть другие вещи, которые вы могли бы сделать. Если бы вы показали мне пример использования eval
в Common Lisp, я мог бы попытаться придумать другие способы сделать то же самое.
Я не программист Scheme. Я могу говорить только с точки зрения Норвига, как программиста на Common Lisp. Я не думаю, что он говорил о Схеме, и я не знаю, знал ли он или знает Схему особенно хорошо.
Во-вторых, Норвиг говорит, что «вы, вероятно, делаете не то», а не «вы делаете не то». Это означает, что, насколько он знает, бывают ситуации, когда eval
- это правильная вещь. На языке, подобном C, я бы сказал то же самое о goto
, хотя они довольно полезны в некоторых ограниченных обстоятельствах, но большинство goto
используют люди, которые не знают ничего лучше.