On Tue, Mar 31, 2015 at 3:33 PM, Ludovic Courtès wrote: > Nice. TABs and odd indentation probably make good additional test cases > to have in tests/cabal.scm. I've added these test cases as suggested. > I think it’s a matter of separating concerns. In my mind there are > three distinct layers: > > 1. Cabal parsing (what I call ‘read-cabal’, because it’s the > equivalent of ‘read’); > > 2. Cabal evaluation/instantiation for a certain set of flags, OS, > etc. (what I call ‘eval-cabal’ because it’s the equivalent of > ‘eval’); > > 3. Conversion of Cabal packages of Guix package sexps. > > My concern was about making sure these three phases were clearly visible > in the code. Tu put it differently, #1 and #2 would conceptually be > part of a Cabal parsing/evaluation library, while #3 would be the only > Guix-specific part. OK, now I see what you had in mind. Thanks for the explanation! My intention wasn't to make an "universal" Cabal parser for two reasons: (i) I've not found any full, formal description of the file format. I could in principle deduce it from the Haskell code, but I'm just starting to learn Haskell. (ii) I don't see any use of Cabal files in the Scheme world, but maybe I'm just blind :-) For these reasons my target was to understand the minimum necessary to produce a Guix package. In spite of this, I think, I ended up handling most of it. What's still missing is parsing of block structured (with braces) files. > Anyway, I’ve probably used enough of your time by now. :-) > If this discussion gives you ideas on how to structure the code, that is > fine, but otherwise we can probably go with the architecture you > propose. > > How does that sound? I think that restructuring the code as you suggest requires quite a bit of effort. At this point in time I'm not ready to invest the required time. If one day I will decide to work on improving the code to make it handle block structured files, that may be the right moment to reorganize it. Please find attached updated patches with added documentation, two more tests, and an option to disable the inclusion of dependencies only requited by the test-suite of the package. 'read-cabal' now takes a port and 'strip-cabal' was renamed as suggested and made local to the former. If parsing fails now an exception of type '&message' is raised with a meaningful message. Regards, Fede