print
, allowing the user to output numbers in various formats (including, for instance: hex, format
internally to handle Specification
Theformat
function is specified by the Destination
The destination may either be aT
, or the NIL
constant; the latter of which presents a special case in that it creates, formats and returns a new string T
refers to the printf
printf is a C standard library function that formats text and writes it to standard output. The function accepts a format c-string argument and a variable number of value arguments that the function serializes per the format string. Mism ...
for console output, sprintf
for string formatting, and fprintf
The C programming language provides many standard library functions for file input and output. These functions make up the bulk of the C standard library header . The functionality descends from a "portable I/O package" written by Mike Lesk at ...
for file writing.
The multitude of destination types is exemplified in the following:
Control String and Format Arguments
The control string may contain literal characters as well as the meta character~
(Directives
A format directive, introduced by a~
, is followed by ~%
, for instance, abstains from the consumption of any format arguments, whereas ~D
expects exactly one ~@
Example
An example of a C printf
call
Call or Calls may refer to:
Arts, entertainment, and media Games
* Call (poker), a bet matching an opponent's
* Call, in the game of contract bridge, a bid, pass, double, or redouble in the bidding stage
Music and dance
* Call (band), from L ...
is the following:
printf("Color %s, number1 %d, number2 %05d, hex %x, float %5.2f, unsigned value %u.\n",
"red", 123456, 89, 255, 3.14, 250);
Using Common Lisp, this is equivalent to:
(format t "Color ~A, number1 ~D, number2 ~5,'0D, hex ~X, float ~5,2F, unsigned value ~D.~%"
"red" 123456 89 255 3.14 250)
;; prints: Color red, number1 123456, number2 00089, hex FF, float 3.14, unsigned value 250.
Another example would be to print every element of list delimited with commas, which can be done using the , and } directives:18. A Few FORMAT Recipes
from Practical Common Lisp
''Practical Common Lisp'' is an introductory book on the programming language Common Lisp by Peter Seibel. It features a fairly complete introduction to the language interspersed with practical example chapters, which show developing various pieces ...
(let ((groceries '(eggs bread butter carrots)))
(format t "~.~%" groceries) ; Prints in uppercase
(format t "~:(~~).~%" groceries)) ; Capitalizes output
;; prints: EGGS, BREAD, BUTTER, CARROTS.
;; prints: Eggs, Bread, Butter, Carrots.
Note that not only is the list of values iterated over directly by format
, but the commas correctly are printed ''between'' items, not ''after'' them. A yet more complex example would be printing out a list using customary English phrasing:
(let ((template "The lucky winners were:~# none~; ~S~; ~S and ~S~
~:;~@~"))
(format nil template)
;; ⇒ "The lucky winners were: none."
(format nil template 'foo)
;; ⇒ "The lucky winners were: FOO."
(format nil template 'foo 'bar)
;; ⇒ "The lucky winners were: FOO and BAR."
(format nil template 'foo 'bar 'baz)
;; ⇒ "The lucky winners were: FOO, BAR, and BAZ."
(format nil template 'foo 'bar 'baz 'quux)
;; ⇒ "The lucky winners were: FOO, BAR, BAZ, and QUUX."
)
The ability to define a new directive through ~/functionName/
provides the means for customization. The next example implements a function which prints an input string either in lowercase, uppercase or reverse style, permitting a configuration of the number of repetitions, too.
(defun mydirective (destination
format-argument
colon-modifier-supplied-p
at-sign-modifier-supplied-p
&optional (repetitions 1))
"This function represents a callback suitable as a directive in a
``format'' invocation, expecting a string as its FORMAT-ARGUMENT
to print REPETITIONS number of times to the DESTINATION.
---
The COLON-MODIFIER-SUPPLIED-P and AT-SIGN-MODIFIER-SUPPLIED-P flags
expect a generalized Boolean each, being the representatives of the
``:'' and ``@'' modifiers respectively. Their influence is defined
as follows:
- If no modifier is set, the FORMAT-ARGUMENT is printed without
further modifications.
- If the colon modifier is set, but not the at-sign modifier, the
FORMAT-ARGUMENT is converted into lowercase before printing.
- If the at-modifier is set, but not the colon-modifier, the
FORMAT-ARGUMENT is converted into uppercase before printing.
- If both modifiers are set, the FORMAT-ARGUMENT is reversed before
printing.
---
The number of times the FORMAT-ARGUMENT string is to be printed is
determined by the prefix parameter REPETITIONS, which must be a
non-negative integer number and defaults to one."
(declare (type (or null (eql t) stream string) destination))
(declare (type t format-argument))
(declare (type t colon-modifier-supplied-p))
(declare (type t at-sign-modifier-supplied-p))
(declare (type (integer 0 *) repetitions))
(let ((string-to-print format-argument))
(declare (type string string-to-print))
;; Adjust the STRING-TO-PRINT based upon the modifiers.
(cond
((and colon-modifier-supplied-p at-sign-modifier-supplied-p)
(setf string-to-print (reverse string-to-print)))
(colon-modifier-supplied-p
(setf string-to-print (string-downcase string-to-print)))
(at-sign-modifier-supplied-p
(setf string-to-print (string-upcase string-to-print)))
(t
nil))
(loop repeat repetitions do
(format destination "~A" string-to-print))))
;; Print "Hello" a single time.
(format t "~/mydirective/" "Hello")
;; Print "Hello" three times.
(format t "~3/mydirective/" "Hello")
;; Print a lowercase "Hello" (= "hello") three times.
(format t "~3:/mydirective/" "Hello")
;; Print an uppercase "Hello" (= "HELLO") three times.
(format t "~3@/mydirective/" "Hello")
;; Print a reversed "Hello" (= "olleH") three times.
(format t "~3:@/mydirective/" "Hello")
Whilst format
is somewhat infamous for its tendency to become opaque and hard to read, it provides a remarkably concise yet powerful syntax for a specialized and common need.
A Common Lisp FORMAT summary table is available.Common Lisp FORMAT summary table
/ref>
See also
*Common Lisp
Common Lisp (CL) is a dialect of the Lisp programming language, published in American National Standards Institute (ANSI) standard document ''ANSI INCITS 226-1994 (S2018)'' (formerly ''X3.226-1994 (R1999)''). The Common Lisp HyperSpec, a hyperli ...
*''Common Lisp the Language
''Common Lisp the Language'' is a reference book by Guy L. Steele about a set of technical standards and programming languages named Common Lisp.
History Before standardizing
The first edition (Digital Press, 1984; ; 465 pages) was written by Gu ...
''
*''Practical Common Lisp
''Practical Common Lisp'' is an introductory book on the programming language Common Lisp by Peter Seibel. It features a fairly complete introduction to the language interspersed with practical example chapters, which show developing various pieces ...
''
*''On Lisp
''On Lisp: Advanced Techniques for Common Lisp'' is a book by Paul Graham on macro programming in Common Lisp. Published in 1993, it is currently out of print, but can be freely downloaded as a PDF
Portable document format (PDF), standardiz ...
''
References
Books
*Common Lisp HyperSpec
The Common Lisp HyperSpec is a technical standard document written in the hypertext format ''Hypertext Markup Language'' (HTML). It is not the American National Standards Institute (ANSI) Common Lisp standard, but is based on it, with permission fr ...
br>Section 22.3 Formatted Output
*Practical Common Lisp
''Practical Common Lisp'' is an introductory book on the programming language Common Lisp by Peter Seibel. It features a fairly complete introduction to the language interspersed with practical example chapters, which show developing various pieces ...
br>Chapter 18. A Few FORMAT Recipes
Common Lisp
{{Improve categories, date=June 2024