Caracteristicas del Lenguaje de programacion Bosque

Articulos tematica Microsoft

Manual de Bosque. None Processing. Procesamiento iterativo. Recursion. Características destacadas

None Processing

El manejo de ninguno de los valores es una tarea relativamente común que puede ocultar la intención fundamental de una sección de código con nidos de casos y el manejo condicional para el caso especial. Para simplificar este tipo de código, Bosque incluye varias formas de operadores coalescentes o de cortocircuito (5.8 Encadenamiento y Ninguno Encadenamiento) para habilitar códigos como:

function foo(val?: {tag: Int, value?: String}): String {

return val?.value ?| "[No Value]";}

Procesamiento iterativo

Un concepto fundamental en un lenguaje de programación es el constructo de iteración y una pregunta crítica es si este constructo se proporciona como funtores de alto nivel, como filtrar / mapear / reducir, o si los programadores se benefician de la flexibilidad disponible con iterativo, ya sea para o para construcciones en bucle.

Para responder a esta pregunta de manera definitiva, los autores de Modismos de bucles semánticos de minería realizaron un estudio de todos los "modismos" de bucles encontrados en el código del mundo real. Los resultados de la categorización y la cobertura mostraron que casi todos los bucles que un desarrollador querría escribir caen en una pequeña cantidad de patrones idiomáticos que corresponden a conceptos de nivel superior que los desarrolladores están usando en el código, por ejemplo, filtro, búsqueda, grupo, mapa, etc. esto tiene en cuenta que el lenguaje Bosque intercambia bucles estructurados para un conjunto de construcciones de procesamiento iterativo de alto nivel (3 colecciones y 5.18 Pipeline).

var v: List[Int?] = List@{1, 2, none, 4};

//Chained - List@{1, 4, 16}

v->filter(fn(x) => x != none)->map[Int](fn(x) => x*x)

//Piped none filter - List@{1, 4, 16}

v |> filter(fn(x) => x != none) |> map[Int](fn(x) => x*x)

//Piped with noneable filter - List@{1, 4, 16}

v |??> map[Int](fn(x) => x*x)

//Piped with none to result - List@{1, 4, none, 16}

v |?> map[Int](fn(x) => x*x)

Al eliminar la repetición de la escritura de los mismos bucles, se eliminan repetidas veces clases enteras de errores, por ejemplo, los cálculos de límites, y aclara la intención con un funtor denominado descriptivamente en lugar de confiar en un conjunto compartido de patrones de bucle mutuamente conocidos.

Críticamente, para permitir la validación y optimización automatizada de programas, eliminar los bucles también elimina la necesidad de computar invariantes de bucles. En cambio, y con un diseño cuidadoso de las bibliotecas de colección, es posible escribir transformadores precisos para cada functor. En este caso, el cálculo de las postcondiciones más fuertes o de las precondiciones más débiles evita la complejidad de generar un bucle invariante y, en cambio, se convierte en un caso simple y determinista de empuje de fórmula.

Recursion

La falta de construcciones de bucle explícito y la presencia de functores de procesamiento de colecciones no es inusual en los lenguajes funcionales. Sin embargo, el resultado es a menudo la sustitución de estructuras de bucle complejas con estructuras de recursión complejas. Los flujos sin procesar complejos ocultan la intención del código y dificultan el análisis y las herramientas automatizados independientemente de si el flujo es un bucle o una recursión.

Por lo tanto, Bosque está diseñado para fomentar el uso limitado de la recursión, aumentar la claridad de la estructura recursiva y permitir que los compiladores / tiempos de ejecución eviten errores relacionados con la pila. Esto se hace introduciendo la palabra clave rec que se usa en ambos sitios de declaración para indicar que una función / método es recursivo y nuevamente en el sitio de llamada para afirmar que la persona que llama está al tanto de la naturaleza recursiva de la llamada

Fecha actualización el 2021-05-06. Fecha publicación el 2019-05-06. Categoría: microsoft Autor: Oscar olg Mapa del sitio Fuente: github Version movil