さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

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"

指定したパターンが文中に表れても問題なく処理できてる感じですね。