在Nix中,如何重构该配置?

时间:2018-08-26 14:44:29

标签: functional-programming nix

因此,我在NixOS中与Home-manager一起玩,以管理我的dotfile。我的一个点文件中有一些内容如下:

my_color0   = ${xrdb:color0}
my_color1   = ${xrdb:color1}
my_color2   = ${xrdb:color2}
my_color3   = ${xrdb:color3}
my_color4   = ${xrdb:color4}
my_color5   = ${xrdb:color5}
my_color6   = ${xrdb:color6}
my_color7   = ${xrdb:color7}
my_color8   = ${xrdb:color8}
my_color9   = ${xrdb:color9}
my_color10  = ${xrdb:color10}
my_color11  = ${xrdb:color11}
my_color12  = ${xrdb:color12}
my_color13  = ${xrdb:color13}
my_color14  = ${xrdb:color14}
my_color15  = ${xrdb:color15}

由于Nix具有功能,所以我想必须有一种简单的方法来使它更干燥。我似乎找不到与Python的range(0, 16)等效的函数。我想有一种方法可以映射某种模板。

1 个答案:

答案 0 :(得分:1)

可以做到。 Nixpkgs中的lib属性具有许多不时派上用场的功能。

您的示例让我有些担心,因为在我看来,将其重写为算法不会提供任何价值。我将假定这样的解决方案确实可以为您的实际问题提供价值。

这里有一个nix repl小会议,有一个解决方案:

~ $ nix repl '<nixpkgs>'
Welcome to Nix version 2.0.4. Type :? for help.

Loading '<nixpkgs>'...
Added 8623 variables.

nix-repl> :p lib.concatMapStringsSep "\n" (i: "my_color${toString i} = \${xrdb:color${toString i}}") (lib.range 0 15)   
"my_color0 = ${xrdb:color0}\nmy_color1 = ${xrdb:color1}\nmy_color2 = ${xrdb:color2}\nmy_color3 = ${xrdb:color3}\nmy_color4 = ${xrdb:color4}\nmy_color5 = ${xrdb:color5}\nmy_color6 = ${xrdb:color6}\nmy_color7 = ${xrdb:color7}\nmy_color8 = ${xrdb:color8}\nmy_color9 = ${xrdb:color9}\nmy_color10 = ${xrdb:color10}\nmy_color11 = ${xrdb:color11}\nmy_color12 = ${xrdb:color12}\nmy_color13 = ${xrdb:color13}\nmy_color14 = ${xrdb:color14}\nmy_color15 = ${xrdb:color15}"

'<nixpkgs>'参数从nixpkgs中的NIX_PATH中加载所有属性。

:p命令使值的打印不再那么懒惰,但是在这里实际上并不是必需的,因为不能部分评估字符串。处理属性集时,可能需要使用:p

其他有用的功能包括lib.concatStringsSepmap