Nix 的“callPackage”如何调用没有省略号定义的函数?

2023-11-22

要调用使用集合解构的 Nix 函数,您需要向其传递一个集合exactly它需要的键不多也不少:

nix-repl> ({ a }: a) { a = 4; b = 5; }
error: anonymous function at (string):1:2 called with unexpected argument ‘b’, at (string):1:1

例外情况是函数的参数列表末尾包含省略号:

nix-repl> ({ a, ... }: a) { a = 4; b = 5; }
4

然而,大多数包nixpkgs由一个default.nix包含函数的文件是not用这个省略号定义。然而,不知怎的,当你使用callPackage,它设法调用这些函数并仅向它们传递它们需要的参数。这是如何实施的?


有一个反射primop,可以解构函数参数:

nix-repl> __functionArgs ( { x ? 1, y }: x )
{ x = true; y = false; }

callPackage然后迭代这些属性名称,获取所需的包并构造包的 attrset,稍后将其提供给被调用的函数。

这是一个简单的例子:

nix-repl> callWithExtraArgs = f: args:
            let
              args' = __intersectAttrs (__functionArgs f) args;
            in
              f args'

nix-repl> callWithExtraArgs ({ x }: x + 1) { x = 4; y = 7; }
5

要浏览 Nix primops,请访问15.5。内置功能 in the 尼克斯手册(或参见不稳定分支的文档).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nix 的“callPackage”如何调用没有省略号定义的函数? 的相关文章

随机推荐

  • 带有 MediaCodec Surface 的 AVC 硬件编码器可靠性如何?

    我正在开发一个 Android 应用程序 该应用程序使用 MediaCodec 使用 Surface 方法对 H 264 视频进行编码 我的目标是 Android 5 0 并且遵循了 bigflake com 中的所有示例和样本 我两年前开
  • MATLAB 中的矩阵乘法时间复杂度

    有谁知道MATLAB使用哪种算法进行矩阵乘法以及它的时间复杂度是多少 为了完整起见 如中所述这个线程 Matlab 使用DGEMM 双通用矩阵乘法 例程来自BLAS 基本线性代数子程序 请注意 BLAS 不存在单一的实现 它针对特定的处理器
  • newtonsoft json序列化时间跨度格式

    是否可以指定自定义格式TimeSpan序列化 使用Newtonsoft Json 我想要格式为 HH mm 的序列化字符串 例如 TimeSpan FromHours 5 gt 05 00 TimeSpan FromHours 5 gt 0
  • 更好的 git add -p 吗?

    有时我在没有安装 X Window 的系统上工作 并且无法使用 Git GUI 现有的控制台替代品是什么git add p 我几乎喜欢它所做的一切 实际上比 Git GUI 更喜欢 但我讨厌它不允许我查看整个图片并选择我想要查看块的顺序 这
  • .forEach 中 thisArg 的用途是什么?

    JavaScript 的对于每个文档指出 forEach语法是 arr forEach callback thisArg 有什么用thisArg The thisArg可以提供改变inner this的回调函数 未指定thisArg结果是t
  • 导入 theano 时出错“无法导入名称 gof”

    我目前收到错误 导入错误 无法导入名称 gof 导入 theano 时 gt gt gt import theano Traceback most recent call last File
  • 延迟生成 powerset

    我想计算一个集合的幂集 因为我不需要一次需要整个 powerset 所以最好延迟生成它 例如 powerset set a b c seq set set a set b set c set a b set a c set b c set
  • 组合 R + awk + ​​bash 命令

    我想结合awk和R语言 问题是我在指定目录中有一组 txt 文件 并且我不知道文件头的长度 在某些情况下 我必须跳过 25 行 而在其他情况下 我必须跳过 27 行等 所以我想输入一些 awk 命令来获取要跳过的行数 一旦获得该值 我就可以
  • 当初始化固定大小的 char 数组时没有足够的空间容纳 null 终止符时,不会出现编译器错误

    假设我有以下 c char 数组 char okaysize4 5 four line 5 char toosmall4 4 four line 6 char toosmall3 3 four line 7 当我使用 gcc 4 4 7 编
  • ES6 模板文字 - 从字符串中删除 \n

    我正在将多行变量更改为Template Literals太神奇了 但后来我注意到我所做的缩进被转换 缩小 为 n与我在原始代码上所做的缩进 我怎样才能避免这种情况 Ex var div div class proj div class bo
  • 如何在 Windows 窗体中模仿 JavaScript 的 onBlur 事件?

    我在 Windows 窗体上有电话和电子邮件文本框 我想在用户离开字段时对其进行验证 当我双击 Visual Studio 表单设计器中的文本框时 它会创建一个textchanged事件 这不太合适 因为仅当用户输入完整条目时才调用验证方法
  • 如何检查 perl 中是否声明了变量?

    我在用use strict 在 perl 中 我使用以下语句 unless defined x print Not defined 其中 x 没有在任何地方声明 所以我希望它打印 Not defined 但它返回一个错误 Global sy
  • 创建 JSONObject 时 org.json 未报告异常

    谁能帮助我理解出了什么问题 unreported exception org json JSONException must be caught or declared to be thrown jsonObj new JSONObject
  • 将浮点数组转换为字符串的最快方法是什么? [复制]

    这个问题在这里已经有答案了 在 C 中将浮点数组转换为字符串的最快方法是什么 如果我的数组包含这个 0 1 1 1 1 0 0 2 然后我希望每个条目转换为一个字符串 其值由空格分隔 即 0 1 1 1 1 0 0 2 我会选择最具可读性的
  • 在数据框上使用 If/Else

    我有一个数据集 看起来像 data lt c 0 1 2 3 4 2 3 1 4 3 2 4 0 1 2 0 2 1 2 0 4 frame lt as data frame data 我现在想在此数据框中创建一个新变量 如果 数据 列报告
  • Laravel 5 - 查找模型的分页页面

    我正在努力建立一个基本论坛 灵感来自laracasts com 讨论 当用户发布对主题的回复时 我想引导他们到列表的末尾分页回复及其回复的锚点 与 Laracasts 的行为相同 我还想在用户编辑回复之一时将其返回到正确的页面 我怎样才能知
  • LinkedList 上的 LINQ - 迭代 LinkedListNode,而不是 T

    我在理解如何在 LINQ 中执行某些操作时遇到问题 我有一个链表 对象的类型并不重要 重要的是我想做一些事情Where 基于当前对象之间的关系以及列表中的下一个 为什么我不能做类似的事情 linkedlist Where n gt a fu
  • 什么会导致算法具有 O(log n) 复杂度?

    我对大 O 的了解是有限的 当对数项出现在方程中时 它让我更加困惑 有人可以用简单的语言向我解释一下什么是O log n 算法是 对数从何而来 当我试图解决这个期中练习题时 特别出现了这个问题 令 X 1 n 和 Y 1 n 包含两个整数列
  • 如何修复此跨域 ActionScript 3 错误?

    我将尽可能具体和详细 并包含一些我正在使用的代码 我已经进行了搜索并发现这个问题 这看起来很相似 然而 作者使用的是 ActionScript 2 而不是 3 我似乎无法有效地将给出的任何答案应用于我自己的情况 我试图通过 Flash Ac
  • Nix 的“callPackage”如何调用没有省略号定义的函数?

    要调用使用集合解构的 Nix 函数 您需要向其传递一个集合exactly它需要的键不多也不少 nix repl gt a a a 4 b 5 error anonymous function at string 1 2 called wit