xsubseq

2017-08-30

Efficient way to manage "subseq"s in Common Lisp

Upstream URL

github.com/fukamachi/xsubseq

Author

Eitaro Fukamachi

License

BSD 2-Clause
README

XSubseq

XSubseq provides functions to be able to handle "subseq"s more effieiently. As Common Lisp's subseq copies the data every time, "subseq" and "concatenate" code is very inefficient like the following code.

(let ((result (make-array 0 :element-type '(unsigned-byte 8))))
  (lambda (data start end)
    (setf result (concatenate '(simple-array (unsigned-byte 8) (*))
                              result
                              (subseq data start end)))
    result))

XSubseq delays the copying until it is actually needed.

Usage

(defvar *data1* #(1 2 3))
(defvar *data2* #(4 5 6))

(xsubseq *data1* 0 1)
;=> #S(XSUBSEQ:XSUBSEQ :DATA #(1 2 3) :START 0 :END 1 :LEN 1)

(xnconc (xsubseq *data1* 0 1)
        (xsubseq *data2* 2))
;=> #S(XSUBSEQ:CONCATENATED-XSUBSEQS
;     :LEN 2
;     :LAST (#S(XSUBSEQ:XSUBSEQ :DATA #(4 5 6) :START 2 :END 3 :LEN 1))
;     :CHILDREN (#S(XSUBSEQ:XSUBSEQ :DATA #(1 2 3) :START 0 :END 1 :LEN 1)
;                #S(XSUBSEQ:XSUBSEQ :DATA #(4 5 6) :START 2 :END 3 :LEN 1)))

(coerce-to-sequence
 (xnconc (xsubseq *data1* 0 1)
         (xsubseq *data2* 2)))
;=> #(1 6)

(with-xsubseqs (result)
  (xnconcf result (xsubseq *data1* 0 1))
  (xnconcf result (xsubseq *data2* 2)))
;=> #(1 6)

Installation

(ql:quickload :xsubseq)

Author

Copyright

Copyright (c) 2014 Eitaro Fukamachi (e.arrows@gmail.com)

License

Licensed under the BSD 2-Clause License.

Dependencies (1)

  • prove

Dependents (2)

  • GitHub
  • Quicklisp