1
Fork 0
mirror of https://github.com/RGBCube/Site synced 2025-08-01 13:37:49 +00:00

Add more iceberg post

This commit is contained in:
voyager256 2024-06-19 17:03:37 +03:00
parent 532e2ed431
commit dc78db1538

View file

@ -720,3 +720,72 @@ bool EvalState::eqValues(Value & v1, Value & v2, const PosIdx pos, std::string_v
This "temporary hack" was commited in 14 years ago. You can do whatever This "temporary hack" was commited in 14 years ago. You can do whatever
you want with this information. you want with this information.
## Nix Plugins
As suprising as it sounds, Nix does indeed supports plugins. You can load plugins
using the [`plugin-files`](https://nix.dev/manual/nix/2.22/command-ref/conf-file#conf-plugin-files)
configuration option.
From the configuration reference:
> A list of plugin files to be loaded by Nix. Each of these files will be dlopened by
> Nix. If they contain the symbol nix_plugin_entry(), this symbol will be called.
> Alternatively, they can affect execution through static initialization. In particular,
> these plugins may construct static instances of RegisterPrimOp to add new primops
> or constants to the expression language, RegisterStoreImplementation to add new
> store implementations, RegisterCommand to add new subcommands to the nix command,
> and RegisterSetting to add new nix config settings. See the constructors for those
> types for more details.
>
> Warning! These APIs are inherently unstable and may change from release to release.
>
> Since these files are loaded into the same address space as Nix itself, they must
> be DSOs compatible with the instance of Nix running at the time (i.e. compiled
> against the same headers, not linked to any incompatible libraries). They should
> not be linked to any Nix libs directly, as those will be available already at load time.
>
> If an entry in the list is a directory, all files in the directory are loaded
> as plugins (non-recursively).
Some example plugins are [`nix-doc`](https://github.com/lf-/nix-doc)
and [`nix-extra-builtins`](https://github.com/shlevy/nix-plugins).
## `/bin/sh` and sandbox impurity
By setting the [`sandbox-paths`](https://nix.dev/manual/nix/2.22/command-ref/conf-file#conf-sandbox-paths)
option to `/bin/sh=/bin/sh`, Nix will bind the `/bin/sh` path in the
build sandbox (left) to the `/bin/sh` path in the host (right).
This is of course impure, but is useful for bootstrapping from
absolute scratch without copying impure binaries to the Nix store.
## `rec { a = 5; b = a + 1; __overrides.a = 6; }`
There is a special field named `__overrides` in recursive attrset expressions,
which simply overrides the parent attribute set with the keys inside it. This
is different from the update operator (`//`) because that will not override the
self-referneces in the recursive attribute set.
`rec { a = 5; b = a + 1; __overrides.a = 6; }.b` will evaluate to 7,
while `(rec { a = 5; b = a + 1; } // { a = 6; }).b` will evaluate to 6.
## `let __div = c: map (__mul c); in 2 / [ 1 2 3 ]`
As mentioned in my [HTMNIX blog post](/blog/htmnix), Nix operators get
desugared into normal function calls before execution. All operators
have their "hidden" equivalents that they get desugared into (`__div` is for `/`, etc.),
so you can override them using `let in`.
`let __div = c: map (__mul c); in 2 / [ 1 2 3 ]` is equivalent to
`map (x: 2 * x) [ 1 2 3 ]` which evaluates to `[ 2 4 6 ]`.
You can also check what a Nix snippet desugars into
using `nix-instantiate --parse --expr 'expression here'`
## `let __lessThan = a: b: b - a; in 1 > 2`
As mentioned above, this expression will desugar into
`let __lessThan = a: b: b - a; in __lessThan 1 2` which
will evaluate to 1.
## `__impure`