Re: Another alternative (Re: format strings are the Right Thing) Paul Schlie 30 Dec 2003 01:36 UTC
Such as possibly something like: (pipe (fmt:string (fmt-roman 4) " - my graph:\n\n" (fmt-graph 'y-axis "volume" 'x-axis "time" 'data (fmt-real my-2d-vector 'prec 4)))) Which could hypothetically produce something like: -> IV - my graph: 20.00| v -| x x o 15.00| x x l -| x x u 10.00| x m -| x x e 5.000| x x -| x 0.000|________________________________ 0.000 | 50.00 | 100.0 | 150.0 | 200.0 time (although I admit the notion of text graphs are a bit dated) -paul- > From: Paul Schlie <xxxxxx@comcast.net> > > A clisp format procedure among others, seems quite reasonable, > > <input-port> (fmt-clisp <string> <arg> ...) ; to each his own. > > However my gut feel is that format procedures/macros should likely yield > an <input-ports>, as opposed to directly writing to an <output-port>; > as it would seem that being able to produce and accept <input-port> > pipes as arguments would enable the ability to compose relatively > sophisticated efficient format/text-processing hierarchies quite easily, > without requiring the use of potentially inefficient and/or cumbersome > intermediate strings to buffer text between transform layers. > > -paul- > >> From: Shiro Kawai <xxxxxx@lava.net> >> I got an impression that this format string discussion has similarity >> to the regexp pattern language---it defines a mini-language, >> it has long history tons of variations, it is concise in typical >> usage but can't be composed well and tend to produce an >> incomprehensible code when one try to push it too hard. >> And Olin Shivers showed a solution, SRE. >> >> Can't we do the similar thing here? >> I haven't thought it out well, but the basic idea is like this: >> >> [macro] sfmt <SFMT-SPEC> ... >> Generates a "formatter" closure. Which takes output port and list of >> args, and emit the formatted output to the given port. >> >> SFMT-SPEC :: >> <string> ; literal string to be displayed. >> (write [limit N]) ; take next arg and write it (up to N chars) >> (display [limit N]) ; take next arg and display it (up to N chars) >> (integer [width N][pad C]) ; format as integer >> (float [width N][precision P] ...) ; format as flonum >> ;; and so on ... >> (cl-formattr <string>) ; traditinal CL-style format string >> >> And the ability to insert evaluated expression in SFMT-SPEC will allow >> the programmer to insert other formatter closure into SFMT-SPEC template. >> (But I have an uneasy feeling about the "implicit backquote" feature >> of SRE... it looks like it make difficult to write a macro that >> generates SRE, though I haven't used SRE extensively so I can't tell >> for sure). >> >> The legacy format can be defined easily, to support the legacy code: >> >> [procedure] format output-port string . args >> == ((sfmt (cl-formatter string)) output-port args) >> >> [procedure] format string . args >> == (let ((out (open-output-string))) >> ((sfmt (cl-formatter string)) out args) >> (get-output-string out)) >> >> We could also expose low-level build-in formatter procedure, >> which could be similar to the one Paul showed. >> >> Issues: >> - What should formatter closure return? - you might want to >> switch behavior by whether the output is chopped by the length >> limitation or not, for example. Also the you need to know >> how many args are consumed by other formatter procedure embedded >> in SFMT-SPEC. >> - How to handle reordering of the arguments? Reordering makes >> composition of formatters difficult, but is there a better >> way to support internationalization of formatting templates? >> (maybe a named argument instead of positional argument?) >> >> --shiro >> >