13 ms·
But the bespoke language has some benefits. It’s concise and specifically designed for the problem. Also Nix has more contributors and that is very important to
by svd4anything 7y ago
But the bespoke language has some benefits. It’s concise and specifically designed for the problem. Also Nix has more contributors and that is very important to have a large collection of recipes to start from.
- Koshkin 7y agoScheme, being a Lisp, is exceptionally well-suited to serve as a base for DSLs.
- svd4anything 7y agoOk I’ll give another reason. Nix community is more relaxed and doesn’t downvote just because they don’t like some comment or somebody disagrees with them.
- celticmusic 7y agoI bet you the irony of your downvotes is lost on the people downvoting.
- svd4anything 7y agoFor sure they are pilling on ... for what I don’t get. Relax people.
- kragen 7y agoYes, Scheme is a bit verbose for my taste.
- catalogia 7y agoThere are obviously some differences between the two, but I'm not really perceiving any real verbosity gap between the two, one way or the other. Here is a guix package declaration for tmux: [Edit: fixed indentation] (define-module (gnu packages tmux) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix build-system gnu) #:use-module (guix build-system trivial) #:use-module (gnu packages) #:use-module (gnu packages bash) #:use-module (gnu packages libevent) #:use-module (gnu packages ncurses)) (define-public tmux (package (name "tmux") (version "3.0a") (source (origin (method url-fetch) (uri (string-append "https://github.com/tmux/tmux/releases/download/" version "/tmux-" version ".tar.gz")) (sha256 (base32 "1fcdbw77nz918f7gqc1ga7zlkp1g112in1h8kkjnkadgnhldzlaa")))) (build-system gnu-build-system) (inputs `(("libevent" ,libevent) ("ncurses" ,ncurses))) (home-page "https://tmux.github.io/") (synopsis "Terminal multiplexer") (description "tmux is a terminal multiplexer: it enables a number of terminals (or windows), each running a separate program, to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached.") (license license:isc))) Here is (roughtly) the equivalent in Nix: { stdenv, fetchFromGitHub, autoreconfHook, ncurses, libevent, pkgconfig, makeWrapper }: let bashCompletion = fetchFromGitHub { owner = "imomaliev"; repo = "tmux-bash-completion"; rev = "fcda450d452f07d36d2f9f27e7e863ba5241200d"; sha256 = "092jpkhggjqspmknw7h3icm0154rg21mkhbc71j5bxfmfjdxmya8"; }; in stdenv.mkDerivation rec { pname = "tmux"; version = "2.9a"; outputs = [ "out" "man" ]; src = fetchFromGitHub { owner = pname; repo = pname; rev = version; sha256 = "040plbgxlz14q5p0p3wapr576jbirwripmsjyq3g1nxh76jh1ipg"; }; nativeBuildInputs = [ pkgconfig autoreconfHook ]; buildInputs = [ ncurses libevent makeWrapper ]; configureFlags = [ "--sysconfdir=/etc" "--localstatedir=/var" ]; postInstall = '' mkdir -p $out/share/bash-completion/completions cp -v ${bashCompletion}/completions/tmux $out/share/bash-completion/completions/tmux ''; meta = { homepage = http://tmux.github.io/; description = "Terminal multiplexer"; longDescription = '' tmux is intended to be a modern, BSD-licensed alternative to programs such as GNU screen. Major features include: * A powerful, consistent, well-documented and easily scriptable command interface. * A window may be split horizontally and vertically into panes. * Panes can be freely moved and resized, or arranged into preset layouts. * Support for UTF-8 and 256-colour terminals. * Copy and paste with multiple buffers. * Interactive menus to select windows, sessions or clients. * Change the current window by searching for text in the target. * Terminal locking, manually or after a timeout. * A clean, easily extended, BSD-licensed codebase, under active development. ''; license = stdenv.lib.licenses.bsd3; platforms = stdenv.lib.platforms.unix; maintainers = with stdenv.lib.maintainers; [ thammers fpletz ]; }; }
- kragen 7y agoI feel like (inputs `(("libevent" ,libevent) ("ncurses" ,ncurses))) is pretty bad compared to buildInputs = [ ncurses libevent makeWrapper ]; even if you go by token count. (I think it's 16 vs. 8.) A different problem is that syntactically the Scheme version looks like a call to a function called “inputs” and I don't think it is; that depends on context. In general in Lisps the interpretation of everything depends on syntactic context, so you have to do a lot of processing consciously that you can do subconsciously in languages that have a syntax. (There's an indentation error in either your example or my browser that makes that input clause appear to belong to the origin clause rather than the package clause, btw. The extra redundancy of the different kinds of delimiters makes that error harder to make in Nix. I wrote about this more at length in http://www.paulgraham.com/redund.html http://www.paulgraham.com/redund.html ) The module imports at the top are a lot more egregious but that's because they're using Guile’s module system naked; it's not really the fault of Scheme's syntax per se and I think you could hack together some kind of macrological solution. I think Scheme is brilliant and probably a better choice, but I think the syntactic cost is pretty heavy in your example. When it comes to Nix and Guix, though, these are kind of minor details. More important questions are things like “does it have the software I want in it” and “how reproducible is it” and “how do I figure out what's broken”.
- catalogia 7y agoOn the other hand you've got 'stdenv' all over the place in the Nix example, e.g. stdenv.lib.licenses.bsd3 vs license:bsd3. Also stdenv.mkDerivation is kind of an eyesore compared to define-public / package. One is nicer than the other in a few different minor ways, but overall I think it's basically a wash. I'd not consider verbosity a factor if choosing between the two. >(There's an indentation error in either your example or my browser that makes that input clause appear to belong to the origin clause rather than the package clause, btw. Sorry about that, I botched the indentation when I pasted that into my scratch buffer, which had unbalanced parens in it. That's on me.
- kragen 7y agoThat sounds like a reasonable point of view.
- geofft 7y agoDo Nix and Guix expressions not interoperate? Is that a fundamental limitation of the system (at lest as fundamental as, say, dpkg and rpm) or could one write a source-level translator?
- kragen 7y agoIt's a good question. They don't interoperate now.