複数行の文字列を作成する
さて宿題にした複数行の文字列を作成するという課題です。
"first line second line third line " "first line second line third line "
このように複数行の文字を「"」でくくってしまえば問題なく動作します。
だけどそれだと逆引きRubyの示唆しているヒアドキュメントを満たしていないのでヒアドキュメントを自作することにします。let over lambdaに載っていたので利用させてもらいますね。
(defun |#>-reader| (stream sub-char numarg) (declare (ignore sub-car numarg)) (let (chars) (do ((curr (read-char stream) (read-char stream))) ((char= #\newline curr)) (push curr chars)) (let* ((pattern (nreverse chars)) (pointer pattern) (output)) (do ((curr (read-char stream) (read-char stream))) ((null pointer)) (push curr output) (setf pointer (if (char= (car pointer) curr) (cdr pointer) pattern)) (if (null pointer) (return))) (coerce (nreverse (nthcdr (length pattern) output)) 'string)))) (set-dispatch-macro-character #\# #\> #'|#>-reader|)
それでは実際にやってみると。
(setq hoge #>END this is test string END) "this is test string "
できてる!