Skip to content

Conversation

@clsty
Copy link
Contributor

@clsty clsty commented Sep 25, 2025

此为应 @ryan4yin 邀请大幅修改 Nix 语言快速入门工程的第三部分,范围是从开头到 with 表达式 一节之前的部分章节。

本次所做修改如下:

  • 添加注释一节(将缩进与换行合并到注释一节)
  • 添加列表一节
  • 修改 let 绑定一节
  • 调整章节结构,并添加导入语
  • 一些小修正

- 在正文开头添加关于注释的说明
- 添加关于集合的说明
- 修改 let 绑定一节
- 将缩进与换行移动到注释部分
- 调整章节结构
- 一些小修正
@clsty clsty marked this pull request as draft September 25, 2025 02:36
在若干小节开头添加导入语
@clsty clsty marked this pull request as ready for review September 25, 2025 02:59
Copy link
Member

@linyinfeng linyinfeng left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我觉得整体上,没有理清楚 nix 的一些基本的概念。
比如“语句”,“赋值语句”,“局部变量”等等在 nix 里面都是不存在的概念。
如果只是作为一种类比的话,那还可以,如果让读者认为 nix 真的有这些概念那就是负面的效果了。

这个问题在原文和修改后的内容中都广泛存在。

:::

## 赋值与集合
与大多数编程语言类似,变量与值是 Nix 语言中最基础的概念。本节将会介绍 Nix 中如何为变量**赋值**,以及最常用的数据类型——**属性集**,继而引出**递归属性集****列表**的概念。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nix 里并没有赋值这一概念,也没有赋值语句。

与大多数编程语言类似,变量与值是 Nix 语言中最基础的概念。本节将会介绍 Nix 中如何为变量**赋值**,以及最常用的数据类型——**属性集**,继而引出**递归属性集****列表**的概念。
### 名称和值

我们可以使用 `=` 为名称绑定值,形成赋值语句。例如将名称 `foo` 赋值为 `123`
Copy link
Member

@linyinfeng linyinfeng Sep 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a = b 在 nix 里并非赋值语句。在不同的语法里它表示不同的意思。

attribute set 字面量语法的一部分。这里的 a = 1 在 nix 里都不是一个变量名字,而是一个字符串 "a",把它说成是赋值语句是没有道理的。

{
    a = 1;
}

{
    "a" = 2;
}

{
    "${someVariable}" = 3;
}

在 let 中表示一个绑定。这里 a 才是一个变量名字,可能可以和赋值语句类比,那样还有一些道理。但我认为应该停留在类比的层面上,不能让读者误以为这是一种赋值。

let a = 1; in ...

当然,确实可以说 let 绑定是一种不可变的赋值,毕竟表现上是一样的,那可能也行吧。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

更重要的问题是,nix 里只有表达式,没有“语句”这一概念。


语法说明:

- 集合以 `{` `}` 为边界,其内部为多个赋值语句,且各个赋值语句末尾必须添加 `;`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

因为 nix 里并没有赋值语句这种东西,原文其实就有大问题了。

`in` 之间的语句中,你可以声明需要被复用的名称,并将其与值绑定。它们可以在
`in` 之后的表达式中发挥作用:
## let 绑定与属性访问
前面关于变量的赋值与使用是非常基本的,我们还需要更灵活的处理方法。本节将会介绍用于定义局部变量的 **let 绑定**,以及风格简洁的**属性访问**
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

因为 nix 都没有语句的概念,也没有“全局变量”的概念,因此也谈不上和“全局变量”对应的“局部变量”的概念。

## let 绑定与属性访问
前面关于变量的赋值与使用是非常基本的,我们还需要更灵活的处理方法。本节将会介绍用于定义局部变量的 **let 绑定**,以及风格简洁的**属性访问**
### `let` 绑定
有时我们希望定义一个变量,使其不影响全局,仅在局部生效。此时就可以使用 `let` 绑定,示例如下:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

还是那个问题,nix 就没有全局变量,除非使用 scopedImport 这种“邪道”。

@clsty
Copy link
Contributor Author

clsty commented Sep 25, 2025

非常感谢 @linyinfeng 的细心指导。

我的修改依据主要来自修改之前的本教程(“赋值语句”的说法就来自这里),以及 ryan4yin 之前写的教程(“局部变量”的说法就来自这里),再加上用 nix repl 等进行实际测试的结果,少量参考了 nix.dev

之后我会减少对中文资料的参考,而主要依照来自 nix.dev 等处的英文资料。只不过,这样做的耗时可能会非常夸张,我原计划的两周内完成很可能是做不到了。

@ryan4yin
Copy link
Member

ryan4yin commented Sep 25, 2025

我觉得既然原文已经大量使用了「赋值」等表达,这个 PR 至少不会让情况变得更坏,可以先合并,等 @clsty 对整篇文档完成一遍修缮后,再专门提一个 PR 统一修正相关的概念。

为了避免忘记,我可以提个 Issue 先记录下这个事。

附:我之前用「局部变量」,确实欠妥,刚翻了下 nix.dev 原文并没有类似的表达。

@ryan4yin ryan4yin merged commit 713c9b7 into NixOS-CN:main Sep 25, 2025
@clsty clsty changed the title 大修Nix语言快速入门(第三部分) 大修 Nix 语言快速入门(第三部分) Oct 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants