即使阅读了Nix手册,它仍然使Nix的表达真正混淆。有时它们被称为派生,但商店派生也意味着其他。
A 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 | *----------------------*
(整个部分值得一读。)
在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表达式必不可少的部分。 )