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-02-26

KMRCLを眺める NSTRING-TRIM-LAST-CHARACTER (98)

| 13:34 | KMRCLを眺める NSTRING-TRIM-LAST-CHARACTER (98) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める NSTRING-TRIM-LAST-CHARACTER (98) - わだばLisperになる

今回はKMRCLのstrings.lispから、NSTRING-TRIM-LAST-CHARACTERです。

前回眺めたNSUBSEQを利用しています。

(defun nstring-trim-last-character (s)
  "Return the string less the last character"
  (let ((len (length s)))
    (if (plusp len)
        (nsubseq s 0 (1- len))
        s)))

動作は、

(LET* ((STR "foo
")
       (CHOPPED (KL:NSTRING-TRIM-LAST-CHARACTER STR)))
  (SETF (AREF CHOPPED 0) #\F)
  (LIST STR CHOPPED))
⇒ ("Foo
"
 "Foo")
(LET* ((STR "foo
")
       (CHOPPED (KL:STRING-TRIM-LAST-CHARACTER STR)))
  (SETF (AREF CHOPPED 0) #\F)
  (LIST STR CHOPPED))
⇒ ("foo
"
 "Foo")

というところ。

前回のNSUBSEQでid:lkozimaさんよりNSUBSEQの存在意義は、破壊的関数と組合せるというより、元のシーケンスとメモリを共有したい(しても良い)状況で利用するところにあるのではないか、というご指摘がありました。

確かにN〜系の関数はNo consingということで、元々はそういう意味合いで使われていたのではないかという気がします。