General accumulator

General-purpose, extensible value accumulator library

Link to the source code repository: General accumulator.

Introduction

General accumulator is a general-purpose, extensible value accumulator library. Its main interface is with-accumulator macro which sets an environment for easy accumulation. The library provides several built-in accumulators which should cover the most common use-cases but any kind of accumulators can be added because the accumulator back-end is implemented through generic functions.

(with-accumulator (NAME OBJECT &key KEYWORD-ARGUMENTS ...)
  BODY ...)

Some examples

GENACC> (with-accumulator (collect :list)
          (collect 1) (collect 2) (collect 3)
          (collect))
(1 2 3)

GENACC> (with-accumulator (collect (list 1 2 3)) (collect 4) (collect 5) (collect)) (1 2 3 4 5)

GENACC> (with-accumulator (collect :vector) (collect "first") (collect "second") (collect)) #("first" "second")

GENACC> (with-accumulator (collect :string) (collect #\a) (collect "bcd") (collect #(#\e #\f)) (collect '(#\g #\h #\i)) (collect)) "abcdefghi"

GENACC> (with-accumulator (summing #'+) (summing 5) (summing 7) (summing 11) (summing)) 23

GENACC> (with-accumulator (nc #'nconc) (nc (list 1 2 3)) (nc (list 4 5 6)) (nc (list 7 8 9)) (nc)) (1 2 3 4 5 6 7 8 9)

GENACC> (with-accumulator (early-char (lambda (a b) (if (char< a b) a b))) (early-char #\o) (early-char #\b) (early-char #\s) (early-char)) #\b

For more information and examples read the project's README file.


libraries, language extension, Public Domain

CLiki pages can be edited by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively