To illustrate my question, J is a language that is, to the best of my knowledge, only interpreted since parsing it requires runtime information (http://www.jsoftware.com/help/jforc/parsing_and_execution_ii.htm).
Given that we now have languages that combine a JIT with metaprogramming abilities such as Racket or Scheme, would it be possible to implement an interpreter-only language such as J as a set of macros to compile to the host language without compromising the original language behaviour?
I am asking this because, as I understand it, a JIT blurs the "compile-time vs runtime" frontier.
Based on the page you linked, it seems like there are 4 different kinds of language elements, and parsing depends on which of those kinds something evaluates to. I'd assume that in normal code, most expressions will always evaluate to the same kind, since otherwise the humans writing the code would get confused. In that case, it might be possible to eliminate most of the ambiguity through static type inference.
For programs where you are unable to eliminate that ambiguity at compile time, you could compile code into a series of of function calls that take the relevant runtime parameters and dispatch on the types to perform the appropriate action. If you do that in a way that's similar to the usual type-dispatch in the host language, the JIT compiler will likely optimize it using e.g. a polymorphic inline cache.
I hope that helps and you'll actually see my answer. If you do, I'd like to know what got you interested in that question. (Are you trying to optimize an existing J codebase?)