[Haskell-cafe] [Haskell] ANN: syntactic-0.1
emax at chalmers.se
Mon May 9 13:54:42 CEST 2011
2011-05-07 09:52, Heinrich Apfelmus skrev:
> Emil Axelsson wrote:
>> I'm happy to announce the first release of syntactic:
>> providing generic abstract syntax and utilities for embedded
>> To get an idea of what it's about, check out the tiny(!)
>> implementation of (simplified) Feldspar in the Examples directory:
>> The library is intended to provide a growing set of utilities for
>> embedded languages. In particular, I hope to be able to provide safe
>> interfaces to various unsafe techniques for speeding things up.
>> Comments, patches and clients are welcome!
> Looks very interesting!
> I'm currently working on a functional reactive programming DSL. Source code:
> The EventD type represents the abstract syntax tree (line 150), which
> is then compiled in three phases (line 313)
> compile e ~= map compilePath =<< compileUnion =<< compileAccumB e
> If you look at the EventD type, you can see it contains a lot of
> "internal constructors" (line 158) that are created in destroyed in
> certain compilation phases. Ideally, I would make a new EventD type
> for each compilation phase that doesn't have any superfluous
> constructors. For instance, compileUnion removes the Union constructor.
Hello Heinrich! Thanks for your interest!
In principle, this is exactly the kind of thing you can do with
syntactic -- if you can make your data type fit into the framework, that
is. A compilation phase would then look something like this:
phase :: AST (C1 :+: TheRest) -> AST (C2 :+: C3 :+: TheRest)
This phase destroys the constructor C1 and introduces C2 and C3.
Now, the question is whether your data type can be made to fit into the
framework. The only problem I can see (but there may be more!) is that
you'd have to treat EventD and BehaviorD as parts of the same data
structure. I've pasted an example of how to do that here:
Here, the difference between Event and Behavior is denoted by the type
constructors E and B respectively:
type Event a = ASTF (Never :+: B2E :+: Pure :+: E2B) (E a)
type Behavior a = ASTF (Never :+: B2E :+: Pure :+: E2B) (B a)
You decide if this seems like an acceptable solution...
> I'm also unhappy about some of the boilerplate. For instance, have a
> look at the function goE in compileAccumB (line 210), it's just a
> generic applicative traversal through the data type.
Most likely, this boilerplate could be simplified using syntactic.
> Would your library make me happier? Note that I have an additional
> complication: I need to observe sharing and I need to support recursive AST.
I plan to add observable sharing soon. Once that's is in place, it
should -- I think/hope -- be easy to support cycles. This is not
something we need in Feldspar, so it might take a while before I get
around to supporting cycles, though.
I'd be happy to give more assistance should you choose to try out
syntactic for your library!
More information about the Haskell-Cafe