Sto lavorando sul mio piccolo linguaggio di programmazione a fini educativi e ho riscontrato un piccolo problema. Ci sono alcune soluzioni diverse per questo, ma tutte sembrano ineleganti - e da quello che capisco, inutili. Ma leggendo i libri che ho e le ricerche su Google, non riesco a trovare la soluzione elegante.
Quindi, il problema è che sto costruendo il calcolo lambda di base quando lo capisco. Ho definito vero / falso come termini di astrazione. Sono in grado di combinare questi con funzioni per fare se / allora / altrimenti tipo di comportamento. Il problema si presenta con i loop. Posso definire un ciclo while di base tramite la ricorsione, ma in pratica, che provoca un overflow dello stack. A quanto ho capito, la solita soluzione sarebbe quella di eseguire l'ottimizzazione delle chiamate di coda, ma non vedo come posso - i condizionali sono definiti in linguaggio. Per questo motivo, il compilatore non sa che il corpo del ciclo while è in posizione di coda.
Il libro dei draghi si concentra sull'implementazione del ciclo presumendo che ci siano etichette e goto. Potrei certamente farlo. Sembra che altri linguaggi che non costruiscono in costrutti ciclici almeno costruiscano in condizionali e quindi facciano TCO. E potrei certamente farlo anche io. Ma la mia comprensione è che fino a quando posso applicare astrazioni ed eseguire riduzioni, allora i loop (e tutto il resto) dovrebbero poter essere costruiti da quei blocchi di base.
Quindi cosa mi sto perdendo? O è uno di quei casi in cui "puoi modellare qualsiasi cosa una volta che hai X e Y" non è lo stesso di "puoi modellare qualsiasi cosa una volta che hai X e Y su un computer reale" e sono necessari degli incorporamenti scopi?