From 499f8da2226f6c9ffb020ad48193b01fb9ba1df0 Mon Sep 17 00:00:00 2001 From: Jack Firth Date: Thu, 9 Jul 2015 23:07:25 -0700 Subject: [PATCH 1/3] Add unstable lenses package with sty lenses --- lens/lenses-examples.rkt | 14 ++++++++++---- unstable/info.rkt | 4 ++++ unstable/lens.rkt | 5 +++++ unstable/lens/main.rkt | 5 +++++ unstable/lens/main.scrbl | 12 ++++++++++++ unstable/lens/syntax.rkt | 7 +++++++ {lens => unstable/lens}/syntax.scrbl | 13 ++++++++----- {lens => unstable/lens/syntax}/syntax-keyword.rkt | 2 +- {lens => unstable/lens/syntax}/syntax.rkt | 2 +- 9 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 unstable/info.rkt create mode 100644 unstable/lens.rkt create mode 100644 unstable/lens/main.rkt create mode 100644 unstable/lens/main.scrbl create mode 100644 unstable/lens/syntax.rkt rename {lens => unstable/lens}/syntax.scrbl (88%) rename {lens => unstable/lens/syntax}/syntax-keyword.rkt (98%) rename {lens => unstable/lens/syntax}/syntax.rkt (97%) diff --git a/lens/lenses-examples.rkt b/lens/lenses-examples.rkt index 46c5aea..7f16e4f 100644 --- a/lens/lenses-examples.rkt +++ b/lens/lenses-examples.rkt @@ -1,17 +1,20 @@ #lang racket (provide lenses-examples - lenses-applicable-examples) + lenses-applicable-examples + lenses-unstable-examples) (require scribble/eval) (define-syntax-rule (define-examples-form id require-spec ...) (begin - (define base-eval (make-base-eval)) - (base-eval '(require require-spec)) ... + (define (eval-factory) + (define base-eval (make-base-eval)) + (base-eval '(require require-spec)) ... + base-eval) (define-syntax-rule (id datum (... ...)) - (examples #:eval base-eval datum (... ...))))) + (examples #:eval (eval-factory) datum (... ...))))) (define-examples-form lenses-examples @@ -19,3 +22,6 @@ (define-examples-form lenses-applicable-examples lens/applicable racket/list) + +(define-examples-form lenses-unstable-examples + lens unstable/lens racket/list) diff --git a/unstable/info.rkt b/unstable/info.rkt new file mode 100644 index 0000000..6b688e3 --- /dev/null +++ b/unstable/info.rkt @@ -0,0 +1,4 @@ +#lang info + +(define name "unstable") +(define scribblings '(("lens/main.scrbl" () (library) "unstable-lens"))) diff --git a/unstable/lens.rkt b/unstable/lens.rkt new file mode 100644 index 0000000..cd8c177 --- /dev/null +++ b/unstable/lens.rkt @@ -0,0 +1,5 @@ +#lang racket + +(require "lens/main.rkt") + +(provide (all-from-out "lens/main.rkt")) diff --git a/unstable/lens/main.rkt b/unstable/lens/main.rkt new file mode 100644 index 0000000..539c781 --- /dev/null +++ b/unstable/lens/main.rkt @@ -0,0 +1,5 @@ +#lang racket + +(require "syntax.rkt") + +(provide (all-from-out "syntax.rkt")) diff --git a/unstable/lens/main.scrbl b/unstable/lens/main.scrbl new file mode 100644 index 0000000..7d1f34f --- /dev/null +++ b/unstable/lens/main.scrbl @@ -0,0 +1,12 @@ +#lang scribble/manual + +@title{Unstable Lenses} + +@defmodule[unstable/lens] + +This library provides additional features for the +@racketmodname[lens] library that are non-final and +may change in future releases. Do not depend on +this library being backwards-compatible. + +@include-section["syntax.scrbl"] diff --git a/unstable/lens/syntax.rkt b/unstable/lens/syntax.rkt new file mode 100644 index 0000000..5bc3f6a --- /dev/null +++ b/unstable/lens/syntax.rkt @@ -0,0 +1,7 @@ +#lang racket + +(require "syntax/syntax.rkt" + "syntax/syntax-keyword.rkt") + +(provide (all-from-out "syntax/syntax.rkt" + "syntax/syntax-keyword.rkt")) diff --git a/lens/syntax.scrbl b/unstable/lens/syntax.scrbl similarity index 88% rename from lens/syntax.scrbl rename to unstable/lens/syntax.scrbl index f15cf26..dff733e 100644 --- a/lens/syntax.scrbl +++ b/unstable/lens/syntax.scrbl @@ -1,7 +1,7 @@ #lang scribble/manual @(require scribble/eval - "lenses-examples.rkt" + lens/lenses-examples (for-label lens racket/base racket/contract)) @@ -9,11 +9,13 @@ @title{Syntax Lenses} +@defmodule[unstable/lens/syntax] + @defform[(syntax-lens target-id structure)]{ Constructs a lens that parses a syntax object and returns a piece of that syntax object as determined by where @racket[target-id] appears in @racket[structure]. - @lenses-examples[ + @lenses-unstable-examples[ (define first-of-second-stx-lens (syntax-lens A (_ (A _ ...) _ ...))) @@ -30,18 +32,19 @@ and views a syntax object containing all the terms in the target syntax that appear after @racket[kw] but before any other keyword. - @lenses-examples[ + @lenses-unstable-examples[ (define foo-kw-seq-lens (syntax-keyword-seq-lens '#:foo)) (lens-view foo-kw-seq-lens #'(a #:foo c d #:bar f)) (lens-set foo-kw-seq-lens #'(a #:foo c d #:bar f) #'(1 2 3 4 5 6)) ] - + If the target syntax object has no occurence of @racket[kw], or if the occurence of @racket[kw] is at the end of the syntax object or immediately followed by another keyword, then viewing produces the empty list syntax object @racket[#'()]. In the case where @racket[kw] is not present, setting is a no-op. - @lenses-examples[ + @lenses-unstable-examples[ + (define foo-kw-seq-lens (syntax-keyword-seq-lens '#:foo)) (lens-view foo-kw-seq-lens #'(a b f g)) (lens-view foo-kw-seq-lens #'(a #:foo #:bar f)) (lens-set foo-kw-seq-lens #'(a #:foo #:bar f) #'(1 2 3 4 5 6)) diff --git a/lens/syntax-keyword.rkt b/unstable/lens/syntax/syntax-keyword.rkt similarity index 98% rename from lens/syntax-keyword.rkt rename to unstable/lens/syntax/syntax-keyword.rkt index 09b6888..59112ac 100644 --- a/lens/syntax-keyword.rkt +++ b/unstable/lens/syntax/syntax-keyword.rkt @@ -1,6 +1,6 @@ #lang racket -(require "base/main.rkt" +(require lens fancy-app syntax/parse) diff --git a/lens/syntax.rkt b/unstable/lens/syntax/syntax.rkt similarity index 97% rename from lens/syntax.rkt rename to unstable/lens/syntax/syntax.rkt index 975d7c5..d71f5b9 100644 --- a/lens/syntax.rkt +++ b/unstable/lens/syntax/syntax.rkt @@ -2,7 +2,7 @@ (require syntax/parse rackunit - "base/main.rkt" + lens (for-syntax racket/syntax syntax/stx syntax/parse)) From 0e9eada6e6c3d2104bdea79f80939e982abf5104 Mon Sep 17 00:00:00 2001 From: Jack Firth Date: Thu, 9 Jul 2015 23:24:55 -0700 Subject: [PATCH 2/3] Add compound list lens --- unstable/lens/compound.rkt | 35 +++++++++++++++++++++++++++++++++++ unstable/lens/compound.scrbl | 27 +++++++++++++++++++++++++++ unstable/lens/main.rkt | 6 ++++-- unstable/lens/main.scrbl | 1 + 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 unstable/lens/compound.rkt create mode 100644 unstable/lens/compound.scrbl diff --git a/unstable/lens/compound.rkt b/unstable/lens/compound.rkt new file mode 100644 index 0000000..6f38a4e --- /dev/null +++ b/unstable/lens/compound.rkt @@ -0,0 +1,35 @@ +#lang racket + +(require lens) + +(module+ test + (require rackunit)) + +(provide + (contract-out + [compound-list-lens (->* () #:rest (listof lens?) lens?)])) + + +(define (zip xs ys) + (append-map list xs ys)) + +(define (compound-list-lens . lenses) + (define (get target) + (apply lens-view/list target lenses)) + (define (set target new-views) + (apply lens-set/list target (zip lenses new-views))) + (make-lens get set)) + + +(module+ test + (define first-third-fifth-lens + (compound-list-lens first-lens + third-lens + fifth-lens)) + (check-equal? (lens-view first-third-fifth-lens '(a b c d e f)) + '(a c e)) + (check-equal? (lens-set first-third-fifth-lens '(a b c d e f) '(1 2 3)) + '(1 b 2 d 3 f))) +(define first-first-lens + (compound-list-lens first-lens + first-lens)) diff --git a/unstable/lens/compound.scrbl b/unstable/lens/compound.scrbl new file mode 100644 index 0000000..71d4cd0 --- /dev/null +++ b/unstable/lens/compound.scrbl @@ -0,0 +1,27 @@ +#lang scribble/manual + +@(require scribble/eval + lens/lenses-examples + (for-label lens + racket/base + racket/contract)) + + +@title{Compound Lenses} + +@defmodule[unstable/lens/compound] + +@defproc[(compound-list-lens [lens lens?] ...) lens?]{ + Constructs a lens that combines the view of each + @racket[lens] into a list of views. This lens can + be used to view and set a list of values in a single + target. If any of the lenses share views, then when + setting the later lenses override the earlier ones. + @lenses-unstable-examples[ + (define first-third-fifth-lens + (compound-list-lens first-lens + third-lens + fifth-lens)) + (lens-view first-third-fifth-lens '(a b c d e f)) + (lens-set first-third-fifth-lens '(a b c d e f) '(1 2 3)) +]} diff --git a/unstable/lens/main.rkt b/unstable/lens/main.rkt index 539c781..d488efe 100644 --- a/unstable/lens/main.rkt +++ b/unstable/lens/main.rkt @@ -1,5 +1,7 @@ #lang racket -(require "syntax.rkt") +(require "syntax.rkt" + "compound.rkt") -(provide (all-from-out "syntax.rkt")) +(provide (all-from-out "syntax.rkt" + "compound.rkt")) diff --git a/unstable/lens/main.scrbl b/unstable/lens/main.scrbl index 7d1f34f..8085b8b 100644 --- a/unstable/lens/main.scrbl +++ b/unstable/lens/main.scrbl @@ -9,4 +9,5 @@ This library provides additional features for the may change in future releases. Do not depend on this library being backwards-compatible. +@include-section["compound.scrbl"] @include-section["syntax.scrbl"] From f9162f76fbbc4ad1f258e81e9892ffe96ea3a6db Mon Sep 17 00:00:00 2001 From: Jack Firth Date: Thu, 9 Jul 2015 23:28:08 -0700 Subject: [PATCH 3/3] Exclude unstable scribblings from tests --- info.rkt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/info.rkt b/info.rkt index 492fe9c..c6683a6 100644 --- a/info.rkt +++ b/info.rkt @@ -37,4 +37,7 @@ "lens/list/assoc.scrbl" "lens/list/car-cdr.scrbl" "lens/list/list-ref-take-drop.scrbl" - "lens/list/main.scrbl")) + "lens/list/main.scrbl" + "unstable/lens/main.scrbl" + "unstable/lens/compound.scrbl" + "unstable/lens/syntax.scrbl"))