Las funciones personalizadas que hemos creado hasta ahora se escribían en una única línea y se limitaban a considerar los argumentos y aplicarles una función. Pero podemos escribir funciones más complejas en las que se vean involucrados cálculos realizados a los argumentos que servirán de baso para la devolución del resultado final de la función. Para esto no tenemos más que añadir bloques let e in al cuerpo de la función. La sintaxis en este caso es la siguiente:
NombreFunción = (<Argumentos>) =>
let
<Cuerpo de la función>
in
<Resultado de la función>
Por ejemplo, creemos una nueva consulta que devuelva la hipotenusa de un triángulo rectángulo a partir de la longitud de los catetos. Es decir, queremos devolver la raíz cuadrada de la suma de los cuadrados de los catetos. La función podría ser la siguiente:
(cateto1, cateto2) =>
let
cateto1_cuadrado = cateto1 * cateto1,
cateto2_cuadrado = cateto2 * cateto2,
suma_cuadrados = cateto1_cuadrado + cateto2_cuadrado
in
Number.Sqrt(suma_cuadrados)
Aparte de los bloques let e in, vemos que no hay nada que no conozcamos ya. A lo sumo, la función estándar Number.Sqrt, que devuelve la raíz cuadrada de un número. Solo nos restaría dar a esta consulta un nombre apropiado, como hipotenusa, por ejemplo.
Esta estructura del código nos permite escribir funciones tan complejas como necesitemos, y usarlas a lo largo de todas nuestras consultas.