Mathematica: Unevaluated vs Defer vs Hold vs HoldForm vs HoldAllComplete vs etc, etc.
-
06-07-2019 - |
Pregunta
Estoy desconcertado por todas las funciones integradas de Mathematica que pretenden impedir la evaluación de alguna manera: Noevaluated
, Defer
, Hold
y más de media docena del formulario Hold *
. La documentación de Mathematica solo explica cada función de forma aislada sin explicar por qué elegiría una u otra. ¿Alguien puede ofrecer una explicación coherente de todas estas funciones? Todo el asunto me parece un enredo complicado. Relacionarlo todo con las macros de Lisp podría ser un buen lugar para comenzar.
La mayoría del lenguaje de Mathematica está increíblemente bien diseñado, pero parece que Wolfram realmente se pintó en una esquina en este aspecto. O podría estar perdiendo algo.
Solución
Estas son construcciones bastante difíciles, y es difícil dar explicaciones claras; no son tan sencillas como las macros de Lisp (o, para el caso, la relación entre QUOTE
y EVAL
de Lisp). Sin embargo, hay una discusión larga y buena disponible en forma de notas de la charla de 1999 de Robby Villegas " Expresiones no evaluadas " en el sitio web de Wolfram.
Defer
se omite en esa charla, porque es nuevo en Mathematica 6.0. Es muy parecido a HoldForm
, excepto que cuando se imprime en un front-end (pero no en un núcleo desnudo) se elimina, dejando una expresión que se puede usar como entrada. Esto es muy útil si desea construir mediante programación expresiones que un usuario pueda editar y evaluar, por ejemplo, en una paleta.