KMRCLを眺める(224) WRITE-CDATA — #:g1

Posted 2010-11-09 12:35:00 GMT

今回はKMRCLのxml-utils.lispから、WRITE-CDATAです。
定義は、

(defun write-cdata (str s)
  (declare (simple-string str) (optimize (speed 3) (safety 0) (space 0)))
  (do ((len (length str))
       (i 0 (1+ i)))
      ((= i len) str)
    (declare (fixnum i len))
    (let ((c (schar str i)))
      (case c
        (#\< (write-string "&lt;" s))
        (#\& (write-string "&amp;" s))
        (t   (write-char c s))))))
となっていて、単純に"<"や"&"などを、&lt;、&amp;に置き換えるだけのものの様子。
動作は、
(kl:write-cdata "<![CDATA[こんにちは]]>" *standard-output*)
;-> &lt;![CDATA[こんにちは]]>
;=> "<![CDATA[こんにちは]]>"
となっていますが、CDATAセクションの中でCDATAのタグを使うための文字列を生成するというのもちょっとおかしいし、CDATAを表示させるためとしたら、>が置き換えされていないし…、ということでちょっと謎の関数です。
(#\> (write-string "&gt;" s))
が忘れられていたりするんでしょうか。

comments powered by Disqus