Higher-order abstract syntax
en.wikipedia.org
en.wikipedia.org
Regardless, besides the question posed by OP, I wonder what the relation between SSA and HOAS might be?
HOAS is a form of embedding a language L with binders into a language L-Base also with binders and functions, but such that L-binders are handled by functions in L-Base and the problem of defining capture-avoiding substitution for L-terms is reduced to reusing L-Base's capture-avoiding substitution. (NB L = L-Base is possible but not required.)
HOAS is neat, but (simplifying a bit) prevents you from making inductive definitions on L terms. There are various ways of getting around this shortcoming, the most principled one is probably the nominal approach of A. Pitts et al. Another problem with HOAS is that the representation may contain 'junk'. That means there are L-Base terms that do not represent L-programs.
https://stackoverflow.com/questions/22676975/simple-lambda-c...
Candidly, I find them a pain to write, but it is faster and integrates with the host language's type checker.
[1] https://hackage.haskell.org/package/bound [2] https://github.com/ermine-language/ermine
I cannot recommend HOAS outside of very narrow areas.
Full disclosure: Brigitte Pientka was my supervisor. I did not work on the compiler, but I did make the language's logo.
Maybe that's pretty non-standard. I like thinking of shallow-deep as a continuum, though.
HOAS is a great example. There is the creation of an AST, but perhaps the most important and tricky part of any AST, the binding system, is left to the metalanguage. For that reason exactly I'm happy to say that HOAS is "shallower" than, say, a de Bruijn indexed binding system.
[1] https://github.com/fritzo/hstar/blob/6df3347/src/DeBruijn.v#... [2] https://github.com/fritzo/pomagma/blob/ada575c/src/reducer/s...