さくらんぼのlambda日記

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

できたー!久しぶりに簡単!