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)))))