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

KMRCLを眺める NSUBSEQ (97)

| 23:30 | KMRCLを眺める NSUBSEQ (97) - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める NSUBSEQ (97) - わだばLisperになる

今回はKMRCLのstrings.lispではなくて、seqs.lispから、NSUBSEQです。

strings.lispの関数から呼び出されているので先に眺めます。

命名規則からするとNが付いたSUBSEQということで、破壊的変更を加えるSUBSEQなのかと思いますが、どうやら新規のシーケンスを作成して返すのではなく、元のシーケンスを返すのでNが付いている様子。

(defun nsubseq (sequence start &optional end)
  "Return a subsequence by pointing to location in original sequence"
  (unless end (setq end (length sequence)))
  (make-array (- end start)
              :element-type (array-element-type sequence)
              :displaced-to sequence
              :displaced-index-offset start))

SUBSEQとの違いは

(LET ((SEQ (MAKE-ARRAY 6 :INITIAL-ELEMENT 42)))
  (SETF (AREF (KL:NSUBSEQ SEQ 3) 0)
        0)
  SEQ)
;⇒ #(42 42 42 0 42 42)

(LET ((SEQ (MAKE-ARRAY 6 :INITIAL-ELEMENT 42)))
  (SETF (AREF (SUBSEQ SEQ 3) 0)
        0)
  SEQ)
;⇒ #(42 42 42 42 42 42)
(LET ((SEQ (COPY-SEQ "-------")))
  (REPLACE (SUBSEQ SEQ 3 6)
           "foo")
  SEQ)
;⇒ "-------"

(LET ((SEQ (COPY-SEQ "-------")))
  (REPLACE (KL:NSUBSEQ SEQ 3 6)
           "foo")
  SEQ)
;⇒ "---foo-"

というところでしょうか。

なるほどなとも思うのですが、しかし似たようなものに(SETF SUBSEQ)があり、

(LET ((SEQ (COPY-SEQ "-------")))
  (REPLACE (KL:NSUBSEQ SEQ 3 6)
           "foo")
  SEQ)
;⇒ "---foo-"

(LET ((SEQ (COPY-SEQ "-------")))
  (SETF (SUBSEQ SEQ 3 6)
        "foo")
  SEQ)
;⇒ "---foo-"

(SETF SUBSEQ)でも殆ど同じことができるんじゃないかなと思うんですが、どうなんでしょう。(しかし、処理系に用意されているSETF関数/マクロはどこからどこまでが処理系依存なのか…)

ゲスト



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