С word-break
, очень длинное слово начинается с того места, с которого оно должно начинаться, и оно прерывается столько, сколько требуется
[X] I am a text that 0123
4567890123456789012345678
90123456789 want to live
inside this narrow paragr
aph.
Однако, с word-wrap
очень длинное слово НЕ БУДЕТ начать с того места, где оно должно начаться. он переносится на следующую строку, а затем прерывается столько, сколько требуется
[X] I am a text that
012345678901234567890123
4567890123456789 want to
live inside this narrow
paragraph.
Есть случаи, когда eval
необходим, но они всегда включают продвинутые программы, которые выполняют такие вещи, как динамическая загрузка некоторого кода (например, сервлета на веб-сервере). Что касается способа «обойти» его использование - это зависит от реальной проблемы, которую вы пытаетесь решить, нет волшебного решения, позволяющего избежать eval
, кроме ... eval
.
(Кстати, я предполагаю, что PAIP был написан очень давно, до того, как eval
был добавлен в отчет схемы.)
Вы можете написать интерпретатор схемы в схеме. Такое конечно возможно, но непрактично.
Конечно, это общий ответ, поскольку у меня нет используемой схемы, но, тем не менее, он может вам помочь. :)
Во-первых, PAIP написан для Common Lisp, а не Scheme, поэтому я не знаю, сказал бы он то же самое. Макросы CL делают то же самое, что и eval
, но во время компиляции, а не во время выполнения, и есть другие вещи, которые вы можете делать. Если бы вы показали мне пример использования eval
в Common Lisp, я мог бы попытаться придумать другие способы сделать то же самое.
Я не программист на схемах. Я могу говорить только с точки зрения Норвига, как программиста Common Lisp. Я не думаю, что он говорил о Схеме, и я не знаю, знал ли он или знает особенно хорошо Схему.
Во-вторых, Норвиг говорит, что "вы, вероятно, делаете неправильные вещи", а не "вы делаете то неправильная вещь ". Это означает, что, насколько он знает, есть s раз, когда правильно использовать eval
. На таком языке, как C, я бы сказал то же самое о goto
, хотя они весьма полезны в некоторых ограниченных обстоятельствах, но большинство goto
используют люди, которые не знаю лучше.
Я видел одно использование eval в средах сценариев - параметризация некоторого кода значениями времени выполнения. например, в psuedo-C:
param = read_integer();
fn = eval("int lambda(int x) {
int param = " + to_string(param) + ";
return param*x; }");
Я надеюсь, вы найдете это действительно уродливым. Вставка строки для создания кода во время выполнения? Ик. В Scheme и других Lisp с лексической областью видимости вы можете создавать параметризованные функции без использования eval.
(define make-my-fn
(lambda (param)
(lambda (x) (* param x)))
(let* ([ param (read-integer) ]
[ fn (make-my-fn param ])
;; etc.
)
Как уже упоминалось, динамическая загрузка кода и тому подобное по-прежнему требует eval, но параметризованный код и композиция кода могут быть созданы с помощью функций первого класса.