Is it even recursing in the tail position though? Reading the code it looks to me like the recursion result is used as an argument to a subsequent function call (append).
Afaik it is possible in racket. Read the note at the end here: http://matt.might.net/articles/lexers-in-racket/