[flexi-streams-devel] Re: New version 0.5.3 (Was: in-memory streams have no way to set external-format?)

Andreas Fuchs asf at boinkor.net
Wed Mar 8 14:01:39 UTC 2006


Today, Edi Weitz <edi at agharta.de> wrote:
> Hi!

Hi there!

> On Wed, 08 Mar 2006 00:43:12 +0100, Andreas Fuchs <asf at boinkor.net>
> wrote:
>> So, once I've read an irc command (as a "line" of latin-1
>> characters), I'd like to convert it to text that looks the least
>> insane, which is why my code tries several external-formats in a
>> row and returns as soon as it found one that doesn't throw an
>> error:
>
> If LINE is a string you want this:
>
>  (defun try-decode-line (line external-formats)
>    (loop for external-format in external-formats
>          for decoded = nil
>          for error = nil
>          do (multiple-value-setq (decoded error)
>                 (ignore-errors
>                   (with-input-from-string (in line)
>                     (let ((flexi (flexi-streams:make-flexi-stream in :external-format external-format)))
>                       (read-line flexi)))))
>          do (format t "~&tried ~s: ~S~% error: ~A~%" external-format decoded
>                     error)
>          if decoded
>            do (return decoded)))

This didn't exactly work; I get errors stating that the in-memory
stream isn't a binary stream.


> But actually I think you want LINE to be a sequence of octets, so
> this is what you want:

And this does work perfectly. Thanks so much! (:

My current scheme is (horrible and) as follows: I read a line in the
latin-1 external format, then create a vector from the char-codes, and
decode that with try-decode-line.

Why latin-1, you ask? Because it has a 1:1 code point mapping to
bytes, as far as irc is concerned, and I don't have to implement my
own buffering, which would really suck - IRC operates on lines,
whereas all binary streams need fixed-width buffers.

54It seems like the easiest way to interoperate with broken protocols is
to break a little inside, just like their authors once did. (:

> But you'll need version 0.5.3 to see that because there was a typo
> in the code which generated the error messages.

Heh. I just upgraded.

>> Hrmpf! Am I abusing flexi-streams too much or is that a bug? How
>> should one read externally-formatted data from an in-memory stream,
>> anyway?
>
> You forgot that you have to create a flexi stream first - in-memory
> streams happen to be provided by the same library but they're
> something different.  Use MAKE-FLEXI-STREAM to turn them into
> flexi streams.

Oh. I misread the phrase 'These streams can obviously be used as the
underlying streams for flexi streams.' as 'They are the base class of
flexi-streams, and they work just like flexi-streams do.' -- I blame
late-night hacking. (:

>> And are string-backed in-memory streams even allowed?
>
> No.  CL already has WITH-INPUT-FROM-STRING... :)
>
>> Thanks for your time and for developing flexi-streams. In return, I
>> hope to be able to buy you a beverage of your choice in Hamburg (-:
>
> Nice.  Looking forward to seeing you there!

Me too (:

Thanks again,
-- 
Andreas Fuchs, (http://|im:asf@|mailto:asf@)boinkor.net, antifuchs



More information about the Flexi-streams-devel mailing list