~evhan/beaker

b90a0eda69b68a60441be149fb24f3b94768f4c5 — Evan Hanson 3 months ago 0a40b91
Improve quoted constant detection
2 files changed, 15 insertions(+), 4 deletions(-)

M lib/beaker.scm
M tests/examples.scm
M lib/beaker.scm => lib/beaker.scm +8 -4
@@ 85,9 85,6 @@
                    (x** (loop (cdr x) (- (sub1 w) (pp-length x*)) d)))
               (cons x* x**))))))

  (define (quasiquote? x)
    (and (pair? x) (eq? (car x) 'quasiquote)))

  (define (expression-contains? x pred)
    (cond ((pred x) #t)
          ((vector? x)


@@ 110,6 107,13 @@
        (vector? x)
        (##sys#srfi-4-vector? x)))

  (define (quoted-constant? x)
    (and (pair? x)
         (or (compiler-compare (car x) 'scheme 'quote)
             (compiler-compare (car x) 'scheme 'quasiquote))
         (or (constant? (cadr x))
             (quoted-constant? (cadr x)))))

  (define (symbol-namespace sym)
    (and-let* ((str (symbol->string sym))
               (sep (string-index str #\#)))


@@ 152,7 156,7 @@
      (warn 'missing-else x)))

  (define (analyse-quote x)
    (when (constant? (cadr x))
    (when (quoted-constant? x)
      (warn 'unnecessary-quote x)))

  (define (analyse-quasiquote x)

M tests/examples.scm => tests/examples.scm +7 -0
@@ 33,3 33,10 @@

;; https://todo.sr.ht/~evhan/beaker/5
(module foo ())

(quote #t) ;> ("examples.scm:37" warning unnecessary-quote)
(quote "foo") ;> ("examples.scm:38" warning unnecessary-quote)
(quote (quote #t)) ;> ("examples.scm:39" warning unnecessary-quote)
(quote (quasiquote #t)) ;> ("examples.scm:40" warning unnecessary-quote)
(quote foo)
(quote (quote foo))