Federico Beffa <be...@ieee.org> skribis: > On Fri, Jun 5, 2015 at 9:30 AM, Ludovic Courtès <l...@gnu.org> wrote:
[...] >>> +(define (make-stack) >>> + "Creates a simple stack closure. Actions on the generated stack are >>> +requested by calling it with one of the following symbols as the first >>> +argument: 'empty?, 'push!, 'top, 'pop! and 'clear!. The action 'push! is >>> the >>> +only one requiring a second argument corresponding to the object to be >>> added >>> +to the stack." >>> + (let ((stack '())) >>> + (lambda (msg . args) >>> + (cond ((eqv? msg 'empty?) (null? stack)) >>> + ((eqv? msg 'push!) (set! stack (cons (first args) stack))) >>> + ((eqv? msg 'top) (if (null? stack) '() (first stack))) >>> + ((eqv? msg 'pop!) (match stack >>> + ((e r ...) (set! stack (cdr stack)) e) >>> + (_ #f))) >>> + ((eqv? msg 'clear!) (set! stack '())) >>> + (else #f))))) >> >> Fair enough. :-) I wonder what happens exactly when trying to return >> monadic values in the parser. > > Given that the parser repeatedly calls the tunk generated by > 'make-lexer' without passing any state or knowing anything about to > which monad it may belong to, I thought that it would not work. But, > as you see, I'm new to Scheme, new to monads, and new to Lisp in > general. I think the rules can return any kind of value, so there shouldn’t be a problem with returning monadic values (of course it won’t bind them for you, but that’s not a problem.) Anyway, an exercise for later. ;-) >>> +;; Stack to track the structure of nested blocks >>> +(define context-stack (make-stack)) >> >> What about making it either a SRFI-39 parameter, or a parameter to >> ‘make-cabal-parser’? > > I made it a parameter. Thanks for suggesting it! It made me realize > what they are really used for :-) > Do you think it is correct to say that they serve the purpose of > special variables in Lisp? (I'm looking a little bit into Common Lisp > as well.) Not sure what you mean by “special variables” (and I’m not familiar with CL), but the concept is fairly common: It’s dynamic scoping, which is the default in elisp, sometimes called “fluids”, sometimes “parameters.” > From 8a28ed0f3c3077ce12d4924c59e317c52a68a77e Mon Sep 17 00:00:00 2001 > From: Federico Beffa <be...@fbengineering.ch> > Date: Sun, 26 Apr 2015 11:22:29 +0200 > Subject: [PATCH] import: hackage: Refactor parsing code and add new options. > > * guix/import/cabal.scm: New file. > * guix/import/hackage.scm: Update to use the new Cabal parsing module. > * tests/hackage.scm: Update tests. > * guix/scripts/import/hackage.scm: Add new '--cabal-environment' and '--stdin' > options. > * doc/guix.texi: ... and document them. > * Makefile.am (MODULES): Add 'guix/import/cabal.scm', > 'guix/import/hackage.scm' and 'guix/scripts/import/hackage.scm'. > (SCM_TESTS): Add 'tests/hackage.scm'. OK to commit, thank you! (I had not realized the hackage.scm files were missing from the Makefile until now.) Thanks, Ludo’. PS: Commit 751630c adds n-ary >>= for your pleasure. ;-)