Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactored version of List's grep, reduce, etc. #107

Closed
p6rt opened this issue May 26, 2008 · 4 comments
Closed

Refactored version of List's grep, reduce, etc. #107

p6rt opened this issue May 26, 2008 · 4 comments
Labels

Comments

@p6rt
Copy link

p6rt commented May 26, 2008

Migrated from rt.perl.org#54822 (status was 'resolved')

Searchable as RT54822$

@p6rt
Copy link
Author

p6rt commented May 26, 2008

From @bacek

Hello

There is refactored version of List's grep, reduce, first methods.

Changes​:
  1. Use Iterator instead of keyed access.
  2. Don't create new closure.

--
Bacek

@p6rt
Copy link
Author

p6rt commented May 26, 2008

From @bacek

list.diff
diff --git a/languages/perl6/src/classes/List.pir b/languages/perl6/src/classes/List.pir
index 0c603e8..8b22356 100644
--- a/languages/perl6/src/classes/List.pir
+++ b/languages/perl6/src/classes/List.pir
@@ -515,32 +515,19 @@ Checks to see if the specified index or indices have been assigned to.  Returns
 .sub grep :method
     .param pmc test
     .local pmc retv
-    .local pmc block
+    .local pmc iter
     .local pmc block_res
     .local pmc block_arg
-    .local int narg
-    .local int i
 
     retv = new 'List'
-    narg = self.'elems'()
-    i = 0
-
+    iter = new 'Iterator', self
   loop:
-    if i == narg goto done
-    block_arg = self[i]
-
-    newclosure block, test
-    block_res = block(block_arg)
-
-    if block_res goto grepped
-    goto next
+    unless iter goto done
+    block_arg = shift iter
+    block_res = test(block_arg)
 
-  grepped:
+    unless block_res goto loop
     retv.'push'(block_arg)
-    goto next
-
-  next:
-    inc i
     goto loop
 
   done:
@@ -552,26 +539,22 @@ Checks to see if the specified index or indices have been assigned to.  Returns
 =cut
 
 .sub reduce :method
-    .param pmc test
+    .param pmc oper
     .local pmc retv
-    .local pmc block
+    .local pmc iter
+    .local pmc block_res
     .local pmc block_arg
-    .local int narg
-    .local int i
 
-    narg = self.'elems'()
-    if narg == 0 goto empty
-    retv = self[0]
-    i = 1
-
-  loop:
-    if i >= narg goto done
+    retv = new 'List'
+    iter = new 'Iterator', self
+    unless iter goto empty
 
-    newclosure block, test
-    block_arg = self[i]
-    retv = block(retv, block_arg)
+    retv = shift iter
 
-    inc i
+  loop:
+    unless iter goto done
+    block_arg = shift iter
+    block_res = oper(retv, block_arg)
     goto loop
 
   empty:
@@ -589,25 +572,17 @@ Checks to see if the specified index or indices have been assigned to.  Returns
 .sub first :method
     .param pmc test
     .local pmc retv
-    .local pmc block
+    .local pmc iter
     .local pmc block_res
     .local pmc block_arg
-    .local int narg
-    .local int i
 
-    narg = self.'elems'()
-    i = 0
+    iter = new 'Iterator', self
 
   loop:
-    if i == narg goto nomatch
-    block_arg = self[i]
-
-    newclosure block, test
-    block_res = block(block_arg)
-
+    unless iter goto nomatch
+    block_arg = shift iter
+    block_res = test(block_arg)
     if block_res goto matched
-
-    inc i
     goto loop
 
   matched:
@@ -626,6 +601,8 @@ Checks to see if the specified index or indices have been assigned to.  Returns
 
 =cut
 
+# TODO Rewrite it. It's too naive.
+
 .sub uniq :method
     .local pmc ulist
     .local pmc key

@p6rt
Copy link
Author

p6rt commented May 28, 2008

From @pmichaud

Applied in r27872, thanks!

Pm

@p6rt
Copy link
Author

p6rt commented May 28, 2008

@pmichaud - Status changed from 'new' to 'resolved'

@p6rt p6rt closed this as completed May 28, 2008
@p6rt p6rt added the patch label Jan 5, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant