Mathematica: Неоцененный против отсрочки против удержания против HoldForm против HoldAllComplete против и т. Д. И т. Д. - PullRequest
27 голосов
/ 24 октября 2009

Меня сбивают с толку все встроенные функции Mathematica, которые каким-то образом предназначены для предотвращения оценки: Unevaluated, Defer, Hold и более полудюжины формы Hold*. Документация Mathematica просто объясняет каждую функцию в отдельности, не объясняя, почему вы выбрали бы одну или другую. Кто-нибудь может предложить последовательное объяснение всех этих функций? Все это кажется мне запутанным беспорядком. Хорошая отправная точка - это связать все это с макросами Lisp.

Большая часть языка Mathematica удивительно хорошо разработана, но кажется, что Вольфрам действительно загнал себя в угол в этом аспекте. Или я мог что-то упустить.

1 Ответ

11 голосов
/ 26 октября 2009

Это довольно сложные конструкции, и трудно дать четкие объяснения; они не так просты, как макросы Lisp (или, между прочим, отношения между Lisp QUOTE и EVAL). Тем не менее, на веб-сайте Вольфрама есть хорошее и продолжительное обсуждение в виде заметок из выступления Робби Виллегаса "Неоцененные выражения" 1999 года .

Defer опущено в этом выступлении, потому что оно новое с Mathematica 6.0. Это очень похоже на HoldForm, за исключением того, что когда он выводится во внешнем интерфейсе (но не в чистом ядре), он удаляется, оставляя выражение, которое можно использовать в качестве ввода. Это очень полезно, если вы хотите программно создавать выражения, которые пользователь может редактировать и оценивать, скажем, в палитре.

...