Author: tene
Date: Sun Aug 10 22:02:40 2008
New Revision: 30163
Added:
trunk/languages/cardinal/t/classes/
trunk/languages/cardinal/t/classes/array.t
Removed:
trunk/languages/cardinal/t/05-array.t
Modified:
trunk/languages/cardinal/src/classes/Array.pir
Log:
[cardinal]
* Array.first
* Array.last
Modified: trunk/languages/cardinal/src/classes/Array.pir
==============================================================================
--- trunk/languages/cardinal/src/classes/Array.pir (original)
+++ trunk/languages/cardinal/src/classes/Array.pir Sun Aug 10 22:02:40 2008
@@ -527,42 +527,91 @@
=cut
-.sub first :method
- .param pmc test
- .local pmc retv
- .local pmc block
- .local pmc block_res
- .local pmc block_arg
- .local int narg
+.sub first :method :multi(CardinalArray,_)
+ .param int count
+ .local pmc newlist
+ .local pmc item
+ .local int elems
.local int i
- narg = elements self
+ newlist = new 'CardinalArray'
+
+ elems = elements self
+ le count, elems, sufficient_elements
+ count = elems
+ sufficient_elements:
+
i = 0
loop:
- if i == narg goto nomatch
- block_arg = self[i]
-
- newclosure block, test
- block_res = block(block_arg)
+ if i == count goto done
+ item = self[i]
+ item = clone item
- if block_res goto matched
+ push newlist, item
inc i
goto loop
+ done:
+ .return(newlist)
+.end
- matched:
- retv = block_arg
- goto done
+.sub first :method :multi(CardinalArray)
+ .local pmc item
+ $I0 = elements self
+ eq $I0, 0, empty
+ item = self[0]
+ .return (item)
+ empty:
+ item = new 'Undef'
+ .return (item)
+.end
- nomatch:
- retv = new 'Undef'
- goto done
+=item first(...)
+
+=cut
+.sub last :method :multi(CardinalArray,_)
+ .param int count
+ .local pmc newlist
+ .local pmc item
+ .local int elems
+ .local int i
+
+ newlist = new 'CardinalArray'
+
+ elems = elements self
+ count = elems - count
+ ge count, 0, sufficient_elements
+ count = 0
+ sufficient_elements:
+
+ i = elems - 1
+
+ loop:
+ lt i, count, done
+ item = self[i]
+ item = clone item
+
+ unshift newlist, item
+
+ dec i
+ goto loop
done:
- .return(retv)
+ .return(newlist)
.end
+.sub last :method :multi(CardinalArray)
+ .local pmc item
+ $I0 = elements self
+ eq $I0, 0, empty
+ dec $I0
+ item = self[$I0]
+ .return (item)
+ empty:
+ item = new 'Undef'
+ .return (item)
+.end
=item each(block)
Added: trunk/languages/cardinal/t/classes/array.t
==============================================================================
--- (empty file)
+++ trunk/languages/cardinal/t/classes/array.t Sun Aug 10 22:02:40 2008
@@ -0,0 +1,26 @@
+puts '1..10'
+
+def okay (n)
+ puts 'ok ', n
+end
+
+a = [ 1, 2, 3, 4 ]
+
+okay a.first
+okay a.first(2).last
+okay a.last(2).first
+okay a.elems
+
+a = [ 5, 6 ]
+
+a.each() do |i|
+ puts 'ok ', i
+end
+
+b = [ [ 7, 8 ], [ 9, 10 ] ]
+
+b.each() do |x|
+ x.each() do |y|
+ puts 'ok ', y
+ end
+end