4 Comentarios

No soy experto en python, pero ¿Has probado esto?

print( [x for x in range(1000)] )

Obviemos el tema de los 0 a la izquierda.

Expand full comment
author

No es lo mismo. La idea es hacer una lista de tuplas de combinaciones de tres elementos. Hay otras formas de hacerlo, pero no era lo que quería expresar en el artículo.

Expand full comment
abr 10, 2023·editado abr 11, 2023Gustado por Camilo Chacón Sartori

Claro, pero dado que las tuplas eran variaciones con repetición de los dígitos tomados de 3 en 3... la forma natural de obtenerlos esas tuplas es contar del 0 al 999. Los propios dígitos del número son los elementos de la "tupla"... entiéndelo Camilo: no he podido evitarlo :-)

Entiendo el problema (creo): un lenguaje de programación es un "formalismo" que en última instancia no debe dejar dudas sobre lo que expresa, y las elipsis del lenguaje natural no tienen cabida (¿o sí?).

El punto, supongo, es una pequeña revolución que tus neuronas (y las mías) están teniendo sobre si debemos avandonar la "defensa a ultranza" de lenguajes y paradigmas clásicos para adentrarnos en otras posibilidades que siendo también formales abracen el lenguaje natural... ¿una simbiosis LP+AI?.

Algo similar a la inferencia automática de tipos en lenguajes fuertemente tipados pero llevado más lejos: un lenguaje que se "autocompleta" (quizás como si de un precompilador o "syntax sugar" se tratase) para obtener, en última instancia, un código clásico (¿Una y solo una posible traslación? ¿Qué papel jugaría aquí la verificación formal?)

La pregunta podría resumirse en:

¿Abrazamos ciegamente NLP o potenciamos los Lenguajes clásicos (LP con esteroides)?

Es decir: seguimos escribiendo "comentarios" que luego copilot o chatgpt transforma en código clásico... o escribimos código clásico "con esteroides" donde un precompilador (cn soporte para IA) hace parte del trabajo.

Quizás pensar en "esteroides" es una forma de agarrarnos desesperadamente a nuestra visión de lenguaje de programación clásico... quizás sea la mejor forma de actuar.

Estoy recordado cómo usaba C o Pascal al principio: recuerdo que escribía "asm" y empezaba a escribir código ensamblador para solventar directamente cosas que el lenguaje no podía hacer tan bien como yo o porque no había una API para trabajar con determinado dispositivo o para programar una interrupción de teclado.

Quizás se trate de empezar a incluir el tag "nlp" en nuestro lenguaje de programación preferido

for(const n in nlp'Variaciones con repetición de los números del 0 al 9 tomados de 3 en 3'){

}

El código generado debería cumplir con la inferencia de tipos y estaría muy bien que los lenguajes empezasen a incluir herramientas de verificación formal.

--- y volviendo al ejemplo ---

Como bien indicas, el ejemplo es solventable de muchas formas y la más evidente es la encapsulación (programación top-down) a través de nuestras queridas funciones: una forma muy natural de mejorar expresividad eliminando código innecesario

Ej: inventando nuestro particular "subranges(...ns)" que lenguajes como Javascript pueden tratar con facilidad (perdón por la incursión)

for(const [a,b,c] in subranges(10,10,10) ){

}

--- Sobre la posible palabra clave "nlp" que deberían incluir todos los lenguajes de programación ---

Deberíamos empezar a encontrar ejemplos en los que un comando "nlp" insertado en el lenguaje se transformase en algo útil sin convertirse en un "batiburrillo" incontrolable

Expand full comment
abr 10, 2023·editado abr 11, 2023Gustado por Camilo Chacón Sartori

No he podido evitar empezar a darle vueltas Camilo:

En vez de usar "nlp" como prefijo, podemos imponer que el caracter ` se refiere a uso de lenguaje natural.

// El procesador de NLP genera código en una librería separada definiendo tipos

// y funciones (El tipo "Matriz 3x3" o la función `Generar aleatóriamente` sobre el tipo `Matriz 3x3`

var a:`Matriz 3x3` = `Generar aleatóriamente`

var b:`Matriz 3x3` = `Generar aleatóriamente`

// El propio compilador avisaría de si es aconsejabe añadir librerías externas a nuestro

// proyecto (Ej: graphite de twitter para trabajar con matrices) y nos preguntaría si

// lo deseamos hacer o si queremos que él mismo genere el código

var c = a `por` b

for(const cell in `elementos de c recorrido por filas y columnas`) {

// Obligamos al compilador a "hacer" lo necesario para que la posición (fila,columna)

// de la celda se obtenga en el bucle

writeln( `fila y columna de cell`)

writeln( `valor de cell` )

}

En un lenguaje como Java podría ayudarnos a eliminar imports y sintaxis verbose

List<String> nombres = `Generar 100 nombres de chica sin repetición`;

// Evitar el uso de .stream.map( y de explicitar "import" de stream, de map,

// de format, ... y de indicar cómo se hace un collect a array de strings

val frases = nombres.`map`(nombre-> `format`("La chica se llama %s", nombre) ).`toArray`

// Podemos prototipar métodos sin necesidad de escribir su código

double max(double a, double b) {

return `mayor de a y b`;

}

// Podríamos usar alias si los lenguajes lo permiten (ej: typescript)

type M = `Matriz 3x3`;

Y un largo etcétera...

Expand full comment