random-access-lists
2012-02-08
Persistent, random-access lists.
Upstream URL
Author
David Van Horn
Maintainer
Vincent Toups
License
Not determined
Random Access Lists
-------------------
This is an implementation of Random Access Lists, as described by
David Van Horn in SRFI-101: Purely Functional Random Access Pairs and
Lists.
I've ported this library to Common Lisp but it is otherwise his work,
and is distributed under the same terms as that implementation:
> SRFI 101: Purely Functional Random-Access Pairs and Lists
> Copyright (c) David Van Horn 2009. All Rights Reserved.
>
> Permission is hereby granted, free of charge, to any person obtaining
> a copy of this software and associated documentation
> files (the "Software"), to deal in the Software without restriction,
> including without limitation the rights to use, copy, modify, merge,
> publish, distribute, sublicense, and/or sell copies of the Software,
> and to permit persons to whom the Software is furnished to do so,
> subject to the following conditions:
>
> The above copyright notice and this permission notice shall be
> included in all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> NONINFRINGEMENT. REMEMBER, THERE IS NO SCHEME UNDERGROUND. IN NO EVENT
> SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
> DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
> OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
> THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Random Access Lists are a persistent data structure with `O(1)` `cons`,
`car`, `cdr`, and so forth but with much better performance for random
access and random persistent update, `O(log(n))`.
Usage:
------
Creation:
(ra-list 1 2 3 4) ; -> #S(PL-CONS
:SIZE 1
:TREE 1
:REST #S(PL-CONS ...))
Access:
(setq r (ra-list 1 2 3 4))
(ra-list-ref r 2) -> 3
(ra-car r) -> 1
(ra-cdr r) -> #S(PL-CONS :SIZE 3 :TREE #S(PL-NODE ...))
Update:
(ra-list-ref (ra-list-set r 2 100) 2) -> 100
(ra-list-ref r 2) -> 3
Updates are _persistent_, in that they do not change previous version
of the list. They merely return a new list with the updated value in
place.
Many functions of the `ra-caddr`, `ra-cddr`, etc are also provided
along with basic list manipulation functions like `ra-map`.