On Dec 28, 2003, at 9:34 PM, Alex Shinn wrote:
> Personally I think there are a lot of things that should be done
> different from CL FORMAT, including the already discussed ~P and ~C.
> That doesn't make FORMAT a bad thing either.
That doesn't make a modified CL FORMAT a good thing, either. The basic
concept
remains the same, and there are people who don't like that basic
concept.
>> Formatter procedures can work any way you like; all you need is to
>> pass some different WRITE-CHAR procedure, which allows for even more
>> expressiveness. For instance, you could use SHIFT & RESET to generate
>> a stream from FORMATTER:
>>
>> (reset
>> (format FORMATTER
>> (lambda (char) (shift k (stream-cons char (k)))))
>> stream-null)
>
> You can do this with CL format too.
Pray demonstrate. (Assume the existence of SHIFT & RESET in CL.)
> Or just FORMATTER.
?
> To avoid
> confusion in the discussion, can you use a different name than format?
> fmt works, as does funcall (since that's what it is).
How about LAMBDA-FORMAT?
>> If we cared that much about conciseness, we'd all be using Perl or
>> GOO. But we don't care _that_ much.
>
> It has it's place though, and if in a quick script I can save typing
> four lines by writing a single short format I will.
Sure, it has its place. I use CL-style FORMAT in lots of quick hacks,
debug
messages, and things like that. But I never go beyond SRFI 28 in those
quite
limited circumstances, and anyways, for a good formatting SRFI, I'd
prefer to
have a good formatting mechanism (even if it be not LAMBDA-FORMAT; I
merely
offer LAMBDA-FORMAT as a potential alternative) to a misshapen
derivative of
CL-style FORMAT, just as I'd rather have a good fluid variable system,
even if
it be something I don't believe is optimal -- SRFI 39 --, than have a
bad, but
historically motivated and occasionally convenient for quick hacks,
FLUID-LET
mechanism based on DYNAMIC-WIND + SET!.
> In a larger
> application I'm more likely to want to use a (localized) format rule
> which I will grab from a config file. As such, I generally consider
>
> (begin
> (display ...)
> (write ...)
> (display ...)
> (newline))
>
> to be bad style in both cases.
But is CL FORMAT good style? In config file formatting things, I'd
imagine
that string interpolation would be more useful and clearer than either
one.
>>> and not only lets you re-use the format string in parts of
>>> your program, it lets you easily change it at runtime
>>
>> The same can be said about formatter procedures.
>
> You can only choose from pre-defined formatter procedures, that's a
> whole world of difference.
I'm sorry, but I don't understand how you draw this conclusion, or how
it's any
different from CL FORMAT. Could you elaborate, please?
>> But what you're really doing there is just creating a very limited
>> language for formatting; it's equivalent to having a very limited
>> EVAL. Why not use EVAL? You could even write an incredibly simple
>> EVAL that supports only LAMBDA, function application, and the built-in
>> formatters.
>
> Because eval is evil.
Oh, please. In most circumstances, yes, EVAL is evil, but when you
actually
are _evaluating_language_, there's no reason to consider it evil; it's
exactly
what you're doing, whatever name it have.
> Because restricted languages are easier to
> verify
> and easier to optimize.
Let me quote myself:
>> You could even write an incredibly simple
>> EVAL that supports only LAMBDA, function application, and the built-in
>> formatters.
That looks to me like a restricted language that's pretty damn easy to
verify.
>> Formatter procedures can easily be arbitrarily nested however you
>> like.
>
> As can format strings, as can format lists.
Right. So you while LAMBDA-FORMAT has no advantage here, neither does
CL
FORMAT.
>> And you don't need to remember obscure formatting directive syntax
>> with obscure single-character main names and strange syntax to go
>> around it (SRFI 29's ~@*, anyone?).
>
> So use longer names. There's no reason format has to use ~X instead of
> ~NAME~. Or some combination of both styles.
Er, please tell me how these differ significantly:
(format #t
"~STRING~ my-local-variable = ~WRITE~; other-variable =
~WRITE~~NEWLINE~"
debug-header
my-local-variable
other-variable)
(format/port (sequence-formatter debug-header " my-local-variable = "
(write-formatter my-local-variable)
"; other-variable = " (write-formatter other-variable)
(char-formatter #\newline)))
(Yes, that would require a trivial change to SEQUENCE-FORMATTER for
implicitly
creating string formatters given string arguments.)
Much of your argument has been about conciseness; by extending the
names of
the formatting routines, you're going to lose a lot of that.