Estoy trabajando en mi propio lenguaje de programación con fines educativos, y me he encontrado con un pequeño problema. Hay algunas soluciones diferentes para ello, pero todas parecen poco elegantes, y por lo que entiendo, innecesarias. Pero leyendo los libros que tengo y las búsquedas en Google, no puedo encontrar la solución elegante.
Entonces, el problema es que estoy construyendo el cálculo básico de lambda tal como lo entiendo. He definido verdadero / falso como términos de abstracción. Puedo combinar estos con funciones para hacer tipo de comportamiento if / then / else. El problema viene con los bucles. Puedo definir un ciclo while básico a través de la recursión, pero en la práctica, eso causa un desbordamiento de la pila. Según tengo entendido, la solución habitual sería realizar la Optimización de llamadas de cola, pero no veo cómo puedo hacerlo: los condicionales se definen en el lenguaje. Debido a eso, el compilador no sabe que el cuerpo del ciclo while está en posición de cola.
El libro del dragón se centra en implementar el bucle suponiendo que haya etiquetas y gotos. Ciertamente podría hacer eso. Parece que otros lenguajes que no incorporan construcciones en bucle al menos incorporan condicionales y luego hacen TCO. Y ciertamente podría hacer eso también. Pero entiendo que mientras pueda aplicar abstracciones y realizar reducciones, los bucles (y todo lo demás) deberían poder construirse a partir de esos bloques básicos.
Entonces, ¿qué me estoy perdiendo? ¿O es este uno de esos casos en los que "puede modelar cualquier cosa una vez que tenga X e Y" no es lo mismo que "puede modelar cualquier cosa una vez que tenga X e Y en una computadora real" y las incorporaciones son necesarias para la práctica propósitos?