guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: hackage importer


From: Ludovic Courtès
Subject: Re: hackage importer
Date: Tue, 09 Jun 2015 09:38:05 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Federico Beffa <address@hidden> skribis:

> On Fri, Jun 5, 2015 at 9:30 AM, Ludovic Courtès <address@hidden> 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 <address@hidden>
> 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.  ;-)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]