diff --git a/default-recommendations/hash-shortcuts-test.rkt b/default-recommendations/hash-shortcuts-test.rkt index 8588524c..29fa1f75 100644 --- a/default-recommendations/hash-shortcuts-test.rkt +++ b/default-recommendations/hash-shortcuts-test.rkt @@ -162,6 +162,19 @@ test: "hash-set! with hash-ref and literal keys can be simplified to hash-update ------------------------------ +test: "hash-set! with hash-ref can be simplified to hash-update! without lambda" +------------------------------ +(define h (make-hash)) +(define k 'a) +(hash-set! h k (add1 (hash-ref h k 0))) +------------------------------ +------------------------------ +(define h (make-hash)) +(define k 'a) +(hash-update! h k add1 0) +------------------------------ + + test: "hash-set! with hash-ref cannot be simplified when v would shadow" ------------------------------ (define h (make-hash)) diff --git a/default-recommendations/hash-shortcuts.rkt b/default-recommendations/hash-shortcuts.rkt index ecb4d761..a398ca69 100644 --- a/default-recommendations/hash-shortcuts.rkt +++ b/default-recommendations/hash-shortcuts.rkt @@ -10,6 +10,7 @@ (require (for-syntax racket/base) + racket/list racket/set rebellion/private/static-name resyntax/base @@ -107,9 +108,11 @@ #:when (syntax-free-identifier=? #'k1 #'k2) #:when (for/and ([id (in-syntax-identifiers #'(f arg-before ... arg-after ...))]) (not (equal? (syntax-e id) 'v))) - (hash-update! h1 k1 - (λ (v) (f arg-before ... v arg-after ...)) - (~? failure-result))) + #:with updater + (if (and (empty? (attribute arg-before)) (empty? (attribute arg-after))) + #'f + #'(λ (v) (f arg-before ... v arg-after ...))) + (hash-update! h1 k1 updater (~? failure-result))) (define-refactoring-rule hash-map-to-hash-keys