Nial
Nial (de "Nested Interactive Array Language") es un lenguaje de programación de matriz de alto nivel desarrollado aproximadamente en 1981 por Mike Jenkins de Queen's University, Kingston, Ontario, Canadá. Jenkins co-creó el algoritmo Jenkins-Traub.
Nial combina una notación de programación funcional para matrices basada en una teoría de matrices desarrollada por Trenchard More con conceptos de programación estructurada para datos numéricos, de caracteres y simbólicos.
Se utiliza con mayor frecuencia para la creación de prototipos y la inteligencia artificial.
Q'Nial
En 1982, Jenkins formó una empresa (Nial Systems Ltd) para comercializar el lenguaje y la implementación Q'Nial de Nial. A partir de 2014, el sitio web de la empresa admite un proyecto de código abierto para el software Q'Nial con el binario y la fuente disponibles para descargar. Su licencia se deriva de la Licencia Artística 1.0, las únicas diferencias son el preámbulo, la definición de "Titular de los derechos de autor" (que se cambia de "cualquiera que se nombre en los derechos de autor o los derechos de autor del paquete" a "NIAL Systems Limited"), y una instancia de "quienquiera" (que se cambia a "quienquiera").
Conceptos de Nial
Nial utiliza una teoría de matrices generalizada y expresiva en su versión 4, pero sacrificó parte de la generalidad del modelo funcional y modificó la teoría de matrices en la versión 6. Actualmente solo está disponible la versión 6.
Nial define todos sus tipos de datos como matrices rectangulares anidadas. ints, booleans, chars, etc. se consideran una matriz solitaria o una matriz que contiene un solo miembro. Los propios arreglos pueden contener otros arreglos para formar estructuras arbitrariamente profundas. Nial también proporciona registros. Se definen como estructura de matriz no homogénea.
Las funciones en Nial se llaman Operaciones. Del manual de Nial: "Una operación es un objeto funcional al que se le asigna una matriz de argumentos y devuelve una matriz de resultados. El proceso de ejecutar una operación dándole un valor de argumento se denomina llamada de operación o aplicación de operación."
Aplicación de operaciones
Nial, como otros lenguajes derivados de APL, permite la unificación de operaciones y operadores binarios. Por lo tanto, las siguientes notaciones tienen el mismo significado.
Nota: sum
es lo mismo que +
Operación binaria:
2 + 3 2 suma 3
Notación de matriz:
+ [2,3] suma [2,3]
Notación de cadena:
+ 2 3 suma 2 3
Notación agrupada:
+ (2 3) suma (2 3)
Nial también usa transformadores que son funciones de orden superior. Utilizan la operación de argumento para construir una nueva operación modificada.
dos veces es transformador f (f f) dos veces descanso [4, 5, 6, 7, 8] Silencio
Atlas
Un atlas en Nial es una operación formada por una matriz de operaciones componentes. Cuando se aplica un atlas a un valor, cada elemento del atlas se aplica a su vez al valor para proporcionar un resultado. Esto se utiliza para proporcionar un estilo de definiciones sin puntos (sin variables). También es utilizado por los transformadores. En los siguientes ejemplos 'interno [+,*]' la lista '[+,*]' es un atlas.
Ejemplos
Crear matrices
6 Silencio1 2 3 4 5 6
Las matrices también pueden ser literales
Arr:= [5, 6, 7, 8, 9] Ø5 6 7 8 9
La forma proporciona las dimensiones de la matriz y la reforma se puede utilizar para reformar las dimensiones.
Forma Arr Silencio5
a:= 2 3 reshape Arr # Reshape es una operación binaria con dos argumentos. También se puede escribir en prefijo como # a:= reshape [[2,3], Arr] Ø5 6 7 Silencio8 9 5
b:= 3 2 reshape Arr Silencio Silencio7 8 Silencio
a interior[+,*] b Silencio Silencio148 145
Calcular un promedio
Las definiciones tienen la forma '<name> es <expresión>'
promedio es / [sum, tally] promedio Arr Silencio7.
Calcular un factorial
hecho es recurrido [ 0 =, 1 primero, pasar, producto, -1 +] hecho 4 Silencio
Invertir una matriz
rev es remodelado [ forma, cruza [pass, pass, converse append] rev [1, 2, 3, 4] Silencio4 3 2 1
Generando números primos
Contraste con APL
primos es sublista [ cada uno (2 = suma cada derecho (0 = mod) [pass,count]), pase ] recuento de descanso primos 10 TENIDA2 3 5 7
Explicación
Verificación de la divisibilidad de A por B is_divisible is 0 = mod [A,B]
Definiendo el filtro is_prime
is_prime is 2 = sum eachright is_divisible [pass,count]
Count genera una matriz [1..N] y pass es N (operación de identidad). eachright aplica is_divisible (pasar, elemento) en cada elemento de la matriz generada por conteo. Por lo tanto, esto transforma la matriz generada por conteo en una matriz donde los números que pueden dividir a N se reemplazan por '1' y otros por '0'. Por lo tanto, si el número N es primo, sum [arreglo transformado] debe ser 2 (él mismo y 1).
Ahora todo lo que queda es generar otra matriz utilizando el conteo N y filtrar todo lo que no sea primo.
primos es sublista [cada es_prime, pase] cuenta de descanso
Ordenación rápida
link
se une a sus arrays de argumentossublist
[A,B] devuelve una lista de elementos de B elegidos de acuerdo con la lista de booleanos dados en A, seleccionando los elementos de B donde el elemento correspondiente de A es verdadero.- En un
Fork
[A,B,C] X la primera A es un predicado, y si A(X) es cierto, entonces B(X) es devuelto otra C(X) es devuelto. Pass
es una operación de identidad para los arrays.
quicksort es tenedor [ 1 primero, en realidad], Pasa, enlace [ sublista de gama rápida [ ] sublist [ match [pass,first],pass ], rapidsort sublist [ √≥ [pass,first], pass ] ] ]
Utilizándolo:
quicksort [5, 8, 7, 4, 3] Silencio3 4 5 7 8
Contenido relacionado
IP sobre transportistas aviares
Codificación de rango
Semántica atómica