さくらんぼのlambda日記

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

複数行の文字列を作成する

さて宿題にした複数行の文字列を作成するという課題です。

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

できてる!