No estoy seguro de saber siquiera cómo formular esta pregunta. Al implementar un compilador, me gustaría permitir que el cliente especifique, digamos, pliegues en tuplas. He proporcionado una forma de curry y desencadenar una función, pero solo porque escribí un operador binario en Ocaml y lo doblé sobre el término y escribí las representaciones. El usuario no pudo escribir esta función.Implementar y representar operaciones polyadic
En el procesador de macros, el usuario puede escribir esta función porque las tuplas son listas.
Para las funciones curried, el usuario puede escribir fácilmente transformadores, porque el término es binario tanto en el idioma de destino como en la representación Ocaml del término y el tipado.
Pero no pueden hacer esto para las tuplas. Aquí hay otro ejemplo: el usuario define fácilmente el operador de composición funcional en serie. Pero el usuario no puede definir composición paralela: la versión binaria:
f1: D1 -> C1, f2: D2-> C2 --> f1 * f2: D1 * D2 -> C1 * C2
se puede escribir fácilmente, pero no puede ser extendido a 3 términos: aquí un pliegue calcularía
f1 * (f2 * f3)
en lugar de
f1 * f2 * f3
[isomorfo pero no igual]
La generalización de esta pregunta es "Cómo ¿Implemento un lenguaje de programación polyadic "que es demasiado pedir aquí. Lo que traté de hacer fue proporcionar un transformador incorporado:
curry: T1 * T2 * T3 ... -> T1 -> T2 -> ... uncurry: T1 -> T2 -> .. T1 * T2 T3 *
es así, el usuario sólo podía hacer pliegues con un operador binario:
uncurry (fold user_op (uncurry term))
pero esto no es ni lo suficientemente general ni funciona tan bien .. :)
supongo una pregunta equivalente para Haskell sería: dado que Haskell no tiene productos n-arios, se simulan los constructores de tuplas n-arios en la biblioteca con n funciones, donde cada uno debe escribirse a mano. Esto claramente apesta. ¿Cómo sería esto solucionado?
[quiero decir, es trivial para escribir una secuencia de comandos de Python para generar esas funciones n hasta un límite n, ¿por qué es tan difícil de hacer esto de una manera bien escrito dentro del lenguaje?]
Sí, pero esa no es mi pregunta: no estoy preguntando sobre qué tipo de sistema hace Ocaml, estoy preguntando cómo implementar esto en otro idioma (mi lenguaje Félix, de hecho, el compilador está escrito en Ocaml) – Yttrill