39 | Valores inmediatos y diferidos |
En Wolfram Language hay dos formas de hacer una asignaci
ón: la
asignación inmediata (
=), y la
asignación diferida (
:=).
En la asignación inmediata, el valor se calcula tan pronto como se hace la asignación y ya no vuelve a recalcularse. En la diferida, el cálculo del valor se deja pendiente pero se lleva a cabo cada vez que se requiere.
Por ejemplo, considere la distinci
ón entre
value=RandomColor[] y
value:=RandomColor[].
En la asignaci
ón inmediata (
=), se genera inmediatamente un color aleatorio:
Y cada vez que se solicita value, se obtiene el mismo color:
En cambio, en la asignaci
ón diferida (
:=) no se genera de inmediato el color aleatorio:
Pero cada vez que se solicita
value, se efect
úa
RandomColor[], y se genera nuevamente el color:
Por lo regular, el color será distinto en cada ocasión:
Es muy com
ún que se use
:= si no se tiene ya todo listo al estar definiendo un valor.
Puede hacerse una asignación diferida para círculos aun cuando no se tenga listo el valor de n:
Ahora, se le da un valor a n:
Entonces, se pide
circles y ser
á entonces cuando se usen los valores que se le hayan dado a
n:
La idea de la asignaci
ón diferida es directamente an
áloga al concepto
Delayed que se vio en el despliegue de p
áginas web. En la asignaci
ón diferida no se calcula un valor hasta que se necesita. De la misma manera, al usar
CloudDeploy con
Delayed no se computa el contenido de una p
ágina web hasta el momento que alguien la solicita.
Existe tambi
én la noci
ón de reglas diferidas.
xrhs calcula inmediatamente
rhs. En cambio, en el caso de la regla diferida
xrhs (escrito como
:>),
rhs se recalcula cada vez que se solicita.
Aqu
í se tiene una regla inmediata, donde se calcula inmediatamente un valor espec
ífico de
RandomReal[ ]:
Se puede hacer la sustitución de cuatro x, pero todas resultan ser iguales:
Ahora se tiene una regla diferida, donde el c
álculo de
RandomReal[] se difiere:
RandomReal[] se calcula separadamente cada vez que se hace la sustituci
ón de cada
x, lo que resulta en cuatro valores diferentes:
x:=value | | asignación diferida, que se evalúa cada vez que se solicita x |
xvalue | | regla diferida, que se evalúa cada vez que se encuentra x (se escribe como :>) |
39.1Sustituya
x en
{x, x+1, x+2, x^2} por el mismo n
úmero aleatorio del 0 al 100.
»
39.2Sustituya cada
x en
{x, x+1, x+2, x^2} por un n
úmero aleatorio del 0 al 100, escogido por separado.
»
¿Por qu
é no usar siempre
:=?
Porque no siempre se quiere recalcular algo, a menos que sea necesario. Es más eficiente calcular en una sola ocasión y luego usar el mismo resultado una y otra vez.
¿C
ómo se enuncian en voz alta
:= y
:>?
:= se dice, por lo general,
“dos puntos igual
” aunque, a veces,
“asignaci
ón diferida
”.
:> casi siempre
“dos puntos mayor
” pero, tambi
én,
“regla diferida
”.
¿Qu
é sucede si se quiere calcular
x=x+1, pero
x no tiene un valor asignado?
Se inicia un bucle infinito que será interrumpido por el sistema en algún momento. Con x={x} sucede lo mismo.
¿Qu
é significan las etiquetas
In[n]:= para las entradas, y
Out[n]= para las salidas ?
Indican que las entradas se asignan a
In[n] y las salidas a
Out[n]. El
:= para la entrada significa que la asignaci
ón es diferida, de manera tal que si se solicita
In[n] se recalcula el resultado.
- El proceso de computar los resultados en Wolfram Language se llama usualmente evaluación, ya que involucra encontrar el valor de algo.
- En Wolfram Language hay distintas formas de controlar la evaluación. Por ejemplo, la función Hold mantiene una expresión “retenida” hasta que se la “libera”.
- La forma interna de x=y es Set[x, y]. x:=y es SetDelayed[x, y]. xy es RuleDelayed[x, y].