【问题标题】:What is a Nix expression in regard to Nix package management?关于 Nix 包管理的 Nix 表达式是什么?
【发布时间】:2020-02-03 05:08:53
【问题描述】:

即使在阅读了 Nix 手册之后,仍然对 Nix 表达式的真正含义感到困惑。有时它们被称为派生,但存储派生也有其他含义。

【问题讨论】:

    标签: nix


    【解决方案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 Store derivations”部分。

    额外

    Nix 表达式的普通形式

    根据“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 |              
        *----------------------*    
    

    (整个部分都值得一读。)

    【讨论】:

    • 值得一提的是ATerms,是衍生文件的格式。 Nix-the-programming-language 只是生成 ATerm 的一种(但不是唯一)方法。如here 所述,GUIX 项目使用 Guile 而不是 Nix 生成 ATerms。
    • 这太棒了,感谢您的帖子和指出!
    • 不,Nix 表达式实际上是用 Nix 语言表达的任何值或函数。你的定义太窄了,它与Nix manual 中的句子相矛盾,例如“一个集合只是一个键/值对的列表,其中每个键都是一个字符串,每个值都是一个任意的 Nix 表达式。”。 Nix 表达式可以是集合、数字、字符串和列表之类的东西;它们并不都是推导。
    • @David Grayson 你是对的,我采用了 Dolstra 论文中使用的狭义含义,即使在那儿他有时也将产生派生的 Nix 表达式称为 Nix 派生表达式。
    【解决方案2】:

    在 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 表达式的重要组成部分.)

    【讨论】:

    • 周围的括号是由于与外壳的交互。单引号告诉 bash 不要弄乱里面的东西(例如 * globbing)。通过 nix repl 进入 nix 求值环境,允许您在没有额外引号的情况下使用表达式。
    • 你的解释并没有告诉我为什么nix eval '1 + 2' 不起作用。 globbing 不是这里的一个因素。你不能责怪壳。我认为nix eval 的设计目的是为了在大多数情况下尝试评估不是真正的 Nix 表达式的不同内容,并且括号告诉它它应该实际评估一个表达式。
    • 我想我会看到我的低阅读理解自我了。干杯!
    猜你喜欢
    • 2019-11-22
    • 2019-11-22
    • 2021-07-17
    • 2022-07-22
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多