From 4035441ca262f1cb5ab9ff5c79341a012099949c Mon Sep 17 00:00:00 2001 From: Jack Firth Date: Fri, 30 Aug 2024 16:36:56 -0700 Subject: [PATCH] Add for loop shortcuts for `#:when` and `#:unless` --- .../for-loop-shortcuts-test.rkt | 52 +++++++++++++++++++ .../for-loop-shortcuts.rkt | 20 ++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/default-recommendations/for-loop-shortcuts-test.rkt b/default-recommendations/for-loop-shortcuts-test.rkt index e64ff9d..a677f06 100644 --- a/default-recommendations/for-loop-shortcuts-test.rkt +++ b/default-recommendations/for-loop-shortcuts-test.rkt @@ -400,3 +400,55 @@ test: "(apply append ...) with a multi-body for* loop can't be removed" (displayln "formula time!") (hash-ref formulas k))) ------------------------------------------------------------ + + +test: "(when ...) in a for loop refactored to #:when clause" +------------------------------------------------------------ +(for ([x (in-list (list 1 2 'a 3 'b 4))]) + (when (number? x) + (displayln x))) +------------------------------------------------------------ +------------------------------------------------------------ +(for ([x (in-list (list 1 2 'a 3 'b 4))] + #:when (number? x)) + (displayln x)) +------------------------------------------------------------ + + +test: "(when ...) in a for* loop refactored to #:when clause" +------------------------------------------------------------ +(for* ([x (in-list (list 1 2 'a 3 'b 4))]) + (when (number? x) + (displayln x))) +------------------------------------------------------------ +------------------------------------------------------------ +(for* ([x (in-list (list 1 2 'a 3 'b 4))] + #:when (number? x)) + (displayln x)) +------------------------------------------------------------ + + +test: "(unless ...) in a for loop refactored to #:when clause" +------------------------------------------------------------ +(for ([x (in-list (list 1 2 'a 3 'b 4))]) + (unless (number? x) + (displayln x))) +------------------------------------------------------------ +------------------------------------------------------------ +(for ([x (in-list (list 1 2 'a 3 'b 4))] + #:unless (number? x)) + (displayln x)) +------------------------------------------------------------ + + +test: "(unless ...) in a for* loop refactored to #:when clause" +------------------------------------------------------------ +(for* ([x (in-list (list 1 2 'a 3 'b 4))]) + (unless (number? x) + (displayln x))) +------------------------------------------------------------ +------------------------------------------------------------ +(for* ([x (in-list (list 1 2 'a 3 'b 4))] + #:unless (number? x)) + (displayln x)) +------------------------------------------------------------ diff --git a/default-recommendations/for-loop-shortcuts.rkt b/default-recommendations/for-loop-shortcuts.rkt index 4ffe991..81d123c 100644 --- a/default-recommendations/for-loop-shortcuts.rkt +++ b/default-recommendations/for-loop-shortcuts.rkt @@ -272,12 +272,26 @@ (define-refactoring-rule apply-append-for-loop-to-for-loop #:description "Instead of using `(apply append ...)` to flatten a list of lists, consider using\ - `for*/list` to flatten the list" + `for*/list` to flatten the list." #:literals (apply append) [(apply append loop:apply-append-refactorable-for-loop) loop.refactored-loop]) +(define-refactoring-rule when-expression-in-for-loop-to-when-keyword + #:description "Use the `#:when` keyword instead of `when` to reduce loop body indentation." + #:literals (when for for*) + [((~or for-id:for for-id:for*) (clause ...) (when condition body ...)) + (for-id (clause ... #:when condition) body ...)]) + + +(define-refactoring-rule unless-expression-in-for-loop-to-unless-keyword + #:description "Use the `#:unless` keyword instead of `unless` to reduce loop body indentation." + #:literals (unless for for*) + [((~or for-id:for for-id:for*) (clause ...) (unless condition body ...)) + (for-id (clause ... #:unless condition) body ...)]) + + (define for-loop-shortcuts (refactoring-suite #:name (name for-loop-shortcuts) @@ -292,4 +306,6 @@ named-let-loop-to-for/first-in-vector nested-for-to-for* or-in-for/and-to-filter-clause - ormap-to-for/or))) + ormap-to-for/or + unless-expression-in-for-loop-to-unless-keyword + when-expression-in-for-loop-to-when-keyword)))