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
Labels
Comments
From @bacekHello There is refactored version of List's grep, reduce, first methods. Changes: -- |
From @baceklist.diffdiff --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
|
From @pmichaudApplied in r27872, thanks! Pm |
@pmichaud - Status changed from 'new' to 'resolved' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Migrated from rt.perl.org#54822 (status was 'resolved')
Searchable as RT54822$
The text was updated successfully, but these errors were encountered: