ヒアドキュメントの終端文字列をインデントする
次の課題はこれです。前の課題のマクロを修正すれば簡単に対応できそうですね。
(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 (coerce (nreverse chars) 'string)) (pointer pattern) (output)) (do ((curr (read-line stream) (read-line stream))) ((null curr)) (if (string= pattern (string-left-trim '(#\Newline #\Tab #\Space) curr)) (return)) (setq output (concatenate 'string output curr (make-string 1 :initial-element #\newline)))) (string-right-trim '(#\Newline) output ) ))) (set-dispatch-macro-character #\# #\@ #'|#@-reader|)
そーい。
(setq hoge #@END this is test string END ) "this is test string"
できたー!久しぶりに簡単!