-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-- https://hirrolot.github.io/posts/why-static-languages-suffer-from-complexity.html
inductive Fmt where
| FArg : Fmt → Fmt
| FChar : Char → Fmt → Fmt
| FEnd
def toFmt : List Char → Fmt
| '*' :: xs => .FArg <| toFmt xs
| x :: xs => .FChar x <| toFmt xs
| [] => .FEnd
def PrintfType : Fmt → Type 1
| .FArg fmt => {α : Type} → [ToString α] → α → PrintfType fmt
| .FChar _ fmt => PrintfType fmt
| .FEnd => PLift String
def printf (fmt : String) : PrintfType <| toFmt fmt.toList :=
let rec printfAux (fmt : Fmt) (acc : List Char) : PrintfType fmt :=
match fmt with
| .FArg fmt => fun x => printfAux fmt <| acc ++ (toString x).toList
| .FChar c fmt => printfAux fmt <| acc ++ [c]
| .FEnd => .up acc.asString
printfAux (toFmt fmt.toList) []
#eval printf "Hello * * *" (-1) [42, 69] "Meow" |>.down