Agda 中自定义语法声明的规则是什么?

What are the rules for custom syntax declarations in Agda?

Agda docs 中的 syntax 声明并没有太多可说的,粗略地浏览了源代码也没有什么启发,所以我一直在努力拼凑我自己使用标准库中的示例,如 Σ[_]_∃[_]_。我可以很容易地重现他们的例子(诚然相当做作)

twice : {A : Set} → (A → A) → A → A
twice f x = f (f x)

syntax twice (λ x → body) = twice[ x ] body

但是当我尝试定义绑定两个变量的自定义语法时,出现错误

swap : {A B C : Set} → (A → B → C) → B → A → C
swap f y x = f x y

syntax swap (λ x y → body) = swap[ x , y ] body

具体来说,

Parse error
y<ERROR>
 → body) = swap[ x , y ] body
...

所以我假设有一些关于 syntax 声明左侧允许的内容的规则。这些规则是什么,其中哪些禁止我上面的双变量 lambda 形式?

目前 Agda 不允许使用 multi-argument lambda 抽象的语法声明。这是一个已知的限制,请参阅 issue tracker 以获取相应的增强请求。