即使阅读了Nix手册,它仍然使Nix表达式的真正含义感到困惑。有时它们被称为派生,但是商店派生也意味着其他。
答案 0 :(得分:3)
在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表达式必不可少的部分)
答案 1 :(得分:1)
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存储派生”部分中获取的图像。
根据“ 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 | *----------------------*
(整个部分值得阅读。)