Pensar con un lenguaje de arreglos
(github.com/razetime)Pensar en lenguaje K
- La programación en K se realiza en su mayor parte a través del REPL.
rlwrapde ngn/k permite recorrer el historial con las teclas de flecha, lo que resulta útil para desarrollar programas grandes.- Las funciones se prueban en el REPL y luego se trasladan al código real.
- La salida bonita de ngn/k siempre devuelve datos K válidos y puede precalcularse para mejorar la velocidad del programa.
- Los scripts de K se ejecutan como si se hubieran escrito en el REPL, y el valor de retorno de cada línea se imprime a menos que termine con punto y coma.
- Los scripts permiten definiciones de varias líneas, lo que ayuda a la legibilidad.
- Para guardar el trabajo en un script y usarlo desde el REPL, se puede ejecutar el archivo y cargar los datos con
\lfile.k. - Se puede cargar un archivo varias veces en el REPL para sobrescribir los datos anteriores.
- La ayuda del REPL accesible con
\incluye varios comandos útiles.
Simplificación de la programación con arreglos
- La programación con arreglos es un proceso continuo de simplificar patrones complejos en patrones más pequeños, declarativos y fáciles de leer.
- La forma de simplificar patrones complejos se analiza en detalle en "Patterns and Antipatterns in APL: Escaping Beginner's Plateau - Aaron Hsu - Dyalog '17".
Transformación a K de la multiplicación de matrices
- El algoritmo iterativo de multiplicación de matrices tomado de un artículo de Wikipedia puede convertirse directamente a K.
- El peor ejemplo de código traducido a K requiere muchas asignaciones de variables globales, bucles anidados y mucha mutación.
- Es posible simplificar el código para resolver estos problemas uno por uno.
Simplificación del bucle interno
- En el bucle interno,
sumpuede simplificarse usando fold (/). '(each) devuelve un arreglo, por lo que se puede eliminar la variable globalC.- Se pueden eliminar las variables
i,jykpara simplificar el bucle.
Eliminación de bucles y minimización de variables globales
- Sin
k, se puede eliminar el bucle intermedio emparejando directamente filas y columnas. - Para eliminar
j, se puede emparejar cada columna deBconA[i]. - Para eliminar
i, se puede usar eachleft para emparejar cada fila deAcon cada columna deB. - Ya no se necesitan variables globales.
Forma final de la función de multiplicación de matrices
+(transposición) es costoso, así que puede eliminarse.- En lugar de multiplicar cada fila de
xpor cada columna dey, se puede hacer implícitamente el mismo trabajo ajustando cada fila deBcontra todoA. - Al final se obtiene una función de multiplicación de matrices concisa y explícita.
- El proceso de simplificar código pasa por varios pasos al principio, pero a medida que aumenta la familiaridad con K, puede volverse más fácil e intuitivo.
- La multiplicación de matrices es un procedimiento simple que encaja bien con el soporte de arreglos de K.
- En capítulos futuros se verán más algoritmos que no encajan tan bien con K y cómo manejarlos.
Opinión de GN⁺
- Este artículo muestra cómo se pueden simplificar y optimizar algoritmos como la multiplicación de matrices usando el lenguaje K.
- La retroalimentación inmediata mediante el REPL y la mejora iterativa del código son características centrales de la programación en K, y también son un método de aprendizaje útil para ingenieros de software principiantes.
- El proceso de simplificación del código es importante para mejorar la capacidad de programación, y este artículo lo explica de forma clara mediante ejemplos concretos.
1 comentarios
Opinión de Hacker News
Varias personas están cuestionando la utilidad y la comprensibilidad de los lenguajes de arreglos.
under.Hay muchos aspectos sorprendentes en los lenguajes de arreglos, y la lista anterior es solo una parte.
Si nunca has oído hablar de la programación de arreglos y quieres una introducción, recomiendan "The Array Cast".
Descubrieron APL/APL2 en los años 70 y les fascinó, pero les atraía aún más la capacidad de componer funciones.
La revelación más importante al usar lenguajes de arreglos:
Pregunta sobre los lenguajes de arreglos: ¿cómo se realiza una tarea como "encontrar todos los números menores que N para los que la condición P es verdadera"?
Experiencia con el lenguaje J: el paradigma de los lenguajes de arreglos está sesgado, y no están seguros de que pensar todos los problemas como anidamientos de arreglos realmente ayude.
Impresión al resolver problemas en K: el lenguaje K es deliberadamente críptico.
Ejemplo del lenguaje de arreglos J:
dot =: +/ . *se usa para calcular el producto punto entre P y Q.La sintaxis de K es más corta, pero hay que mantener en la cabeza mucho contexto incorporado sobre cómo funciona el lenguaje K.