# 5. Variables y expresiones
Uno de los mayores problemas de Pure Data es, además del escalado de los patches --que crecen rápidamente a medida que se desarrollan funciones más complejas--, la gestión de la memoria. Como cualquier lenguaje de programación, la optimización de los recursos como el cálculo o la gestión de la memoria permitirá, a la larga, mejorar el rendimiento de los patches una vez se vuelvan algo más complejos. Durante esta sesión se introducen las **variables globales** con el objeto **[value]** (abreviado como **[v]**) y las **expresiones** con el objeto **[expr]**.
</br>
## Contenidos
:::info
|Objetivos|Detalle|
| -------- | -------- |
|Creación de variables globales en Pure Data | **[value]**
|Creación de expresiones que permitan realizar cálculos complejos con un solo objeto|**[expr]**
:::
</br>
## Variables
Las **variables** son valores que se almacenan con la finalidad de ser utilizados en varias partes del código a la vez. Se llaman variables porque, como su propio nombre indica, son valores que pueden variar mientras el código se ejecuta, cambiando, a su vez, el resultado de los cálculos en los que intervienen. El funcionamiento por conectores de Pure Data hace que las variables funcionen de manera parecida a como funciona un valor numérico conectado a un **[s]/[r]**. Sin embargo, como se podrá ver a continuación, las posibilidades de las variables globales son más amplias. El objeto en cuestión es **[[value]](https://pd.iem.sh/objects/value/)**, que puede ser abreviado como **[v]**:
<div style="text-align: center;">

</div>
**Funcionamiento:**
La función **[value]** debe incorporar un **valor** y un **argumento**. El valor que almacenará la variable debe ser actualizado (*bang!*) por el **Hot Inlet**. El argumento servirá para poder llamar a dicha variable desde cualquier parte del código, y puede estar incorporado en el objeto, o puede incluirse por el **Cold Inlet** mediante un **mensaje**. Al igual que cualquier otro objeto, una variable puede recibir cualquier nombre:
<div style="text-align: center;">

</div>
</br>
**Activación**
El objeto **[v]** requiere de dos activaciones: actualización de la variable y llamada de la variable. En primer lugar, el objeto debe ser actualizado:
<div style="text-align: center;">

</div>
<br>
En segundo lugar, el objeto **[v]** debe ser actualizado desde otra parte del código enviando un **[bang]** por el **Hot Inlet**.
<div style="text-align: center;">

</div>
## Expresiones
El potencial de las variables se encuentra a la hora de realizar cálculos complejos. Para ello, es necesario conocer las expresiones y revisar su sintaxis. Una **expresión** es una combinación de valores, variables, operadores y/o funciones que el código puede evaluar para producir un resultado. En Pure Data, las expresiones funcionan bajo el objeto **[[expr]](https://pd.iem.sh/objects/expr/)**, y permiten realizar una gran cantidad de operaciones matemáticas distintas:
<div style="text-align: center;">

</div>
:::info
## FYI
Debido al gran número de operaciones que se pueden realizar, se recomienda revisar la documentación para ver las posibilidades del objeto.
:::
El objeto **[expr]** **se debe** manipular desde su interior. La expresión siempre va acompañada de un paréntesis, en el que se establecen las condiciones y las operaciones que realizará el objeto. La sintáxis básica es la siguiente:
<div style="text-align: center;">

</div>
La expresión debe ir acompañada de un paréntesis y una operación. Esta operación puede ser más compleja:
<div style="text-align: center;">

</div>
En este caso, conocer sintaxis es fundamental para poder utilizar el objeto. El valor $f1 almacena un espacio a un valor (float) desconocido, que se actualizará. ==???==
<div style="text-align: center;">

</div>
:::info
## OJO
El objeto **[expr]** mantiene las propiedades generales de cualquier objeto de Pure Data; para que el objeto realice cualquier cálculo y lo saque por el outlet, se necesita un **[bang]** por el **Hot Inlet** o que el último valor actualizado sea el del **Hot Inlet**.
:::
Uno de los potenciales de la combinación de **variables** y **expresiones** es que las expresiones recogen de manera directa las variables, por lo que se pueden realizar cálculos complejos utilizando únicamente el nombre de la variable como el valor a comparar:
<div style="text-align: center;">

</div>
<div style="text-align: center;">

</div>
</br>
## Ejercicio 5
**Parte1:**
Crea tres variables con tres nombres distintos. Las variables tienen que ser un número aleatorio entre el 0 y el 9
**Parte2:**
Crea una expresión que promedie el valor de las tres variables
**Parte3:**
Utiliza ese promedio para hacer una segunda expresión. Si el promedio es inferior a 20, el resultado será 0; si es superior, devolverá un valor aleatorio entre 0 y 99
<br>
:::spoiler Solución
:::
<br>
---
<br>
<div style="text-align: center;">
Anterior: [**4. Comunicación I: MIDI**](https://hackmd.io/pjc8A_sIQdOd4T2tV775nA)
Siguiente: [**6. Comunicación (II) MIDI to Blender**](https://hackmd.io/@FvMTRdPQSeqhA0pGgMQEWg/SJAQIouzyg)
</div>
<br>