I tried to experiment a bit with sexp-grammar today, to see if I could use it to create an isomorphic transformation from Futhark core language (IR) to sexps, which would be very useful for testing stuff like my last use and interference analyses. After getting Troels to bump the stack snapshot, I was successfully able to add sexp-grammar as a dependency to futhark and start creating isomorphisms. Everything started out pretty well. For example, here are the isomorphisms for Name and VName:

 1: instance SexpIso Name where
 2:   sexpIso = with (\name -> name . symbol)
 5: instance SexpIso VName where
 6:   sexpIso = with $ \vname ->  -- Person is isomorphic to:
 7:     Sexp.list (                           -- a list with
 8:       Sexp.el (Sexp.sym "vname") >>>          -- a symbol "person",
 9:       Sexp.el sexpIso         >>>          -- a string, and
10:       Sexp.el Sexp.int)  >>>     -- an optional keyword :age with int value.
11:     vname

I then tried taking on a bigger task: PrimValue. Unfortunately, down the line that requires isomorphims for Int8 and friends, which don't derive Generic, and sexp-grammar doesn't work

Well, turns out it wasn't actually that hard, to fix. I can just use iso to transform to and from an int, which I then read:

1: instance SexpIso IntValue where
2:   sexpIso = match
3:     $ With (\int8val -> int8val . iso fromIntegral fromIntegral . Sexp.int)
4:     $ With (\int16val -> int16val . iso fromIntegral fromIntegral . Sexp.int)
5:     $ With (\int32val -> int32val . iso fromIntegral fromIntegral . Sexp.int)
6:     $ With (\int64val -> int64val . iso fromIntegral fromIntegral . Sexp.int)
7:     $ End

Then I don't need to specify an isomorphism for Int8.

The next problem came when I tried to use sexp-grammar inside Futhark.IR.Primitive. Because it is marked as Safe, but sexp-grammar is not, I need to change Futhark.IR.Primitive to be Trustworthy instead. I don't know if this is the right way to go about things, and ideally sexp-grammar would just be safe as well.