2024 年圣诞挑战在 Nix 中 - 第 01 - 03 天

这是 2024 年 Nix 语言 Advent of Code 系列文章的一部分,主要内容如下:

  • 系列目录:包含“在纯 Nix 中进行 Advent of Code”“Nix 语言是否良好”“仓库设置”“每日模板”“第 01 天”“第 02 天”“第 03 天”“Nix 技巧”等章节。
  • 做 Advent of Code 用纯 Nix:意味着使用 Nix 评估语言,定义“纯 Nix”为nix eval <我的代码>能返回 Advent of Code 每个问题的答案,允许IFD 或从派生导入,但要避免不必要的派生构建。
  • Nix 语言是否良好:认为 Nix 语言在定义声明式构建方面表现不错,如处理属性集、懒求值等,但存在错误消息混乱、无静态类型、缺少顶级 LSP 等问题,目前有限的标准库在定义构建时也能满足需求。
  • 仓库设置:通过nix flake --refresh init --template github:JRMurr/NixOsConfig#common初始化仓库,添加了flake.envrcjust等。
  • 日模板:为 Advent of Code 的每个谜题创建模板,包含标准结构和实用函数,如part0part1solve等,通过复制模板创建每日目录,还制作了run-day脚本方便运行。
  • 第 01 天:谜题是处理包含两列数字的文件,计算特定条件下的差异和计数。通过noogle查找 Nix 函数,如splitStringtoIntBase10sortOnzipListsWith等,还自定义了abs函数。
  • 第 02 天:格式为按行分割输入并进行检查,在第一部分中通过getAdjPairs获取相邻对,diffPair计算差值,isSafe函数检查列表的安全性。第二部分添加了删除一个数字使列表安全的条件,通过跟踪失败的索引和尝试删除特定数字来实现。
  • 第 03 天:问题是基本的解析器,由于 Nix 的builtins.match正则支持有限,选择使用 IFD 调用ripgrep进行匹配。在第一部分中,通过callRg创建派生调用ripgrep,在第二部分中修改callRg以处理do()don't()命令,并在 Nix 中处理逻辑。
  • Nix 技巧:推荐使用Noogle,查看lib.debug 命名空间中的traceSeq用于调试,使用良好的语言服务器如nilnixd,遇到堆栈跟踪时先避免冗长的堆栈跟踪,通常问题在跟踪的第一行或最后一行。
阅读 3
0 条评论