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-04-18

KMRCLを眺める(141) STRING-ELIDE

| 16:10 | KMRCLを眺める(141) STRING-ELIDE - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(141) STRING-ELIDE - わだばLisperになる

今回はKMRCLのstrings.lispから、STRING-ELIDEです。

動作は、指定した長さを越える文字列は、省略の...を付けて切り詰めるというものです。

(DEFVAR *IROHA*
  "いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす")

(KL:STRING-ELIDE " 10 :END)
⇒
"いろはにほへと..."

(KL:STRING-ELIDE *IROHA* 47 :END)
⇒
"いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす"

(KL:STRING-ELIDE *IROHA* 46 :END)
⇒
"いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑ..."

(KL:STRING-ELIDE *IROHA* 46 :MIDDLE)
⇒
"いろはにほへとちりぬるをわかよたれそつねなら...おくやまけふこえてあさきゆめみしゑひもせす"

という風に、デフォルトの動作は、:ENDを指定したものを一緒で、最後に"..."を、:MIDDLEを指定すると中央に"..."が入ります。

定義は、

(defun string-elide (str maxlen position)
  (declare (fixnum maxlen))
  (let ((len (length str)))
    (declare (fixnum len))
    (cond
     ((<= len maxlen)
      str)
     ((<= maxlen 3)
      "...")
     ((eq position :middle)
      (multiple-value-bind (mid remain) (truncate maxlen 2)
        (let ((end1 (- mid 1))
              (start2 (- len (- mid 2) remain)))
          (concatenate 'string (subseq str 0 end1) "..." (subseq str start2)))))
     ((or (eq position :end) t)
      (concatenate 'string (subseq str 0 (- maxlen 3)) "...")))))

となっています。

ぱっと見たところ

(or (eq position :end) t)

が結局どういうことなんだと思ってしまいますが、良く良く考えると気持ちはなんとなく分かります。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100418