Efraim Flashner <efr...@flashner.co.il> skribis: > From 09eef9cd841a7d212e024be0609168611923696b Mon Sep 17 00:00:00 2001 > From: Efraim Flashner <efr...@flashner.co.il> > Date: Sun, 22 May 2016 14:56:06 +0300 > Subject: [PATCH] bournish: Add `wc' command. > > * guix/build/bournish.scm (lines+chars, only-files, wc-commands, > wc-command-implementation, wc-l-command-implementation, > wc-c-command-implementation): New variables.
s/variables/procedures/ :-) > (%commands): Add wc command. [...] > +(define (only-files files) > + (filter (lambda (file) > + (catch 'system-error > + (lambda () > + (stat file)) > + (lambda args > + (let ((errno (system-error-errno args))) > + (format (current-error-port) "~a: ~a~%" > + file (strerror errno)) > + #f)))) > + files)) > + > +(define (wc-command-implementation . files) > + (for-each > + (lambda (file) > + (let-values (((lines chars) > + (call-with-input-file file lines+chars))) > + (format #t "~a ~a ~a~%" lines chars file))) > + ((@@ (guix build bournish) only-files) files))) I prefer the approach Ricardo suggested, I think it’s more concise and clearer: https://lists.gnu.org/archive/html/guix-devel/2016-06/msg00525.html Also, note that @@ would not be needed here; @@ serves to access private bindings within a specific module: https://www.gnu.org/software/guile/manual/html_node/Using-Guile-Modules.html Last, do not miss the bit about docstrings at: https://www.gnu.org/software/guix/manual/html_node/Formatting-Code.html :-) With these changes, we’re all set. Thanks! >From a GSoC viewpoint, I think we must move to the compilation part now. Specifically, I think the next step is to start parsing Bash code. For that we could use SILex + parse-lalr, but these are not the nicest tools for the job. Better tools would be “parsing expression grammars” (the (ice-9 peg) module in Guile 2.1) or parser combinators, though I don’t think there’s a directly usable Guile library for that. Maybe Eric or David can comment? The goal is to have a parser that returns an abstract syntax tree (AST) as an sexp: (parse "(cd /foo; ls $HOME) && echo *.a ; echo done") => '(sequence (success-sequence (subshell (sequence (command "cd" "/foo") (command "ls" (variable-ref "HOME")))) (command "echo" (glob "*.a"))) (command "echo" "done")) Thoughts? Ludo’.