Zulip Chat Archive

Stream: lean4

Topic: Creating a DSL


Calvin Lee (Mar 20 2021 at 05:33):

Hi, are there any tips on creating a DSL? other than creating a new syntax kind? Is do notation defined anywhere that I can take a look at?

Julian Berman (Mar 20 2021 at 13:32):

Parser here and elaborator here it'd seem, if you haven't found those already.

Calvin Lee (May 05 2021 at 18:18):

Hello! I'm working on creating a DSL using macros.
I haven't programmed in lean for awhile though, so I have a bit of a silly question to start out with: how do you create a new syntax category?

Daniel Selsam (May 05 2021 at 18:27):

declare_syntax_cat mycat

syntax ident  : mycat
syntax "(" mycat ")" : mycat

syntax "to_term"  mycat : term

macro_rules
  | `(to_term $a:ident)  => `($a)
  | `(to_term ($a))      => `(to_term $a)

syntax "`[mycat|" mycat "]" : term

macro_rules
  | `(`[mycat| $m]) => `(to_term $m)

#check `[mycat| ((Nat.add))]

Calvin Lee (May 05 2021 at 18:34):

Is there any way I can make my DSL translate into the do DSL?
i.e. instead of term i would translate into the do category?

Mac (May 05 2021 at 18:38):

@Daniel Selsam fyi,toTerm! should probably be to_term to fit with the new Lean 4 naming conventions, correct? ! is now only supposed to be used for functions that panic (see https://github.com/leanprover/lean4/issues/406); macro keywords use snake case now (like nat_lit) .

Calvin Lee (May 05 2021 at 19:41):

Is there any way to generate some identifier I can use that won't interfere with anything else?

Mario Carneiro (May 05 2021 at 20:45):

This is the default behavior if you use a variable name in a macro. This is called "macro hygiene" and is a major part of the lean 4 macro framework


Last updated: Dec 20 2023 at 11:08 UTC