From dcaad607abf01b8f728b4d3fc3f28a890fca5b0e Mon Sep 17 00:00:00 2001 From: William G Hatch Date: Fri, 7 Oct 2016 11:35:48 -0600 Subject: [PATCH] add udelimify --- udelim/lang/reader.rkt | 30 +++++------------------------- udelim/main.rkt | 24 ++++++++++++++++++++++++ udelim/udelim.scrbl | 11 ++++++++++- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/udelim/lang/reader.rkt b/udelim/lang/reader.rkt index 5f767ae..f5957d2 100644 --- a/udelim/lang/reader.rkt +++ b/udelim/lang/reader.rkt @@ -3,36 +3,16 @@ udelim ) - (provide (rename-out [at-read read] - [at-read-syntax read-syntax] - [at-get-info get-info])) + (provide (rename-out [u-read read] + [u-read-syntax read-syntax] + [u-get-info get-info])) - (define udelim-table - (make-list-delim-readtable/wrap - #\🌜 #\🌛 '#%moon-faces - #:base-readtable - (make-list-delim-readtable/wrap - #\⦕ #\⦖ '#%double-inequality-brackets - #:base-readtable - (make-list-delim-readtable/wrap - #\⦓ #\⦔ '#%inequality-brackets - #:base-readtable - (make-list-delim-readtable/wrap - #\﴾ #\﴿ '#%ornate-parens - #:base-readtable - (make-list-delim-readtable/wrap - #\⟅ #\⟆ '#%s-shaped-bag-delim - #:base-readtable - (make-string-delim-readtable/wrap - #\「 #\」 '#%cjk-corner-quotes - #:base-readtable - (make-string-delim-readtable #\« #\»)))))))) (define (wrap-reader p) (lambda args - (parameterize ([current-readtable udelim-table]) + (parameterize ([current-readtable (udelimify (current-readtable))]) (apply p args)))) - (define-values (at-read at-read-syntax at-get-info) + (define-values (u-read u-read-syntax u-get-info) (make-meta-reader 'udelim "language path" diff --git a/udelim/main.rkt b/udelim/main.rkt index 4b8ea22..d4830ea 100644 --- a/udelim/main.rkt +++ b/udelim/main.rkt @@ -11,6 +11,7 @@ (->* (char? char?) (#:base-readtable readtable?) readtable?)] [make-list-delim-readtable/wrap (->* (char? char? symbol?) (#:base-readtable readtable?) readtable?)] + [udelimify (->* ((or/c readtable? false/c)) readtable?)] [stx-string->port (->* (syntax?) input-port?)] [scribble-strings->string (->* (syntax?) syntax?)] )) @@ -115,6 +116,29 @@ (define make-list-delim-readtable/wrap (make-make-delim-readtable/wrap make-list-reader/wrap)) +(define (udelimify table) + (make-list-delim-readtable/wrap + #\🌜 #\🌛 '#%moon-faces + #:base-readtable + (make-list-delim-readtable/wrap + #\⦕ #\⦖ '#%double-inequality-brackets + #:base-readtable + (make-list-delim-readtable/wrap + #\⦓ #\⦔ '#%inequality-brackets + #:base-readtable + (make-list-delim-readtable/wrap + #\﴾ #\﴿ '#%ornate-parens + #:base-readtable + (make-list-delim-readtable/wrap + #\⟅ #\⟆ '#%s-shaped-bag-delim + #:base-readtable + (make-string-delim-readtable/wrap + #\「 #\」 '#%cjk-corner-quotes + #:base-readtable + (make-string-delim-readtable + #\« #\» + #:base-readtable table)))))))) + (define (stx-string->port stx) (let ([str (syntax->datum stx)] [line (syntax-line stx)] diff --git a/udelim/udelim.scrbl b/udelim/udelim.scrbl index b6a4e01..364ad26 100644 --- a/udelim/udelim.scrbl +++ b/udelim/udelim.scrbl @@ -16,7 +16,7 @@ Don't consider this library to be stable right now. Particularly the udelim met @section{Guide} This is a library I wrote primarily to help make nestable embedding of different syntax in #lang rash, but is generally useful for adding extra types of parenthesis or string delimiters to a language. After watching Jay McCarthy's talk at Sixth Racketcon, I also decided to steal his idea of making different types of parenthesis wrap their contents with an additional #%symbol. -You can use the udelim meta-language (eg #lang udelim racket/base) to add a few extra parenthesis types and string types to any language. Specifically, «» are nestable non-escaping string delimiters (IE «foo «bar»» reads as "foo «bar»"), 「」 are like «» but wrapped so 「foo bar」 produces (#%cjk-corner-quotes "foo bar"), ﴾foo bar﴿ reads as (#%ornate-parens foo bar), ⦓foo bar⦔ reads as (#%inequality-brackets foo bar), ⦕foo bar⦖ reads as (#%double-inequality-brackets foo bar), 🌜foo bar🌛 reads as (#%moon-faces foo bar), and ⟅foo bar⟆ reads as (#%s-shaped-bag-delim foo bar). To get default meanings for the #% identifiers (currently just pass-through macros), use (require udelim/defaults). +You can use the udelim meta-language (eg. #lang udelim racket/base) to essentially wrap your language's readtable with @racket[udelimify]. @section{Reference} @@ -96,6 +96,15 @@ EOS )))] } +@defproc[(udelimify [table (or/c readtable? false/c)]) readtable?]{ +Returns the readtable given, but extended with several more delimiters (the same ones as #lang udelim). + +Specifically: «» are nestable non-escaping string delimiters (IE «foo «bar»» reads as "foo «bar»"), 「」 are like «» but wrapped so 「foo bar」 produces (#%cjk-corner-quotes "foo bar"), ﴾foo bar﴿ reads as (#%ornate-parens foo bar), ⦓foo bar⦔ reads as (#%inequality-brackets foo bar), ⦕foo bar⦖ reads as (#%double-inequality-brackets foo bar), 🌜foo bar🌛 reads as (#%moon-faces foo bar), and ⟅foo bar⟆ reads as (#%s-shaped-bag-delim foo bar). + +To get default meanings for the #% identifiers (currently just pass-through macros), use @code{(require udelim/defaults)}. + +} + @defproc[(stx-string->port [stx syntax?]) input-port?]{ @racket[stx] should only contain a string. The location data on @racket[stx] is used to give the resulting port accurate location information when it is read. This is useful for creating macros that allow embedding of alternate syntax, such as #lang rash does.