format

xyzzyのリファレンスには載ってなかったので2009-02-01 - kozima の日記 - cadr groupで初めて知ったのだが、~VAなどとすると、引数で桁数を渡せる。


そこで一つ問題である。

> (format t "~{~VT~A~%~}" '(2 a 3 b 4 c))
  a
   b
    c

反復指示中で用いるには、このようなリストを渡さなくちゃいけないけど、'(a b c)で指示して、インデントは共通のものを使いたい。ということのようなので、上のリストの形式に直せばいいんじゃないだろうか。

(defun proem (arg lst)
  (let (out)
  (dolist (l lst)
    (push arg out)
    (push l out))
  (reverse out)))

> (proem 8 '(a b c))
(8 a 8 b 8 c)

> (format t "<ul>~%~{~VT<li>~A</li>~%~}</ul>"  (proem 8 '(aa bb cc)))
<ul>
        <li>aa</li>
        <li>bb</li>
        <li>cc</li>
</ul>

リストを交互に組み込んだリストを作る関数もあると便利な気がする。

(defun riffle (lsta lstb)
  (let (out)
  (map nil (lambda (x y) (push x out) (push y out))
     lsta lstb)
  (reverse out)))

> (riffle '(1 2 3) '(a b c))
(1 a 2 b 3 c)