[Nix-dev] Re: args: with args

Michael Raskin 7c6f434c at mail.ru
Wed Mar 12 07:29:53 CET 2008


Eelco Dolstra wrote:
> I agree.  The "args; with args" construct basically says "this function 
> takes an arbitrary set of arguments, some of which may or may not be 
> used".  So you don't get error messages about missing arguments where 
> you might expect them (at call time).  And unnecessary arguments aren't 
> flagged at all.

 > Another downside to "with" is that it completely makes it impossible
 > to determine whether there are undefined variables in an expression. 
  > So statically checking Nix expressions for mistyped variable names
 > becomes impossible (at least under the "withs").

I sometimes even abuse the property about redundant arguments to make 
overriding phases easier (I mean overriding from caller).

And unused variables are not reported when you really need it anyway - 
with traditional style I often add something to arguments and to 
declaration but never actually use it. Takes some time to even recognize 
something is wrong (if it is a non-critical dependency).

About error reporting: you get stack trace anyway.

And is "args: ({some,thing,stdenv}: stdenv.mkDerivation{}) args; "
more acceptable for you? It will give statical verification, though it 
will make external overrides add some code to callee. I will generate 
buildInputs etc from args member list then.

I just have less problems debugging problems you mentioned (that surface 
  on their own) than checking that no difference between three copies of 
one list exist.

> Re builderDefs: I think the idea is to make the stdenv setup script 
> modular so that changes in one small part don't trigger rebuilds of 
> everything.  However whether this is actually worth it is questionable 
> (a change to the "doConfigure" phase will still rebuild pretty much 
> everything, and you can override the stdenv setup script on a 
> per-package basis anyway).  And certainly writing
You can make change to doConfigure conditional. Example I probably 
already cited: we will add LZMA support to unpackPhase. Options with 
traditional approach are:
1. Rebuild everything, including things not depending on any single 
unpacking LZMA for build.
1a. The same, but wait for some needed anyway gcc/glibc update. Takes 
some time.
2. Fork setup.sh one more time. I remember that last time it was done, 
setup-new-2.sh was already considered a bit too much.
3. Add support as a separate script/code snippet and include it from 
every expression using LZMA. I bet someone will write another version 
just because it is easy to forget that support already exists.

Note that doUnpack is used by next-to-every expression, yet adding some 
new unpack method is not triggering full rebuild in builderDefs.

> 
>   builder = writeScript (name + "-builder")
>     (textClosure localDefs [doConfigure doMakeInstall doForceShare 
> doPropagate]);
> 
> for every package is not very appealing.
I would object to the word "writing". I ask to use correct term editing, 
because whatever style you use, templates save a lot of typing, so it is 
strange not to use them. And I would say that the intent is quite 
straightforward.



More information about the nix-dev mailing list