On this page:
3.1 Pair lenses
car-lens
cdr-lens
caar-lens
cadr-lens
cdar-lens
cddr-lens
caaar-lens
caadr-lens
cadar-lens
caddr-lens
cdaar-lens
cdadr-lens
cddar-lens
cdddr-lens
caaaar-lens
caaadr-lens
caadar-lens
caaddr-lens
cadaar-lens
cadadr-lens
caddar-lens
cadddr-lens
cdaaar-lens
cdaadr-lens
cdadar-lens
cdaddr-lens
cddaar-lens
cddadr-lens
cdddar-lens
cddddr-lens
3.2 List lenses
list-ref-lens
first-lens
second-lens
third-lens
fourth-lens
fifth-lens
sixth-lens
seventh-lens
eighth-lens
ninth-lens
tenth-lens
list-ref-nested-lens
list-refs-lens
3.3 Association List Lenses
assoc-lens
assv-lens
assq-lens
6.2.901.900

3 Pair and List Lenses

3.1 Pair lenses

value

car-lens : lens?

value

cdr-lens : lens?

Lenses for examining the car and cdr of a pair.

Examples:

> (lens-view car-lens '(a . b))

'a

> (lens-view cdr-lens '(a . b))

'b

Lenses for accessing nested pairs. Each lens’s view is the equivalently named pair-accessor function.

Examples:

> (cdaddr '(9 8 (6 5 4 3 2 1) 7))

'(5 4 3 2 1)

> (lens-view cdaddr-lens '(9 8 (6 5 4 3 2 1) 7))

'(5 4 3 2 1)

> (lens-transform cdaddr-lens '(9 8 (6 5 4 3 2 1) 7) list->vector)

'(9 8 (6 . #(5 4 3 2 1)) 7)

3.2 List lenses

procedure

(list-ref-lens n)  lens?

  n : exact-nonnegative-integer?
Returns a lens for viewing the nth item of a list, with indexing starting from zero.

Examples:

> (lens-view (list-ref-lens 3) '(a b c d e f g h))

'd

> (lens-set (list-ref-lens 1) '(a b c d e f g h) 'FOO)

'(a FOO c d e f g h)

Lenses for examiniming specific items of lists. Shorthands for the common use cases of list-ref-lens.

Examples:

> (lens-view third-lens '(a b c d))

'c

> (lens-view (lens-compose second-lens fourth-lens)
             '((a 1) (b 2) (c 3) (d 4)))

4

procedure

(list-ref-nested-lens index ...)  lens?

  index : exact-nonnegative-integer?
Constructs a lens that views into a tree made from nested lists. Indexing starts from zero in the same was as list-ref-lens.

Examples:

> (define first-of-second-lens (list-ref-nested-lens 1 0))
> (lens-view first-of-second-lens '(1 (a b c) 2 3))

'a

> (lens-set first-of-second-lens '(1 (a b c) 2 3) 'foo)

'(1 (foo b c) 2 3)

procedure

(list-refs-lens index ...)  lens?

  index : exact-nonnegative-integer?
Constructs a lens that views each index item in a list. Indexing starts from zero in the same was as list-ref-lens.

Examples:

> (define 1-5-6-lens (list-refs-lens 1 5 6))
> (lens-view 1-5-6-lens '(a b c d e f g))

'(b f g)

> (lens-set 1-5-6-lens '(a b c d e f g) '(1 2 3))

'(a 1 c d e 2 3)

3.3 Association List Lenses

procedure

(assoc-lens key [#:is-equal? key-equal?])  lens?

  key : any/c
  key-equal? : (-> any/c any/c any/c) = equal?
Constructs a lens for examiniming association lists. Specifically, for a given association list the returned lens examines the second value of the first pair that has a key that is key-equal? to key.

Examples:

> (define assoc-a-lens (assoc-lens 'a))
> (define some-assoc-list '((a . 1) (b . 2) (c . 3)))
> (lens-view assoc-a-lens some-assoc-list)

1

> (lens-set assoc-a-lens some-assoc-list 100)

'((a . 100) (b . 2) (c . 3))

The key-equal? procedure is useful for datatypes that have their own definition of equality, such as strings.

Examples:

> (define assoc-foo-lens (assoc-lens "foo" #:is-equal? string=?))
> (lens-view assoc-foo-lens '(("bar" . 1) ("foo" . 2) ("baz" . 3)))

2

procedure

(assv-lens key)  lens?

  key : any/c
Equivalent to (assoc-lens key #:is-equal? eqv?).

procedure

(assq-lens key)  lens?

  key : any/c
Equivalent to (assoc-lens key #:is-equal? eq?).