Zulip Chat Archive
Stream: lean4
Topic: Processing sepBy's
Siddharth Bhat (Oct 01 2021 at 03:11):
Suppose I have a syntax category called kvbare of string key-values, given by the syntax key===value. I now want to create a macro for a "dictionary", which is given by <[ key1 === value, key2 === value2, ..., keyn === valuen ]>. The macro should desugar into List (String × String). Here's what I have so far:
declare_syntax_cat kvbare
syntax str "===" str  : kvbare
syntax "kvbare% " kvbare : term
macro_rules
  | `(kvbare% $i:strLit ===  $j:strLit ) => `( ($i , $j) )
def foobare := (kvbare%  "foobare"  ===  "barbare" )
declare_syntax_cat dict
syntax "<[" sepBy(kvbare, ",") "]>" : dict
syntax "dict% " dict : term
macro_rules
  | `(dict% <[ $kvs,* ]> ) => do
     let initList <- `([])
     kvs.getElems.foldlM (init := initList) fun xs kv => `((kvbare% $kv) :: $xs )
def dict0 : List (String×String) := (dict% <[  ]> )
#print dict0
def dict1 : List (String×String) := (dict% <[ "foo" === "bar" ]> )
#print dict1
def dict2 : List (String×String) := (dict% <[ 1 === 2 ]> )
#print dict2
This works properly on dict0 and dict1, and correctly errors on dict2, since the key and value are int, not string.  I have  a few questions at this stage:
- What are the special features of the MacroMmonad? For one, one can use quoting inside theMacroMcontext. Are the functions I should be aware of / are commonly used, as a macro author?
- The error for dict2is:
crash.lean:37:46: error: expected ']>'
def dict2 : List (String × String) :=
[]
is it possible to add hints to produce a more precise error? I would have expected an error of the form expected kvbare  pointing at 1 === 2. I understand if this is difficult/impossible due to the complexity of the LEAN parser.
Last updated: May 02 2025 at 03:31 UTC