The case-conversion, conditional, iteration, and justification constructs can contain other formatting constructs by bracketing them. These constructs must nest properly with respect to each other. For example, it is not legitimate to put the start of a case-conversion construct in each arm of a conditional and the end of the case-conversion construct outside the conditional:
(format nil "~:[abc~:@(def~;ghi~ :@(jkl~]mno~)" x) ;Invalid!
This notation is invalid because the ~[...~;...~]
and ~(...~)
constructs are not properly nested.
The processing indirection caused by the ~?
directive
is also a kind of nesting for the purposes of this rule of proper nesting.
It is not permitted to
start a bracketing construct within a string processed
under control of a ~?
directive and end the construct at some point after the ~?
construct
in the string containing that construct, or vice versa.
For example, this situation is invalid:
(format nil "~@?ghi~)" "abc~@(def") ;Invalid!
This notation
is invalid because the ~?
and ~(...~)
constructs are not properly nested.
The consequences are undefined if no arg remains for a directive requiring an argument. However, it is permissible for one or more args to remain unprocessed by a directive; such args are ignored.
The consequences are undefined if a format directive is given more parameters than it is described here as accepting.
The consequences are undefined if colon or at-sign modifiers are given to a directive in a combination not specifically described here as being meaningful.