# Design for supporting meta-programming in ATS2

**URL:** <https://discourse.ats-lang.org/t/design-for-supporting-meta-programming-in-ats2/611>\
**Category:** Google Group\
**Created:** [August 1, 2016, 3:38am UTC](https://discourse.ats-lang.org/t/design-for-supporting-meta-programming-in-ats2/611 "2016-08-01T03:38:15Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![gmhwxi](https://avatars.discourse-cdn.com/v4/letter/g/67e7ee/32.png) [@gmhwxi](https://discourse.ats-lang.org/u/gmhwxi)\
**Post date:** [August 1, 2016, 3:38am UTC](https://discourse.ats-lang.org/t/design-for-supporting-meta-programming-in-ats2/611/1 "2016-08-01T03:38:15Z")

</div>

> 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](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
