Up to Main Index Up to Journal for August, 2022 JOURNAL FOR WEDNESDAY 31ST AUGUST, 2022 ______________________________________________________________________________ SUBJECT: Arrays and bubble sorts DATE: Wed 31 Aug 21:31:37 BST 2022 Since launching Mere and Mere ICE[1] the response has been quite positive. One person wanted to know why I was pissing away my time f***ing around with Mere and not working on WolfMUD. Well it’s my time, you hand me a contact, we settle on a fee, then I’ll spend time how you want it spent, on your dime :| In the meantime, I’ve been f***ing around with Mere some more :) Mostly I’ve been adding array handling. I’ve started small and implemented int arrays: x:int[] ;// define x as an int array x = int[] 3 4 5 ;// add initial three elements x = int[] x 6 ;// append an element x = int[] 2 x ;// prepend an element x = int[] 1 x 7 ;// append and prepend println x ;// prints [1 2 3 4 5 6 7] y:int[] = x ;// duplicate array x as array y delete x 3 3 ;// delete 3 elements starting at element 3 delete x 2 ;// delete element 2 delete x ;// delete all elements and clear array // Pick a random small prime... x:int = int[] ( 2 3 5 7 11 13 17 19 23 29 ) [ rnd ( 10 ) - 1 ] // Array splicing... z:int[] = int[] 1 2 3 4 5 6 z = int[] ( ( delete int[] ( z ) 2 4 ) 9 9 9 ( delete int[] ( z ) 0 4 ) ) println z ;// prints [1 2 9 9 9 5 6] The first two lines can be combined, as in the array splicing, but the above wouldn’t look so nice ;) x:int[] = int[] 3 4 5 As for the array splicing, all I can say is that it works. Butt ugly and needs sorting out. In case you are wondering the ‘int[] ( z )’ creates an anonymous array from z. I’ve update all the operators and built-ins to work with int arrays. As part of my testing I wrote this little ditty: # A mere bubble sort... maxN:int = 15 ; // numer of ints to sort s:int[] ; // array to be sorted // fill array with random ints f:int fill: s = int[] s rnd maxN * 10 if f ++ < maxN; goto fill println " In: " s // some additional initialisation swap:bool x:int l:int = len ( s ) - 1 end:int start:int = time // main bubble sort swapped: x = 0 l-- swap = false xloop: if s [ x ] <= s [ x + 1 ]; goto next s [ x ] += s [ x + 1 ] s [ x + 1 ] = s [ x ] - s [ x + 1 ] s [ x ] -= s [ x + 1 ] swap = true next: if x ++ < l; goto xloop if swap; goto swapped end = time println ( "Out: " s " " ( end - start ) "μs" ) Running it a few times produces: >mere bubble In: [51 31 51 3 133 44 132 149 14 92 71 93 61 145 107] Out: [3 14 31 44 51 51 61 71 92 93 107 132 133 145 149] 103μs >mere bubble In: [72 71 138 14 17 26 140 59 98 43 127 120 136 137 138] Out: [14 17 26 43 59 71 72 98 120 127 136 137 138 138 140] 150μs >mere bubble In: [137 61 135 122 51 89 132 46 137 36 132 133 106 144 34] Out: [34 36 46 51 61 89 106 122 132 132 133 135 137 137 144] 166μs >mere bubble In: [94 109 126 32 6 44 128 8 99 10 113 78 81 78 22] Out: [6 8 10 22 32 44 78 78 81 94 99 109 113 126 128] 275μs >mere bubble In: [134 127 73 35 116 14 144 92 72 40 116 104 143 141 150] Out: [14 35 40 72 73 92 104 116 116 127 134 141 143 144 150] 223μs > Not too shabby, 103-275μs. I’ve not updated Mere ICE yet as I’m still testing and sorting out a few odd corner cases. Then I need to add float, string and bool arrays. After that I need to add the uint, rune and byte types and their arrays. Then do it all over again to add associative arrays / maps :P There are also a few loose ends I want to tidy up. For example the return value of the *= /= %= += and -= operators are wrong. I can’t deicide if having them as expressions rather than statements is useful. Would anyone, apart from myself, even dare to write code such as: a = b += 2 a [ x ] = b += 2 if b += 2 > a I’ll update Mere ICE as soon as the int arrays are finished. -- Diddymus [1] ../../../annex Up to Main Index Up to Journal for August, 2022