Mathematica: não avaliado vs adiar vs hold vs holdform vs hollallcomplete vs etc etc
-
06-07-2019 - |
Pergunta
Estou perplexo com todas as funções embutidas de Mathematica que pretendem evitar a avaliação de alguma forma: Unevaluated
, Defer
, Hold
, e mais de meia dúzia da forma Hold*
. A documentação do Mathematica apenas explica cada função isolada sem explicar por que você escolheria um ou outro. Alguém pode oferecer uma explicação coerente de todas essas funções? A coisa toda parece uma bagunça complicada para mim. Relacionar tudo com as macros Lisp pode ser um bom lugar para começar.
A maior parte da língua Mathematica é incrivelmente bem projetada, mas parece que Wolfram realmente se pintou em um canto nesse aspecto. Ou eu poderia estar perdendo alguma coisa.
Solução
Essas são construções bastante complicadas, e é difícil dar explicações claras; Eles não são tão diretos quanto as macros Lisp (ou, nesse caso, o relacionamento entre os Lisp's QUOTE
e EVAL
). No entanto, há uma boa e longa discussão disponível na forma de Notas da palestra de Robby Villegas em 1999 "Expressões não avaliadas" no site da Wolfram.
Defer
é omitido dessa palestra, porque é novo como Mathematica 6.0. É muito parecido HoldForm
, exceto que, quando é emitido em um front-end (mas não em um núcleo nu), é retirado, deixando uma expressão que pode ser usada como entrada. Isso é muito útil se você deseja construir programaticamente expressões que um usuário possa editar e avaliar, digamos em uma paleta.