Mathematica: Unegaluated vs Defer vs Hold vs HoldForm vs holdallComplete vs usw. usw.
-
06-07-2019 - |
Frage
Ich bin verwirrt von all den integrierten Mathematica-Funktionen, die vorgeben, die Bewertung in irgendeiner Weise zu verhindern: Unevaluated
, Defer
, Hold
, und über ein halbes Dutzend Form der Form Hold*
. Die Mathematica -Dokumentation erklärt jede Funktion nur isoliert, ohne zu erklären, warum Sie das eine oder andere auswählen würden. Kann jemand eine kohärente Erklärung all dieser Funktionen anbieten? Das Ganze scheint mir ein verschlungenes Durcheinander zu sein. In Bezug auf LISP -Makros ist es möglicherweise ein guter Ausgangspunkt, das alles zu erzählen.
Der größte Teil der Mathematica-Sprache ist erstaunlich gut gestaltet, aber es scheint, als hätte sich Wolfram in dieser Hinsicht wirklich in eine Ecke gemalt. Oder ich könnte etwas vermissen.
Lösung
Dies sind ziemlich schwierige Konstrukte, und es ist schwierig, klare Erklärungen zu geben. Sie sind nicht so einfach wie Lisp -Makros (oder die Beziehung zwischen Lisps QUOTE
und EVAL
). Es gibt jedoch eine gute, lange Diskussion in Form von Notizen aus Robby Villegas '1999 Gespräch "unegelegene Ausdrücke" Auf der Website von Wolfram.
Defer
wird in diesem Vortrag weggelassen, weil es ab Mathematica 6.0 neu ist. Es ist sehr ähnlich HoldForm
, außer dass es, wenn es in einem Front-End (aber nicht in einem nackten Kern) ausgegeben wird, weggezogen wird und einen Ausdruck hinterlässt, der als Eingang verwendet werden kann. Dies ist sehr nützlich, wenn Sie Ausdrücke programmgesteuert konstruieren möchten, die ein Benutzer bearbeiten und bewerten kann, z. B. in einer Palette.