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

Reply via email to