Lisp::Fmt - Perl module for Common Lisp like formatting


Lisp-Fmt documentation  | view source Contained in the Lisp-Fmt distribution.

Index


NAME

Top

Lisp::Fmt - Perl module for Common Lisp like formatting

SYNOPSIS

Top

    use Lisp::Fmt;
    $str = fmt("~{~a ~5,,,'*a~}", $a,$b,$c,$d);  # store result in $str
    pfmt("~{ ~a~5,,,'*a~}", $a,$b,$c,$d);	 # print to stdout

DESCRIPTION

Top

The Common Lisp "format" function provides an extremely rich set of formatting directives. This module brings this to Perl.

The formatting directives all begin with a ~ and take the form:~[N]{,N}[@][:]X

where N is a number, X is a formatting directive, and @ and : are optional modifiers. Recognized directives are: A, S, W, D, O, B, X, R, C, P, T, ~, %, |, _, ?, *, \n, {, }, (, ), [, ], <, >, ^

examples:

    C<~A>		- simplest format spec, prints the arg
    C<~D>		- prints a number in base 10
    C<~X>		- prints a number in base 16
    C<~12R>		- prints a number in base 12
    C<~@R>		- prints a number in roman numerals
    C<~#[ none~; ~a~; ~a and ~a~:;~!{~#[~; and~] ~a~^,~}~].">
 		- prints a list in nice readable english

FORMAT SPEC

Top

    as a param, a v will read the param from the arglist
    a # will interpolate to the number of remaining args

         the directive can be one of:

    A  print the arg
    S  print the arg in a readable form (strings are quotes,...)
            @ will pad on left
            params are: mincols (maxcols if <0), colinc, minpad, padchar, overflowchar

    ~ print a ~ [N ~s]
    % print a newline [N newlines]
    | print a formfeed [N formfeeds]
    _ print a space [N spaces]
    & print a newline unless already at the beginning of a line
    T tabulate
         @ relative
    	 params are: colnum, colinc

    n ignore the newline and any following whitespace
         : newline is ignored, whitespace is left
         @ newline is printed, following whitespce is ignored
    * next arg is ignored, with param, next N args are ignored
         : back up in arg list, with param, backup N args
         @ goto 0th arg, or with a param, Nth arg 
    ? indirect - 2 args are a format string and list of args
         @ - 1 arg - is a format string, use args from current arglist

    P pluralize
         @ use y/ies
         : use previous arg

    D a number in base 10
    O a number in base 8
    X a number in base 16
    B a number in base 2
    R a number in specified radix (ie. ~7R)
        @ print leading sign
        : print with commas
        params are: mincol, padchar, commachar, commawidth, overflowchar

     without a radix specifier:
          in english "four"
       :  in english, ordinal "fourth"
       @  in roman "IV"
       :@ in old roman "IIII"




    C a character
        @ as with write
        : spell out control chars

    ( downcase until ~)    - hello world
        @  capitalize the first word  - Hello world
        :  capitalize  - Hello World
        :@ uppercase  - HELLO WORLD

    { iteration spec until ~}
        @  use remaining args
        :  arg is list of sublists
        :@ use remaining args, which are sublists

    [ conditional spec, separated with ~; ending with ~]
        choose item specified by arg  ~:; is default item
        with a param, chhose with it instead of arg
        @ choose if not false
        : use first item if false, second otherwise

    ^ abort ? {} or <> if no args remain,
        or if a param is given, it is 0
        or if 2 params are given, they are equal
        or if 3 params are given, the 1st is <= 2nd <= 3rd
        : terminate an entire :{ or :@{, not just this iteration




For a more complete description of the various formatting directives, parameters, etc. see your favorite lisp reference, such as http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3.html.

NOTES

Top

! is a synonym for @

Often used format strings can be pre-compiled:$f = Fmt::compile("~{ ~a ~5,,,'*a~}");$str = fmt( $f, ...);

when lisp says an arg is a "list", we translate that as a reference to a list (or hash)

  lisp: (format () "~{ ~A~}\n" '(a b c d e))
  perl: fmt( "~{ ~A~}\n", ["a", "b", "c", "d"])
        fmt( "~{ key ~A value ~A\n~}", {foo=>1, bar=>2, baz=>3})

BUGS

Top

Floating-point output is not yet supported.

the <> formatting support is incomplete.

the radix for ~R is restricted to the range 1-36

no test is performed to detect circular data structures

many other bugs not listed here

CHANGES

Top

none.

TO DO

Top

see BUGS.

SEE ALSO

Top

    Common Lisp - The Language 2nd. ed.
    L<http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3.html>
    Yellowstone National Park.

AUTHOR

Top

    Jeff Weisberg - http://www.tcp4me.com/code/

COPYRIGHT

Top


Lisp-Fmt documentation  | view source Contained in the Lisp-Fmt distribution.