Design for supporting meta-programming in ATS2


#1

In the following project,
I outlined a design for supporting meta-programming in ATS2:

https://github.com/githwxi/ATS-Postiats-contrib/tree/master/projects/MEDIUM/LAMCAL

Broadly speaking, meta-programming means to write code that generates
code. There
two forms of codegen that I plan to support: external one and internal one.

(1) external codegen does code generation without need for internal
abstract syntax trees.

In lamcal_codegen.atxt, there are many atext-functions for external code
generation. For
instance, the following line

##ats2impl_compare2cmpops(tvar)

directs the generation of the following code (when it is processed by the
tool mytexting):

implement
lt_tvar_tvar(x1, x2) = (compare_tvar_tvar(x1, x2) < 0)
implement
lte_tvar_tvar(x1, x2) = (compare_tvar_tvar(x1, x2) <= 0)
implement
gt_tvar_tvar(x1, x2) = (compare_tvar_tvar(x1, x2) > 0)
implement
gte_tvar_tvar(x1, x2) = (compare_tvar_tvar(x1, x2) >= 0)
implement
eq_tvar_tvar(x1, x2) = (compare_tvar_tvar(x1, x2) = 0)
implement
neq_tvar_tvar(x1, x2) = (compare_tvar_tvar(x1, x2) != 0)

Of course, support for external codegen can be implemented in any
(scripting) language.
Using atexting is largely an experiment on my part. I am currently
thinking about trying out
PHP for this purpose.

(2) internal codegen does code generation that requires access to internal
abstract syntax trees.
For instance, the fprint-functions for tvar, term, and aterm are based on
code generated via internal
codegen. My hunch is that internal codegen can play a very big role in
support of domain-specific
programming (such as programming with session types, implementing hybrid
systems, etc.)

–Hongwei