Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-11-09

KMRCLを眺める(224) WRITE-CDATA

| 21:35 | KMRCLを眺める(224) WRITE-CDATA - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(224) WRITE-CDATA - わだばLisperになる

今回は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))

が忘れられていたりするんでしょうか。