2009-10-24 12 views
27

Je suis déconcerté par toutes les fonctions Mathematica intégré qui visent à empêcher l'évaluation d'une certaine façon: Unevaluated, Defer, Hold, et plus d'une demi-douzaine de le formulaire Hold*. La documentation Mathematica explique chacune des fonctions isolément sans expliquer pourquoi vous choisiriez l'une ou l'autre. Quelqu'un peut-il offrir une explication cohérente de toutes ces fonctions? Le tout semble être un désordre compliqué pour moi. Relier tout cela aux macros Lisp pourrait être un bon point de départ.Mathematica: Unevaluated vs Différer vs vs attente HoldForm vs vs HoldAllComplete etc etc

La plupart du langage Mathematica est incroyablement bien conçu, mais il semble que Wolfram se soit vraiment mis dans la peau de cet aspect. Ou je pourrais manquer quelque chose.

Répondre

11

Ce sont des constructions assez difficiles, et il est difficile de donner des explications claires; ils ne sont pas aussi simples que les macros Lisp (ou, d'ailleurs, la relation entre Lisp QUOTE et EVAL). Cependant, il y a une bonne et longue discussion disponible sous la forme de notes from Robby Villegas's 1999 talk "Unevaluated Expressions" sur le site Web de Wolfram.

Defer est omis de cette discussion, car il est nouveau à partir de Mathematica 6.0. C'est un peu comme HoldForm, sauf que quand il est sorti dans un frontal (mais pas un noyau nu) il est enlevé, laissant une expression qui peut être utilisée comme entrée. Ceci est très utile si vous voulez construire par programme des expressions qu'un utilisateur peut modifier et évaluer, par exemple dans une palette.