リストリテラル

[x₁, x₂, .. , xₙ] は、List α の項を簡単に作るための構文です。

もしこの構文がなければ、List α の項を作るためにはコンストラクタを使用するしかないので、次のように書く必要があります。

/-- 自前で定義したリスト型 -/
inductive MyList (α : Type) where
  | nil
  | cons (head : α) (tail : MyList α)
deriving DecidableEq

/-- 空リスト。標準の`List`のための記法と被るのを避けている。 -/
notation:max " ⟦⟧ " => MyList.nil

/-- `MyList`に要素を追加する。標準の`List`のための記法と被るのを避けている。 -/
infixr:80 " ::: " => MyList.cons

-- 項を作るのが面倒
/- info: 1 ::: 2 ::: 3 ::: ⟦⟧ : MyList Nat -/
#check 1 ::: 2 ::: 3 ::: ⟦⟧

しかし、リストリテラル構文があるおかげで、次のように見やすく簡潔に書くことができます。

/-- 自作のリストリテラル構文。なお末尾のカンマは許可される。
なお標準の`List`のための記法と被るのを避けている。 -/
syntax "⟦" term,*,? "⟧" : term

macro_rules
  | `(⟦ ⟧) => `(⟦⟧)
  | `(⟦$x⟧) => `($x ::: ⟦⟧)
  | `(⟦$x, $xs,*⟧) => `($x ::: (⟦$xs,*⟧))

-- 項を作るのが楽になった!
#guard ⟦1, 2, 3⟧ = 1 ::: 2 ::: 3 ::: ⟦⟧

-- 末尾のコンマは無視される
#guard ⟦1, ⟧ = 1 ::: ⟦⟧

-- 空リストもリストリテラル構文で書ける
#guard ⟦⟧ = MyList.nil (α := Unit)