[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. ;-)