From f87458f896ae73796a0f5889d729e9dd5de3a4d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20L=C3=B3pez=20Ferrando?= Date: Tue, 19 Sep 2023 15:53:22 +0200 Subject: [PATCH 1/3] Check that $name is not already on $GLOBAL_BARE_IMPORTS before appending --- .grit/patterns/importing.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.grit/patterns/importing.md b/.grit/patterns/importing.md index 4fc9b50..8604196 100644 --- a/.grit/patterns/importing.md +++ b/.grit/patterns/importing.md @@ -100,12 +100,14 @@ pattern ensure_import_from($source) { pattern ensure_imported() { $name where { - and { - $program <: not contains python_import(source=$source) where { - $source = $name, - }, - $GLOBAL_BARE_IMPORTS += [$name] - } + and { + $program <: not contains python_import(source=$name), + if ($GLOBAL_BARE_IMPORTS <: not some $name) { + $GLOBAL_BARE_IMPORTS += [$name] + } else { + true + } + } } } From 621e17f466a05487bb7bd575f80edffc1aac3ca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20L=C3=B3pez=20Ferrando?= Date: Tue, 19 Sep 2023 16:11:17 +0200 Subject: [PATCH 2/3] Add pattern to replace for loop computing a product to a call to math.prod --- .grit/patterns/math_prod.md | 101 ++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 .grit/patterns/math_prod.md diff --git a/.grit/patterns/math_prod.md b/.grit/patterns/math_prod.md new file mode 100644 index 0000000..620f824 --- /dev/null +++ b/.grit/patterns/math_prod.md @@ -0,0 +1,101 @@ +--- +title: Use `math.prod` instead of multiplying in a loop +--- + +This pattern transforms a loop that computes the product of a list of numbers into a call to `math.prod` (introduced in Python 3.8). + + +```grit +engine marzano(0.1) +language python + +pattern prod_init($accum) { + or { + `$accum = 1`, + `$accum = 1.0`, + } +} + +pattern prod_accum($accum, $factor) { + or { + `$accum *= $factor`, + `$accum = $accum * $factor`, + `$accum = $factor * $accum`, + } +} + +`$for` where { + $for <: after prod_init(accum = $var) => ., + $for <: for_statement(body=block(statements=[prod_accum(accum = $var, factor = $left)]), $left, $right), + $left <: identifier(), + $import = `math`, + $import <: ensure_imported(), +} => `math.prod($right)` +``` + +## Transforms for loop to `math.prod` + + +```python +n = 1 +for x in range(10): + n *= x + +n = 1.0 +for x in range(10): + n = n * x + +n = 1 +for x in range(10): + n = x * n + +prod = 1 +for x in [4, 5, 6]: + prod *= x + +# Left as is + +n = 1 +for x in range(10): + y = n * x + +n = 1 +for x in range(10): + n = y * x + +n = 1 +for x in range(10): + n *= x + print("multiplied") +``` + +```python +import math + + +math.prod(range(10)) + + +math.prod(range(10)) + + +math.prod(range(10)) + + +math.prod([4, 5, 6]) + +# Left as is + +n = 1 +for x in range(10): + y = n * x + +n = 1 +for x in range(10): + n = y * x + +n = 1 +for x in range(10): + n *= x + print("multiplied") +``` \ No newline at end of file From 8399bab951498090f3f38d64d6a71da1340baa8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20L=C3=B3pez=20Ferrando?= Date: Tue, 19 Sep 2023 16:57:28 +0200 Subject: [PATCH 3/3] Match `for_statement` directly --- .grit/patterns/math_prod.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.grit/patterns/math_prod.md b/.grit/patterns/math_prod.md index 620f824..ad0de19 100644 --- a/.grit/patterns/math_prod.md +++ b/.grit/patterns/math_prod.md @@ -24,9 +24,8 @@ pattern prod_accum($accum, $factor) { } } -`$for` where { +for_statement(body=block(statements=[prod_accum(accum = $var, factor = $left)]), $left, $right) as $for where { $for <: after prod_init(accum = $var) => ., - $for <: for_statement(body=block(statements=[prod_accum(accum = $var, factor = $left)]), $left, $right), $left <: identifier(), $import = `math`, $import <: ensure_imported(),