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

KMRCLを眺める(143) SHRINK-VECTOR

| 14:05 | KMRCLを眺める(143) SHRINK-VECTOR - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(143) SHRINK-VECTOR - わだばLisperになる

今回はKMRCLのstrings.lispから、SHRINK-VECTORです。

定義をみると仮引数にstrとあって文字列を取るのかと思ってしまいますが、VECTOR全般で使えるようです。

(defun shrink-vector (str size)
  #+allegro
  (excl::.primcall 'sys::shrink-svector str size)
  #+cmu
  (lisp::shrink-vector str size)
  #+lispworks
  (system::shrink-vector$vector str size)
  #+sbcl
  (sb-kernel:shrink-vector str size)
  #+scl
  (common-lisp::shrink-vector str size)
  #-(or allegro cmu lispworks sbcl scl)
  (setq str (subseq str 0 size))
  str)

動作は、

(LET ((S (MAKE-STRING 10 :INITIAL-ELEMENT #\X)))
  (KL:SHRINK-VECTOR S 5))
⇒ "XXXXX"

という感じだと思いますが、SBCLだと内部で呼び出しているSB-KERNEL:SHRINK-VECTORは破壊的変更をする関数ではないようで、

(LET ((S (MAKE-STRING 10 :INITIAL-ELEMENT #\X)))
  (KL:SHRINK-VECTOR S 5))
⇒ "XXXXXXXXXX"

となってしまいます。

ゲスト



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