Panicz Maciej Godek <godek.mac...@gmail.com> writes: > I've checked this with other implementations. Racket, Gambit and Biwa > Scheme were equally uninformative. Kawa's backtrace was a nightmare to > me, but perhaps someone with more knowledge would be able to infer the > actual location of the error. Actually, the only implementation that > exposed the exact location was Chicken. It proves that there must be a > way to track this information in spite of TCO.
I suspect the reason Chicken kept the information is that in Chicken, IIUC, tail calls are just normal C function calls, so the stack fills until it reaches a certain size and then is garbage collected. The solution I favor is that of MIT Scheme, which records the backtrace as a chain of rings. Each time a tail call is done, an entry is recorded in the topmost ring, so between every two non-tail calls, up to N tail calls are preserved. If more than N tail calls are done in a row, then the older ones are forgotten. Hopefully we'll have this for Guile some day. Mark