From e4a39ee906c53d5711fd8d200ebdd9b036f9ea03 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sun, 4 Jun 2017 11:17:40 -0700 Subject: [PATCH] `generate-literals`: treat nonalphabetic identifiers as literals --- .../br/private/generate-literals.rkt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/beautiful-racket-lib/br/private/generate-literals.rkt b/beautiful-racket-lib/br/private/generate-literals.rkt index f1eb466..1819736 100644 --- a/beautiful-racket-lib/br/private/generate-literals.rkt +++ b/beautiful-racket-lib/br/private/generate-literals.rkt @@ -1,17 +1,21 @@ #lang racket/base (require "syntax-flatten.rkt") -(provide (all-defined-out)) +(provide generate-literals) + +(define (literal-identifier? pat-datum) + (and (symbol? pat-datum) + (not (memq pat-datum '(... _))) ; isn't a reserved identifier + (let ([pat-str (symbol->string pat-datum)]) + (or (not (regexp-match #rx"[A-Z]" pat-str)) ; either doesn't contain at least one uppercase letter ... + (not (equal? (string-upcase pat-str) pat-str)))))) ;... or doesn't contain all uppercase letters ;; generate literals for any symbols that are not ... or _ and not IN_CAPS (define (generate-literals pats) (for*/list ([pat-arg (in-list (syntax-flatten pats))] [pat-datum (in-value (syntax->datum pat-arg))] - #:when (and (symbol? pat-datum) - (not (memq pat-datum '(... _))) ; exempted from literality - (let ([pat-str (symbol->string pat-datum)]) - (not (equal? (string-upcase pat-str) pat-str))))) + #:when (literal-identifier? pat-datum)) pat-arg)) (module+ test (require rackunit) - (check-equal? (map syntax->datum (generate-literals #'(foo 42 BAR _ bar 3bar))) '(foo bar 3bar))) \ No newline at end of file + (check-equal? (map syntax->datum (generate-literals #'(foo 42 BAR _ (... ...) bar <=> 3Bar 3bar))) '(foo bar <=> 3Bar 3bar))) \ No newline at end of file