Jason Swett
Jason Swett

Reputation: 45164

Formatting a list

I have the following list: (X X O NIL NIL O NIL NIL O)

I'd like to format it to look like this:

X | X | O
--+---+--
  |   | O
--+---+--
  |   | O

I could probably cobble something together with what little I know about Lisp and FORMAT, but it would probably be pretty gross. Any pointers would be greatly appreciated.

Upvotes: 2

Views: 157

Answers (2)

Beef
Beef

Reputation: 891

* (format t "~{~A | ~A | ~A~%~^--+---+--~%~}"
    (mapcar (lambda (x) (or x " ")) '(X O X NIL X X O X NIL)))
X | O | X
--+---+--
  | X | X
--+---+--
O | X |
NIL

A little explanation about the format string in the above. Crucial here are the '~{' '~}' and '~^'. A pair of matching Tilde braces take a list as input argument and iterate over it. The ~^ controls an early escape from this loop, if the list being iterated over is empty. Relevant documentation ~{ and ~^.

Upvotes: 1

jtdubs
jtdubs

Reputation: 13983

* (format t "~{~A | ~A | ~A~%~^--+---+--~%~}"
    (mapcar (lambda (x) (or x " ")) '(X O X NIL X X O X NIL)))
X | O | X
--+---+--
  | X | X
--+---+--
O | X |
NIL

Upvotes: 6

Related Questions