В Nix, как я могу рефакторинг этой конфигурации? - PullRequest
0 голосов
/ 26 августа 2018

Так что я играю с домашним менеджером в NixOS для управления моими точечными файлами.У меня есть что-то в одном из моих точечных файлов, которое выглядит следующим образом:

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 голосов
/ 26 августа 2018

Это можно сделать. Атрибут lib в Nixpkgs содержит множество функций, которые время от времени оказываются полезными.

Я немного обеспокоен вашим примером, потому что переписывание этого алгоритма не дает никакой ценности в моей перспективе. Я предполагаю, что такое решение действительно имеет значение в вашей реальной проблеме.

Вот небольшой 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 делает печать значения менее ленивой, но в этом нет особой необходимости, поскольку строка не может быть частично оценена. Когда вы имеете дело с attrsets, вы можете использовать :p.

Другие полезные функции включают lib.concatStringsSep и map.

...