Older blog entries for joolean (starting at number 62)


...And another thing! This morning wingo pushed a couple of patches for the 1.9.x series that I'd been trying to get in for a while and which add two features that bring the capabilities of Guile's module system up to point where a "userland" (i.e., external to Guile's core) implementation of R6RS library support can be written. They are:

  • Support for the version information as part of Guile's "module" form, along with modifications to Guile's library search mechanism to support searching for modules matching an R6RS-compatible version reference
  • The ability to export a binding from a module under a different name
With these features in place, library support is much closer to being ready in time for 2.0.

I just pushed a patch for Guile that extends the unreleased 2.0 branch's Unicode support to include title case, as described in the Case Mappings section of the Unicode Standard. It's kind of complicated: In the context of characters, it's used with digraph characters (the canonical example being U+01F3 "dz") whose upcased form ("DZ") isn't appropriate for use at the beginning of word (where "Dz" would be a better fit).

What's interesting is that GNU libunistring, the Unicode library used by Guile defines the contract for uc_totitle such that it the function returns a special title case character, if one is defined for the specified character, otherwise it returns the upcased version of that character. In the context of strings, libunistring's title case mapping puts the first character of each word into title case as above and downcases all the other characters.

Guile has a set of predicates like char-lower-case?, which, under the hood, check for the presence of a specified character in a particular character set. In the original form of the patch, I had added a char-title-case? predicate which did the same for the title case character set. This led to situations in which

(char-title-case? (char-titlecase x))
would be false. We ended up taking it out.
wingo was in Brooklyn last weekend and we got to have a few pints at Double Windsor. We caught up on a bunch of stuff about the upcoming Guile 2.0 release this December -- the tower of compilers; swapping out Guile's legacy, synchronous garbage collector for libgc (which only just happened a week or so ago); and the possibility of porting Emacs' Lisp innards to Guile (which would really be a coup). I know I've said so already, but it's going to be totally sweet. Our meeting inspired me to get back on the R6RS library horse. So I'm working again on a series of patches to allow the use of version specifiers in Guile modules.

This involves some interesting searching / filtering operations, since the way we've opted to handle the wildcards and range specifications in R6RS's version reference syntax requires that the system choose the "best" match from a number of paths. It's not dissimilar to the search procedure used in CSS selector matching, although, thankfully, it's allowed to be a lot greedier.


Oh, man -- I think I might be the first Guiler on Advogato to announce this: Guile 1.9.0 is out! The 1.9.x series is unstable releases leading up to an eventual 2.0 later this year, and it's packed with enhancements and features that bear evaluation, especially if you've missed them in previous versions of Guile:

  • Guile now sports an actual virtual machine, meaning, among other things:
    • Scheme source can be compiled to bytecode for (much) faster loading and evaluation
    • Guile can finally compile and run code in languages other than Scheme! Initial support for ECMAScript 3.1 is included.
  • Robust multithreading via SRFI-18
  • Syntax-case macros are supported out of the box and maintain hygiene across module boundaries
  • Guile is now unicode-aware and has i18n support
  • Initial support for R6RS's I/O APIs

Grab the tarball here.

Wow, it's been a while.


After practically another year, SCSS 0.3.2 is out. I had to pretty much rewrite the parser from scratch, since the LALR implementation I was using (lalr-scm), while quite good, didn't give me as much flexibility as I needed with regard to error recovery. The new parser is based on the one in WebKit, and, while it's now pretty much 100% compliant with the CSS 2.1 recommendation, it's a bit slower than the LALR one. That's something I'll have to come back to, I guess. And I finally buckled down and added a test suite, at least for parsing -- testing by rendering pages in libRUIN's "ruinview" example program was a real time-sink.

Grab tarballs here.

R6RS Libraries

Another thing I sunk some time into over the past, well, year was trying to get a working R6RS-compatible libraries implementation into Guile. I've been frustrated for a while with the difficulties inherent in porting Scheme modules from one interpreter to another. For a while I thought Snow might be the solution to this, but after months of wrestling with its shortcomings and trying to get people interested in it, I concede that it's probably most useful as a distribution platform -- and R6RS's library specification, however onerous it might be to implement, is most likely to solve the platform-crossing problem. So I spent a while trying to map R6RS's requirements onto Guile's built-in module implementation, and I was almost successful, until some long-standing problems with Guile's management of hygiene across module boundaries reared their ugly heads. I asked the development list for help, and wingo, master of syntax that he is, stepped up and made some serious fixes, which are in the process of being tested and integrated. Guile 2.0, whenever it arrives, is going to have some pretty wonderful things in it.

I joined a LUG

...or, well, a Linux-oriented Meetup.com group. But that's still a big deal for me, as I'd ago given up on finding a serious Free Software presence in New York City (aside from NYLUG, which just... isn't my kind of vibe). At any rate, I found out about this one, The New York Linux Meetup Group while tabling at HOPE with mjording, who's kind of the organizer, I think -- and also a fellow Sunset Parker! They've got a monthly room reserved at 3rd Ward over in a (picturesquely) desolate part of Bushwick. Last month, the meeting included a pleasantly chaotic competitive attempt to develop the same toy web application in four different languages. This time around, I'm told it's just going to be a straight-up hackathon on personal projects, which suits me absolutely fine.


Tabling at The Last HOPE was a blast, kind of unexpectedly. I didn't go to any of the talks (although I got to see Jello Biafra's lengthy, meandering keynote on the big projector), but the FSF raised, well, I don't know if it's appropriate to discuss... but it was a lot. And we got a surprising number of requests for ladies' t-shirts.

Shout-outs are due to Matt, Ringo, and Thomas. ...And, grudgingly to Club-Mate. Club-Mate: One Gets Used To It.


After almost a year, SCSS 0.3.1 is out. This release features a full-scale code cleanup / reorganization, as well as major changes that improve portability and performance -- the lexer was rewritten by hand, and the pseudo-element handling no longer requires you to manager the style cache yourself. Huge!

Grab tarballs here


With encouragement from Ludovic, I spent nearly a month (of evenings and weekends) trying to write a more efficient pure-Scheme implementation of SRFI-89, and... failed. In the process, though, I learned a fair amount about Guile's handling of macros and lexical environments. I'm confident Guile will wind up with an SRFI-89 implementation in the near future; it'll just look pretty familiar.

I'll be tabling with the FSF at the HOPE conference tomorrow afternoon between 2:30 and 5:30 and all of Sunday afternoon. Drop by and say hi!


Forgot to mention this earlier, but as a present to myself for making it through a crunch at work, I bought a new laptop. It wasn't just that, though -- the ol' StinkPad, while still probably the nicest machine I've ever owned, was showing its age (4+ years): Inexplicable random shutdowns, spontaneous WiFi disconnects, worn-out mouse button, I couldn't burn CDs any more, and then the backlight in the screen went out.

I'd seen someone at this year's FSF meeting who'd recommended ZaReason, so I headed over to their web site and bought the UltraLapSR. It's fantastic! Like they promised, all advertised features Just Work (suspend, hibernate, etc.), and the thing is fast as hell. I've finally got a laptop with a prettier UI than my girlfriend's MacBook Pro.

R.I.P. smokebottle, long live countyhell!


It really was the last go-round! Neil checked in the Scheme side of my SRFI-18 implementation early this morning, capping off almost eight months of revisions (and a 75-message-long discussion thread on guile-devel). That duration is a comment not only on the complexity of the specification and the depth of the changes required, but also on how rough the original patch was: I didn't fully understand Guile's threading system at the time, much less the rhythm of interactions such as the ones between individual threads and the garbage collector. So thanks are due to Neil and Ludovic for being nice about things the whole time and helping me get the thing marginally polished. There are undoubtedly bugs -- including, apparently, some kind of deadlock that can show up during make check, but the majority of the work is done.

...Which means it's in, now, and if you're developing with the 1.9.0 series, you can start using it. Like I've said before, I think SRFI-18 is pretty important -- a development platform having a robust and standards-compliant threading implementation is crucial to being able to develop applications of any real complexity on it. Hopefully this will make Guile more attractive to developers and make it less difficult to port standards-dependent projects like Snow to it.


I spent some time cooking up a translation layer to convert SRFI-89 optional/keyword argument specifications to the format already supported by Guile's (ice-9 optargs) module. Unfortunately, that module has some incompatibilities that I don't think are surmountable (e.g., all required arguments must be passed before any of the optional/keyword ones or the argument-binding system gets confused). Fortunately, Marc Feeley's spec includes a reference implementation that might be usable in a drop-in way. Disappointing that I can't use my convoluted (but more compact) approach, but maybe that's for the best.

53 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!