【发布时间】:2020-02-03 05:08:53
【问题描述】:
即使在阅读了 Nix 手册之后,仍然对 Nix 表达式的真正含义感到困惑。有时它们被称为派生,但存储派生也有其他含义。
【问题讨论】:
标签: nix
即使在阅读了 Nix 手册之后,仍然对 Nix 表达式的真正含义感到困惑。有时它们被称为派生,但存储派生也有其他含义。
【问题讨论】:
标签: nix
Nix 表达式 是一组指令 描述如何构建软件组件 (包、项目、应用程序等)使用 Nix 纯函数式语言。
To quote Gabriel Gonzalez: "您可以将推导视为 与语言无关的如何构建东西的秘诀 (例如 Haskell 包)。"
Nix 表达式也通常称为 派生(如 Nix 派生 表达式),但是
*------------------------------------------------------*
| |
| STORE DERIVATION =/= NIX EXPRESSION |
| |
*------------------------------------------------------*
| |
| NIX EXPRESSION == function |
| |
| ( Describes how to build a component. That is, how ) |
| ( to compose its input parameters, which can be ) |
| ( other components as well. ) |
| |
| STORE DERIVATION == function application |
| |
| ( Call a Nix expression with concrete arguments. ) |
| ( Corollary: a single Nix expression can produce ) |
| ( different derivations depending on the inputs. ) |
| |
*------------------------------------------------------*
Nix 表达式的目的是产生一个 store derivation 可以内置到组件中(可执行文件, 图书馆等)。
对于上下文:
图片取自Eelco Dolstra's PhD thesis,“2.4 Store derivations”部分。
根据“5.4 将 Nix 表达式翻译为 存储派生”在Eelco Dolstra's PhD thesis:
[Nix 表达式的] 范式应该 是
致电
derivation,或列表的嵌套结构和 包含调用的属性集 到
derivation。无论如何,这些推导 Nix 表达式 随后被翻译成存储派生。
一个包、应用程序、开发环境, 软件库等
更正式地来自“3.1 什么是组件?”在Eelco Dolstra's PhD thesis:
A software component is *-------------------------------------* 1. | a software artifact that is subject | | to automatic composition | *-------------------------------------* It can require, and be required by, other components. *----------------------* 2. | a unit of deployment | *----------------------*
(整个部分都值得一读。)
【讨论】:
在 Nix 中,Nix 表达式 只是您可以用 Nix 语言编写的任何类型值的通用术语。 Nix 表达式可以是集合、列表、数字、字符串、函数、名称、算术运算、函数调用等等。
Nix 表达式可以包含其他 Nix 表达式:例如,表达式 1 + 2 包含两个表达式:1 和 2。
人们通常喜欢编写复杂的 Nix 表达式来表示如何构建软件。这些表达式实际上只是带有一些特殊属性的集合。 Nix 软件可以评估这样的表达式并将其转换为 .drv 文件(描述如何构建某些软件的非常简单、紧凑的方式),然后可以构建该文件。
您可以使用 Nix 语言和 Nix 表达式做很多不涉及派生或构建软件的事情。 nix eval 命令可让您评估 Nix 表达式。运行nix eval --help 来查看它的帮助屏幕,或者运行这些命令来计算一些简单的表达式:
nix eval '(1 + 2)' # gives 3
nix eval '({ a = 1; b = 2; }.a)' # gives 1
(由于某种原因,这个命令似乎要求在它评估的大多数 Nix 表达式周围加上括号,但这似乎是一个错误或奇怪的设计选择,并且括号不是每个 Nix 表达式的重要组成部分.)
【讨论】:
nix eval '1 + 2' 不起作用。 globbing 不是这里的一个因素。你不能责怪壳。我认为nix eval 的设计目的是为了在大多数情况下尝试评估不是真正的 Nix 表达式的不同内容,并且括号告诉它它应该实际评估一个表达式。