freenode/#clasp - IRC Chatlog
Search
20:11:21
Bike
looking at the format compiler macro. i can rewrite it to only involve the formatter function in one place, which should reduce code generated (and not really affect performance meaningfully), so i'll probably do that
20:11:44
Bike
karlosz suggested optimizing the case of format nil with a control string with no directives, but looking through sources i don't see that very often
20:12:08
Bike
what i do see a lot of is format nils that could be reduced to concatenate and prin{c,1}-to-string
20:12:25
Bike
sbcl optimizes that case, but only if the arguments are known to be strings, which means the princ-to-strings can be skipped
20:12:58
Bike
we don't really have the infrastructure to pull that off, and having a bunch of princ-to-strings... might be worse? or maybe not since that's what the formatter will be doing anyway
20:13:25
Bike
or rather it does princ to a shared stream, right, so it probably conses less that way
20:16:32
Bike
there's lots of tricksy stuff we could do if we really wanted, though. for example if the control string only has ~d kind of directives, we could work out the length of the string based on integer-length and other arithmetic, and just allocate it and write in, which would probably be faster than the string stream
20:24:50
Bike
is there any case in which (princ-to-string string) != string? probably with all the print variables...
20:28:13
Bike
well yeah, it returns a string. i'm asking if it returns the same string you put in, if you put in a string
20:29:00
Bike
it seems like probably. so we could have princ-to-string return immediately if given a string, and then the format optimization would be more okay
20:34:21
Bike
the other thing i can do with format is skip the function call, which sounds pointless, except there's all this "&optional (#:format-arg-28932 (ERROR 'CORE::FORMAT-ERROR ...))" stuff that would then avoid
20:35:13
Bike
so format could pretty much expand into just a bunch of print calls and whatever other logic, at least in the case of simple directives. that sounds nice
20:45:39
scymtym
wouldn't you have to ensure that pprint dispatch doesn't do something custom for strings?
20:47:55
kpoeck18
I believe only *print-escape* matters with strings and princ-to-string implies :escape nil
20:55:26
scymtym
SBCL transforms to STRINGIFY-OBJECT which checks *PRINT-PRETTY* and the pprint dispatch table. this is also my understanding of the spec
20:57:42
Bike
my sbcl doesn't transform princ-to-string unless it knows the argument is a number, if i'm reading correctly
21:02:47
scymtym
kpoeck18: sorry, didn't see your message. i think *PRINT-PRETTY* controls whether pprint dispatch comes into play
21:07:38
Bike
if format ~a is affected by *print-pretty* sbcl's optimization is wrong, i guess. even something stupid like (format nil "~a" "hello world") looks different depending on the dynamic environment.
21:39:42
Bike
ok, "inline format" thingie is working, so (format nil "foo ~a" bar) becomes (with-output-to-string (s) (let ((arg bar)) (write-string "foo " s) (princ arg s))). that's something