Details
Description
The star-directive in clojure.pprint/cl-format with an at-prefix (~n@*) does not obey its specifications according to Common Lisp the Language, 2nd Edition. There are two bugs within ~n@* as of right now:
- When ~n@* is supposed to jump forward over more than one argument, it jumps one step backward as if it had seen ~:*. For instance, (cl-format nil "~D ~3@*~D" 0 1 2 3) will return "0 0" and not "0 3" as expected.
- When ~@* is seen, the formatter is supposed to jump to the first argument (as n defaults to 0, see specification linked above). However, whenever a ~@*-directive is seen, the formatter jumps to the second argument instead.
What (small set of) steps will reproduce the problem?
Inside a clean Clojure repl, perform these steps:
user=> (require '[clojure.pprint :refer [cl-format]]) nil user=> (cl-format nil "~D ~3@*~D" 0 1 2 3) "0 0" ;; Expected: "0 3" user=> (cl-format nil "~D~D~D~D ~@*~D" 0 1 2 3) "0123 1" ;; Expected: "0123 0"
What is the expected output? What do you see instead?
The expected output is "0 3" and "0123 0", but is "0 0" and "0123 1" as shown above.
What version are you using?
Tested on both 1.4.0 and 1.5.0-beta2, both have the defect described.
Please provide any additional information below.
The format strings which reproduces the problem has been compared with the format function from the Common Lisp implementations SBCL, CLisp and Clozure. All of them print the expected output.
Attachments
Activity
Jean Niklas L'orange
made changes -
| Field | Original Value | New Value |
|---|---|---|
| Attachment | clj-1134-star-directive-in-cl-format.txt [ 11767 ] |
Andy Fingerhut
made changes -
| Patch | Code and Test [ 10002 ] |