Lispで文字列処理その5
なんか前回の回答が@lapis_moon先生にダメ出しされてしまいました。
http://twitter.com/lapis_moon/status/7819655300
@lambda_sakura ヒアドキュメント的に、最後の改行ってどうなのかしら? 最後に出てくる例でいうと、「string"」ってふうに改行なしで終わるべきなんじゃないのかしら
なるほど!
というわけで、右trimすれば良いんじゃないかと思いましたので最後の改行を消した文字列を返すように変更しました。
(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))) (string-right-trim '(#\Newline) (coerce (nreverse (nthcdr (length pattern) output)) 'string)))))
それでは実際やってみます!
(setq hoge #>END this is test string END) "this is test string"
ちゃんと最後の改行は消されました!
(setq fuga #>END this is test stringEND) "this is test string"
指定したパターンが文中に表れても問題なく処理できてる感じですね。