LL Golf Hole 2 - 文字列に含まれる単語の最初の文字を大文字にする

久々にSchemeかいた。とりあえず正規表現なども使わずに超ナイーブに書き下してみた。ここからどう短かくしてゆこうか。

エロと風俗情報満載 どう抜く?

(define (capitalize-words str)
  (define (capitalize port)
    (let1 c (read-char port)
      (cond
       ((eof-object? c) #t)
       ((char-whitespace? c)
	(write-char c)
	(capitalize port))
       (else
	(write-char (char-upcase c))
	(no-capitalize port)))))
  (define (no-capitalize port)
    (let1 c (read-char port)
      (cond
       ((eof-object? c) #t)
       ((char-whitespace? c)
	(write-char c)
	(capitalize port))
       (else
	(write-char (identity c))
	(no-capitalize port)))))

  (with-output-to-string
      (lambda ()
	(let1 port (open-input-string str)
	  (capitalize port)))))
      • -

とりあえずほぼ同じ形の関数capitalize と no-capitalize をまとめる。

(define (capitalize-words str)
  (define capitalize (char-processor char-upcase))
  (define no-capitalize (char-processor identity))
  (define (char-processor f)
    (lambda (port)
      (let1 c (read-char port)
	(cond
	 ((eof-object? c) #t)
	 ((char-whitespace? c)
	  (write-char c)
	  (capitalize port))
	 (else
	  (write-char (f c))
	  (no-capitalize port))))))

  (with-output-to-string
      (lambda ()
	(let1 port (open-input-string str)
	  (capitalize port)))))