Lean 4(元)编程 Cookbook

读写 TOML 文件🔗

处理文件包括从磁盘读取字符串并传给我们的解析器,或者把一个 Table 格式化输出到文件。我们将使用上一节中定义的 ServiceConfig 结构。

从 TOML 文件读取🔗

要读取一个 TOML 文件,我们把文件内容读为字符串,解析成一个 Table,然后把该表解码成一个 Lean 结构。

def loadTomlConfig (path : System.FilePath) : CoreM ServiceConfig := do let content IO.FS.readFile path let table parseToml content let val := Value.table' .missing table let result : EStateM.Result Unit (Array DecodeError) ServiceConfig := decodeToml val #[] match result with | .ok cfg _ => return cfg | .error _ errs => let msgs := errs.toList.map (fun (e : DecodeError) => e.msg) throwError s!"Failed to decode {path}: {msgs}"

写入 TOML 文件🔗

要写入 TOML,我们用 toToml 把 Lean 结构转换成一个 Value,提取其底层的 Table,然后用 ppTable 把它格式化为标准的多行 TOML 字符串。

def saveTomlConfig (path : System.FilePath) (cfg : ServiceConfig) : IO Unit := do let val := toToml cfg let content := match val with | .table' _ tbl => ppTable tbl | _ => toString val -- Fallback to inline format IO.FS.writeFile path content

示例:嵌套的往返转换🔗

def egRoundTrip : CoreM String := do let path : System.FilePath := "service_config.toml" let config : ServiceConfig := { name := "Production", addresses := #[{ host := "127.0.0.1", port := 80 }] } -- Save it saveTomlConfig path config -- Load it back, just for demonstration let loaded loadTomlConfig path return s!"Loaded config for: {loaded.name}" -- #eval egRoundTrip