The formatting directives supported by the CLFormat framework are based on the directives specified in Common Lisp the Language, 2nd Edition by Guy L. Steele Jr. Some directives have been extended to meet today's formatting requirements (e.g. to support localization) and to achieve a natural embedding in Swift. All extensions were introduced in a way to not impact backward compatibility.
Directive | Explanation |
---|---|
~a ~A |
ASCII: ~mincol,colinc,minpad,padchar,maxcol,elcharA The next argument arg is output without escape characters. In particular, if arg is a string, its characters will be output verbatim. If arg is nil, it will be output as nil. If arg is not nil, then the formatter will attempt to convert arg using one of the following properties (tried in the order as listed below) into a string that is output:
mincol (default: 0) specifies the minimal "width" of the output of the directive in characters, maxcol (default: ∞) specifies the maximum width. padchar (default: ' ') defines the character that is used to pad the output to make sure it is at least mincol characters long. By default, the output is padded on the right with at least minpad (default: 0) copies of padchar. Padding characters are then inserted colinc (default: 1) characters at a time until the total width is at least mincol. Padding is capped such that the output never exceeds maxcol characters. If, without padding, the output is already longer than maxcol, the output is truncated at width maxcol - 1 and the ellipsis character elchar (default: '…') is inserted at the end.
Modifier : enables debugging output, i.e. the following sequence of properties of arg are considered for generating the output:
Modifier @ enables padding on the left to right-align the output. |
~w ~W |
WRITE: ~mincol,colinc,minpad,padchar,maxcol,elcharW The next argument arg is output without escape characters just as if it was printed via Swift's print function. If arg is nil, it will be output as nil. If arg is not nil, then the formatter will attempt to convert arg using one of the following properties (tried in the order as listed below) into a string that is output:
Parameters mincol (default: 0), colinc (default: 1), minpad (default: 0), padchar (default: ' '), maxcol (default: ∞), and elchar (default: '…') are used just as described for the ASCII directive ~A. Modifier : enables debugging output. Modifier @ enables padding on the left to right-align the output. |
~s ~S |
SOURCE: ~mincol,colinc,minpad,padchar,maxcol,elcharS The next argument arg is output with escape characters. In particular, if arg is a string, double-quotes delimit the characters of the string. If arg is a character, single-quotes delimit the character. If arg is nil, it will be output as nil. For all other values, the formatter will attempt to convert arg using one of the following properties (tried in the order as listed below) into a string that is output:
Parameters mincol (default: 0), colinc (default: 1), minpad (default: 0), padchar (default: ' '), maxcol (default: ∞), and elchar (default: '…') are used just as described for the ASCII directive ~A. Modifier : enables debugging output. Modifier @ enables padding on the left to right-align the output. |
~c ~C |
CHARACTER: ~C The next argument arg should be a character. Directive ~C outputs arg in a form dependent on the modifiers used. Without any modifiers, arg is output as if the character was used in a string.
If the @ modifier is provided, a representation based on Unicode scalars is chosen. Without further modifiers, arg is output using Swift's Unicode scalar escape syntax \u{...} so that the result can be used within a Swift string literal. By adding the + modifier, the result is automatically surrounded by double-quotes. The modifier combination @: will lead to arg being output as Unicode code points. The combination @:+ will output arg as a sequence of Unicode scalar property names, separated by comma. If the : modifier is used (without @), a representation of arg for the usage in XML documents is chosen. By default, a Unicode-based XML character encoding is used, unless : is combined with +, in which case the character is represented as a XML named character entity when possible, otherwise, the character is output in raw form. clformat("~C", args: "A") ⟹ A |
~d ~D |
DECIMAL: ~mincol,padchar,groupchar,groupcolD The next argument arg is output in decimal radix. arg should be an integer, in which case no decimal point is printed. For floating-point numbers which do not represent an integer, a decimal point and a fractional part are output. mincol (default: 0) specifies the minimal "width" of the output of the directive in characters with padchar (default: ' ') defining the character that is used to pad the output on the left to make sure it is at least mincol characters long. clformat("Number: ~D", args: 8273) ⟹ Number: 8273 By default, the number is output without grouping separators. groupchar specifies which character should be used to separate sequences of groupcol digits in the output. Grouping of digits gets enabled with the : modifier. clformat("|~10:D|", args: 1734865) ⟹ | 1,734,865| A sign is output only if the number is negative. With the modifier @ it is possible to force output also of positive signs. To facilitate the localization of output, function clformat supports a parameter locale:. Locale-specific output can be enabled by using the + modifier. clformat("~+D", locale: Locale(identifier: "de_CH"), args: 14321) ⟹ 14'321 |
~b ~B |
BINARY: ~mincol,padchar,groupchar,groupcolB Binary directive ~B is just like decimal directive ~D but it outputs the next argument in binary radix (radix 2) instead of decimal. It uses the space character as the default for groupchar and has a default grouping size of 4 as the default for groupcol. clformat("bin(~D) = ~B", args: 178, 178) ⟹ bin(178) = 10110010 |
~o ~O |
OCTAL: ~mincol,padchar,groupchar,groupcolO Octal directive ~O is just like decimal directive ~D but it outputs the next argument in octal radix (radix 8) instead of decimal. It uses the space character as the default for groupchar and has a default grouping size of 4 as the default for groupcol. clformat("bin(~D) = ~O", args: 178, 178) ⟹ bin(178) = 262 |
~x ~X |
HEXADECIMAL: ~mincol,padchar,groupchar,groupcolX Hexadecimal directive ~X is just like decimal directive ~D but it outputs the next argument in hexadecimal radix (radix 16) instead of decimal. It uses the colon character as the default for groupchar and has a default grouping size of 2 as the default for groupcol. With modifier +, upper case characters are used for representing hexadecimal digits. clformat("bin(~D) = ~X", args: 9968, 9968) ⟹ bin(9968) = 26f0 |
~r ~R |
RADIX: ~radix,mincol,padchar,groupchar,groupcolR The next argument arg is expected to be an integer. It will be output with radix radix. mincol (default: 0) specifies the minimal "width" of the output of the directive in characters with padchar (default: ' ') defining the character that is used to pad the output on the left to make it at least mincol characters long. clformat("Number: ~10R", args: 1272) ⟹ Number: 1272 By default, the number is output without grouping separators. groupchar specifies which character should be used to separate sequences of groupcol digits in the output. Grouping of digits is enabled with the : modifier. clformat("~16,8,,':,2:R", args: 7121972) ⟹ 6c:ac:34 A sign is output only if the number is negative. With the modifier @ it is possible to force output also of positive signs. If parameter radix is not specified at all, then an entirely different interpretation is given. ~R outputs arg as a cardinal number in natural language. The form ~:R outputs arg as an ordinal number in natural language. ~@R outputs arg as a Roman numeral. clformat("~R", args: 572) ⟹ five hundred seventy-two Whenever output is provided in natural language, English is used as the language by default. By specifying the + modifier, it is possible to switch the language to the language of the locale provided to function clformat. In fact, modifier + plays two different roles: If the given radix is greater than 10, upper case characters are used for representing alphabetic digits. If the radix is omitted, usage of modifier + enables locale-specific output determined by the locale: parameter of function clformat. clformat("~+R", locale: Locale(identifier: "de_DE"), args: 572) |
~f ~F |
FIXED FLOAT: ~w,d,k,overchar,padchar,groupchar,groupcolF The next argument arg is output as a floating-point number in a fixed format (ideally without exponent) of exactly w characters, if w is specified. First, leading padchar characters (default: ' ') are output, if necessary, to pad the field on the left. If arg is negative, then a minus sign is printed. If arg is not negative, then a plus sign is printed if and only if the @ modifier was specified. Then a sequence of digits, containing a single embedded decimal point, is printed. If parameter d is provided, then exactly d decimal places are output. This represents the magnitude of the value of arg times 10k, rounded to d fractional digits. There are no leading zeros, except that a single zero digit is output before the decimal point if the printed value is less than 1.0, and this single zero digit is not output after all if w = d + 1. If it is impossible to print the value in the required format in a field of width w, then one of two actions is taken: If the parameter overchar is specified, then w copies of this character are printed. If overchar is omitted, then the scaled value of arg is printed using more than w characters. If the width parameter w is omitted, then the output is of variable width and a value is chosen for w in such a way that no leading padding characters are needed and exactly d characters will follow the decimal point. For example, the directive ~,2F will output exactly two digits after the decimal point and as many as necessary before the decimal point. If d is omitted, then there is no constraint on the number of digits to appear after the decimal point. A value is chosen for d in such a way that as many digits as possible may be printed subject to the width constraint imposed by w and the constraint that no trailing zero digits may appear in the fraction, except that if the fraction is zero, then a single zero digit should appear after the decimal point if permitted by the width constraint. If w is omitted, then if the magnitude of arg is so large (or, if d is also omitted, so small) that more than 100 digits would have to be printed, then arg is output using exponential notation instead. The ~F directive also supports grouping of the integer part of arg; this can be enabled via the : modifier. groupchar (default: ',') specifies which character should be used to separate sequences of groupcol (default: 3) digits in the integer part of the output. If locale-specific settings should be used, the + modifier needs to be set. clformat("~F", args: 123.1415926) ⟹ 123.1415926 |
~e ~E |
EXPONENTIAL FLOAT: ~w,d,e,k,overchar,padchar,expcharE The next argument arg is output as a floating-point number in an exponential format of exactly w characters, if w is specified. Parameter d is the number of digits to print after the decimal point, e is the number of digits to use when printing the exponent, and k is a scale factor that defaults to 1. First, leading padchar (default: ' ') characters are output, if necessary, to pad the output on the left. If arg is negative, then a minus sign is printed. If arg is not negative, then a plus sign is printed if and only if the @ modifier was specified. Then a sequence of digits, containing a single embedded decimal point, is output. The form of this sequence of digits depends on the scale factor k. If k is zero, then d digits are printed after the decimal point, and a single zero digit appears before the decimal point. If k is positive, then it must be strictly less than d + 2 and k significant digits are printed before the decimal point, and d − k + 1 digits are printed after the decimal point. If k is negative, then it must be strictly greater than −d. A single zero digit appears before the decimal point and after the decimal point, first −k zeros are output followed by d + k significant digits. Following the digit sequence, the exponent is output following character expchar (default: 'E') and the sign of the exponent, i.e. either the plus or the minus sign. The exponent consists of e digits representing the power of 10 by which the fraction must be multiplied to properly represent the rounded value of arg. If it is impossible to print the value in the required format in a field of width w, then one of two actions is taken: If the parameter overchar is specified, then w copies of this character are printed instead of arg. If overchar is omitted, then arg is printed using more than w characters, as many more as may be needed. If d is too small for the specified k or e is too small, then a larger value is used for d or e as may be needed.
If the w parameter is omitted, then the output is of variable width and a value is chosen for w in such a way that no leading padding characters are needed. clformat("~E", args: 31.415926) ⟹ 3.1415926E+1 |
~g ~G |
GENERAL FLOAT: ~w,d,e,k,overchar,padchar,expcharG The next argument arg is output as a floating-point number in either fixed-format or exponential notation as appropriate. The format in which to print arg depends on the magnitude (absolute value) of arg. Let n be an integer such that 10n−1 ≤ arg < 10n. If arg is zero, let n be 0. Let ee equal e + 2, or 4 if e is omitted. Let ww equal w − ee, or nil if w is omitted. If d is omitted, first let q be the number of digits needed to print arg with no loss of information and without leading or trailing zeros; then let d equal max(q, min(n, 7)). Let dd equal d − n.
If 0 ≤ dd ≤ d, then arg is output as if by the format directives: clformat("|~G|", args: 712.72) ⟹ |712.72 | |
~$ |
DOLLARS FLOAT: ~d,n,w,padchar,curchar,groupchar,groupcol$ The next argument arg is output as a floating-point number in a fixed-format notation that is particularly well suited for outputting monetary values. Parameter d (default: 2) defines the number of digits to print after the decimal point. Parameter n (default: 1) defines the minimum number of digits to print before the decimal point. Parameter w (default: 0) is the minimum total width of the output. First, padding and the sign are output. If arg is negative, then a minus sign is printed. If arg is not negative, then a plus sign is printed if and only if the @ modifier was specified. If the : modifier is used, the sign appears before any padding, and otherwise after the padding. If the number of characters, including the sign and a potential currency symbol is below width w, then character padchar (default: ' ') is used for padding the number in front of the integer part such that the overall output has w characters. After the padding, the currency symbol curchar is inserted, if available, followed by n digits representing the integer part of arg, prefixed by the right amount of '0' characters. If either parameter groupchar or groupcol is provided, the integer part is output in groups of groupcol characters (default: 3) separated by groupchar (default: ','). After the integer part, a decimal point is output followed by d digits of fraction, properly rounded. If the magnitude of arg is so large that the integer part of arg cannot be output with at most n characters, then more characters are generated, as needed, and the total width might overrun as well. For cases where a simple currency symbol is not sufficient, it is possible to use a numeric currency code as defined by ISO 4217 for parameter curchar. For positive codes, the shortest currency symbol is being used. For negative currency codes, the corresponding alphabetic code (ignoring the sign) is being used. Struct Currency provides a conventient way to access currency codes. By specifying the + modifier, it is possible to enable locale-specific output of the monetary value using the locale provided to function clformat. In this case, also the currency associated with this locale is being used. clformat("~$", args: 4930.351) ⟹ 4930.35 |
~% |
NEWLINE: ~n% This directive outputs n (default: 1) newline characters, thereby terminating the current output line and beginning a new one. No arguments are being consumed. Simply putting n newline escape characters \n into the control string would also work, but ~% is often used because it makes the control string look nicer and more consistent. |
~& |
FRESHLINE: ~n& Unless it can be determined that the output is already at the beginning of a line, this directive outputs a newline if n > 0. This conditional newline is followed by n − 1 newlines, it n > 1. Nothing is output if n = 0. |
~| |
PAGE SEPARATOR: ~n| This directive outputs n (default: 1) page separator characters ("\u{12}"). |
~~ |
TILDE: ~n~ This directive outputs n (default: 1) tilde characters. |
~p ~P |
PLURAL: ~P Depending on the next argument arg, which is expected to be an integer value, a different string is output. If arg is not equal to 1, a lowercase s is output. If arg is equal to 1, nothing is output. If the : modifier is provided, the last argument is used instead for arg. This is useful after outputting a number using ~D. With the @ modifier, y is output if arg is 1, or ies if it is not. clformat("~D tr~:@P/~D win~:P", args: 7, 1)
⟹ 7 tries/1 win |
~t ~T |
TABULATE: ~colnum,colincT This directive will output sufficient spaces to move the cursor to column colnum (default: 1). If the cursor is already at or beyond column colnum, the directive will output spaces to move the cursor to column colnum + k × colinc for the smallest positive integer k possible, unless colinc (default: 1) is zero, in which case no spaces are output if the cursor is already at or beyond column colnum. If modifier @ is provided, relative tabulation is performed. In this case, the directive outputs colrel spaces and then outputs the smallest non-negative number of additional spaces necessary to move the cursor to a column that is a multiple of colinc. For example, the directive ~3,8@T outputs three spaces and then moves the cursor to a "standard multiple-of-eight tab stop" if not at one already. If the current output column cannot be determined, however, then colinc is ignored, and exactly colrel spaces are output. |
~* |
IGNORE ARGUMENT: ~n* The next n (default: 1) arguments are ignored. If the : modifier is provided, arguments are "ignored backwards", i.e. ~:* backs up in the list of arguments so that the argument last processed will be processed again. ~n:* backs up n arguments. When within a ~{ construct, the ignoring (in either direction) is relative to the list of arguments being processed by the iteration. The form ~n@* is an "absolute goto" rather than a "relative goto": the directive goes to the n-th argument, where 0 means the first one. n defaults to 0 for this form, so ~@* goes back to the first argument. Directives after a ~n@* will take arguments in sequence beginning with the one gone to. When within a ~{ construct, the "goto" is relative to the list of arguments being processed by the iteration. |
~? |
INDIRECTION: ~? The next argument arg must be a string, and the one after it lst must be a sequence (e.g. an array). Both arguments are consumed by the directive. arg is processed as a format control string, with the elements of the list lst as the arguments. Once the recursive processing of the control string has been finished, then processing of the control string containing the ~? directive is resumed. clformat("~? ~D", args: "(~A ~D)", ["Foo", 5], 7)
⟹ (Foo 5) 7 Note that in the second example, three arguments are supplied to the control string "(~A ~D)", but only two are processed and the third is therefore ignored. With the @ modifier, only one argument is directly consumed. The argument must be a string. It is processed as part of the control string as if it had appeared in place of the ~@? directive, and any directives in the recursively processed control string may consume arguments of the control string containing the ~@? directive. clformat("~@? ~D", args: "(~A ~D)", "Foo", 5, 7)
⟹ (Foo 5) 7 |
~(…~) |
CONVERSION: ~(str~) The contained control string str is processed, and what it produces is subject to a conversion. Without the + modifier, a case conversion is performed. ~( converts every uppercase character to the corresponding lowercase character, ~:( capitalizes all words, ~@( capitalizes just the first word and forces the rest to lowercase, and ~:@( converts every lowercase character to the corresponding uppercase character. In the following example, ~@( is used to cause the first word produced by ~R to be capitalized: clformat("~@(~R~) error~:P", args: 0)
⟹ Zero errors If the + modifier is provided together with the : modifier, all characters corresponding to named XML entities are being converted into names XML entities. If modifier @ is added, then only those characters are converted which conflict with XML syntax. The modifier combination +@ converts the output by stripping off all diacritics. Modifier + only will escape characters such that the result can be used as a Swift string literal. clformat("~+:(~A~)", args: "© 2021–2023 TÜV") |
~[…~] |
CONDITIONAL: ~[str0~;str1~;…~;strn~] This is a set of control strings, called clauses, one of which is chosen and used. The clauses are separated by ~; and the construct is terminated by ~]. Without default: From a conditional directive ~[str0~;str1~;…~;strn~], the arg-th clause is selected, where the first clause is number 0. If a prefix parameter is given as ~n[, then the parameter n is used instead of an argument. This is useful only if the parameter is specified by #, to dispatch on the number of arguments remaining to be processed. If arg or n is out of range, then no clause is selected and no error is signaled. After the selected alternative has been processed, the control string continues after the ~]. With default: Whenever the directive has the form ~[str0~;str1~;…~:;default~], i.e. the last clause is separated via ~:;, then the conditional directive has a default clause which gets performed whenever no other clause could be selected. Optional selector: Whenever the directive has the form ~:[none~;some~] the none control string is chosen if arg is nil, otherwise the some control string is chosen. Boolean selector: Whenever the directive has the form ~+[false~;true~] the false control string is chosen if arg is the boolean value false, otherwise the some control string is chosen. Selector test: Whenever the directive has the form ~@[true~], the next argument arg is tested for being non-nil. If arg is not nil, then the argument is not used up by the ~@[ directive but remains as the next one to be processed, and the one clause true is processed. If arg is nil, then the argument is used up, and the clause is not processed. The clause therefore should normally use exactly one argument, and may expect it to be non-nil. |
~{…~} |
ITERATION: ~n{str~} The iteration directive is used to control how a sequence is output. Thus, the next argument arg should be a sequence which is used as a list of arguments as if for a recursive call to clformat. The string str is used repeatedly as the control string until all elements from arg are consumed. Each iteration can absorb as many elements of arg as it needs. For instance, if str uses up two arguments by itself, then two elements of arg will get used up each time around the loop. If before any iteration step the sequence is empty, then the iteration is terminated. Also, if a prefix parameter n is given, then there will be at most n repetitions of processing of str. Finally, the ~^ directive can be used to terminate the iteration prematurely. If the iteration is terminated before all the remaining arguments are consumed, then any arguments not processed by the iteration remain to be processed by any directives following the iteration construct. clformat("Winners:~{ ~A~}.", args: ["Fred", "Harry", "Jill"]) ~:n,m{str~} is similar, but the argument should be a list of sublists. At each repetition step (capped by n), one sublist is used as the list of arguments for processing str with an iteration cap of m. On the next repetition, a new sublist is used, whether or not all elements of the last sublist had been processed.
clformat("Pairs:~:{ <~A,~S>~}.", args: [["A", 1], ["B", 2], ["C", 3]]) ~@{str~} is similar to ~{str~}, but instead of using one argument that is a sequence, all the remaining arguments are used as the list of arguments for the iteration. clformat("Pairs:~@{ <~A,~S>~}.", args: "A", 1, "B", 2, "C", 3) ~:@{str~} combines the features of ~:{str~} and ~@{str~}. All the remaining arguments are used, and each one must be a sequence. On each iteration, the next argument is used as a list of arguments to str. clformat("Pairs:~:@{ <~A,~S>~}.", args: ["A", 1], ["B", 2], ["C", 3]) Terminating the repetition directive with ~:} instead of ~} forces str to be processed at least once, even if the initial sequence is empty. However, it will not override an explicit prefix parameter of zero. If str is empty, then an argument is used as str. It must be a string and precede any arguments processed by the iteration. |
~<…~> |
JUSTIFICATION: ~mincol,colinc,minpad,padchar,maxcol,elchar<str~> This directive justifies the text produced by processing control string str within a field which is at least mincol columns wide (default: 0). str may be divided up into segments via directive ~;, in which case the spacing is evenly divided between the text segments. With no modifiers, the leftmost text segment is left-justified in the field and the rightmost text segment is right-justified. If there is only one text element, it is right-justified. The : modifier causes spacing to be introduced before the first text segment. The @ modifier causes spacing to be added after the last text segment. The minpad parameter (default: 0) is the minimum number of padding characters to be output between each segment. Whenever padding is needed, the padding character padchar (default: ' ') is used. If the total width needed to satisfy the constraints is greater than mincol, then the width used is mincol + k × colinc for the smallest possible non-negative integer k with colinc defaulting to 1. clformat("|~10,,,'.<foo~;bar~>|")
⟹ |foo....bar| Note that str may include format directives. All the clauses in str are processed in order. It is the resulting pieces of text that are justified. The ~^ directive may be used to terminate processing of the clauses prematurely, in which case only the completely processed clauses are justified. If the first clause of a ~< directive is terminated with ~:; instead of ~;, then it is used in a special way. All of the clauses are processed, but the first one is not used in performing the spacing and padding. When the padded result has been determined, then, if it fits on the current line of output, it is output, and the text for the first clause is discarded. If, however, the padded text does not fit on the current line, then the text segment for the first clause is output before the padded text. The first clause ought to contain a newline (such as a ~% directive). The first clause is always processed, and so any arguments it refers to will be used. The decision is whether to use the resulting segment of text, not whether to process the first clause. If the ~:; has a prefix parameter n, then the padded text must fit on the current line with n character positions to spare to avoid outputting the first clause’s text. For example, the control string in the following example can be used to print a list of items separated by comma without breaking items over line boundaries, beginning each line with ;;. The prefix parameter 1 in ~1:; accounts for the width of the comma that will follow the justified item if it is not the last element in the list, or the period if it is. If ~:; has a second prefix parameter, like below, then it is used as the width of the line, overriding the line width as specified by clformat's linewidth: parameter (default: 80). clformat("~%;; ~{~<~%;; ~1,30:; ~S~>~^,~}.~%", If there is only one text segment str and parameter maxcol is provided and the length of the output of str is exceeding maxcol, then the output is truncated at width maxcol - 1 and the ellipsis character elchar (default: '…') is inserted at the end.
|
~^ |
UP AND OUT: ~^ Continue: The ~^ directive is an escape construct. If there are no more arguments remaining to be processed, then the immediately enclosing ~{ or ~< directive is terminated. If there is no such enclosing directive, then the entire formatting operation is terminated. In the case of ~<, the formatting is performed, but no more segments are processed before doing the justification. The ~^ directive should appear only at the beginning of a ~< clause, because it aborts the entire clause it appears in, as well as all following clauses. ~^ may appear anywhere in a ~{ construct. clformat("Done.~^ ~D warning~:P.~^ ~D error~:P.") If the directive has the form ~n^, then termination occurs if n is zero. If the directive has the form ~n,m^, termination occurs if the value of n equals the value of m. If the directive has the form ~n,m,o^, termination occurs if n ≤ m ≤ o. Of course, this is useless if all the prefix parameters are literals. At least one of them should be a # or a v parameter. Break: If ~^ is used within a ~:{ directive, then it merely terminates the current iteration step because in the standard case, it tests for remaining arguments of the current step only and the next iteration step commences immediately. To terminate the entire iteration process, use ~:^. ~:^ may only be used if the directive it would terminate is ~:{ or ~:@{. The entire iteration process is terminated if and only if the sublist that is supplying the arguments for the current iteration step is the last sublist (in the case of terminating a ~:{ directive) or the last argument to that call to format (in the case of terminating a ~:@{ directive). Note that while ~^ is equivalent to ~#^ in all circumstances, ~:^ is not equivalent to ~#:^ because the latter terminates the entire iteration if and only if no arguments remain for the current iteration step, as opposed to no arguments remaining for the entire iteration process. clformat("~:{/~A~^ …~}", |