Hatena::Groupcadr

kozima の日記

2009-02-15

format でリストの末尾を表示したりしなかったり

| 22:57

ゴルフしてたら気付いたこと。

リストの最後の要素を表示

(format t "~{~*~#@*~A~}" '(first second third fourth last))
;-> LAST

簡単な説明をしておくと、こんな感じです。

  1. 最初の引数は [(first second third fourth last)] *1
  2. まず ~{ でリストを受け取る。引数は [first second third fourth last]
  3. ~* で一つ捨てる。これで引数は [second third fourth last]
  4. ~#@* の処理。残りの引数は四つなので、残る引数は [last]
  5. ~A で LAST が出力され、引数が空になる
  6. 引数がもうないので繰り返し終了

リストの最後以外の要素を表示

(format t "~{~A~#[~;~*~]~%~}" '(first second third))
;-> FIRST
;   SECOND

~#[~;~*~] で「残り引数が一つなら、その残っている最後の引数を捨てる」処理になります。

組み合わせると。

rotate lines reversely の解 (82 bytes) になります。

(format t"~{~*~#@*~A~}
~:*~{~A~#[~;~*~]
~}"(loop while(listen)collect(read-line)))

可読性は酷いですが、頭をひねればいろんなことができるものです。

*1:引数の表記法は適当