元ネタ続・縦書き

(大元ネタの方面はプログラミングする話ではなかったようですが。PCに縦書きが適さないからやめるの?プチ祭り「縦書や元号?」

こういうのはC++でOvenだろ、ということで初めzippedでやろうとしましたが、これテンプレートなんでコンパイル時に行数を決めざるを得ないんですよね。

というわけで、Scheme、それもせっかくなので今まで使ったことのないGaucheでやってみました。別に短くとか1行とかは考えていませんのであしからず。

(define (vertical-map l proc space)
  (define (maybe-lambda proc space)
    (lambda (l) (if (null? l) space (proc l))))
  (if (not (fold (lambda (l b) (and (null? l) b)) #t l))
    (begin
      (proc (map (maybe-lambda car space) l))
      (vertical-map (map (maybe-lambda cdr ()) l) proc space))))
 
(define (print-vertical-string l)
  (vertical-map
    (map string->list (reverse l))
    (lambda (x)
      (map write-char x)
      (newline))
    #\\space)
  (newline))

はい、Scheme初心者です。ぐしゃぐしゃですが、行き当たりばったりで書いても出来上がるところが素敵です。

(print-vertical-string '(
  "WINDY"
  "WOOD"
  "JUMP"
  "FLY"
  "WATERY"
  "ILLUSION"))
IWFJWW
LALUOI
LTYMON
UE PDD
SR   Y
IY
O
N

ちなみに、最初は行の長さが揃っている必要のあるものを作っていたのですが、マクロでもないのにバッククォート・コンマなどの出番と相成りました。まだこの程度でおどろくようなひよっこです。

(define (print-vertical-string l)
  (apply map
    `(
      ,(lambda x
        (map write-char (reverse x))
        (newline))
      ,@(map string->list l))))

スポンサード リンク

この記事のカテゴリ