这是 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
、.envrc
和just等。 - 日模板:为 Advent of Code 的每个谜题创建模板,包含标准结构和实用函数,如
part0
、part1
、solve
等,通过复制模板创建每日目录,还制作了run-day
脚本方便运行。 - 第 01 天:谜题是处理包含两列数字的文件,计算特定条件下的差异和计数。通过
noogle
查找 Nix 函数,如splitString
、toIntBase10
、sortOn
、zipListsWith
等,还自定义了abs
函数。 - 第 02 天:格式为按行分割输入并进行检查,在第一部分中通过
getAdjPairs
获取相邻对,diffPair
计算差值,isSafe
函数检查列表的安全性。第二部分添加了删除一个数字使列表安全的条件,通过跟踪失败的索引和尝试删除特定数字来实现。 - 第 03 天:问题是基本的解析器,由于 Nix 的
builtins.match
正则支持有限,选择使用 IFD 调用ripgrep
进行匹配。在第一部分中,通过callRg
创建派生调用ripgrep
,在第二部分中修改callRg
以处理do()
和don't()
命令,并在 Nix 中处理逻辑。 - Nix 技巧:推荐使用Noogle,查看lib.debug 命名空间中的
traceSeq
用于调试,使用良好的语言服务器如nil或nixd,遇到堆栈跟踪时先避免冗长的堆栈跟踪,通常问题在跟踪的第一行或最后一行。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。