Loop variants in Xojo

A blog post from me: Loop variants in Xojo

Recently a beginner asked about the differences between the loops and which too choose. Let’s compare the loops by using them to count up from a start to an end value.

The first loop is the FOR loop. It counts a variable up from a start value to the end value. If the start value is bigger than the end value, the loop is skipped entirely. Let us show you the sample code:

Sub testFor(First as Integer, Last as Integer)
	For i As Integer = First To Last
		Log "For "+i.ToString
	Next
End Sub

You are not limited to double, but you can use any data type you like, e.g. a double. Here we step by 0.3 instead of the default 1, so we count up from 1.0 to 2.8. After 2.8 comes 3.1 which is too big, so the loop exists.

Sub testForDouble(First as Integer, Last as Integer)
	For i As Double = First To Last Step 0.3
		Log "For "+i.ToString
	Next
End Sub

You can even define your own class for a numeric data type (or use one of our plugin classes) to do the count. Your class needs to implement Operator_Add for the step and Operator_Compare to the < comparison. The Operator_Convert is needed for an initial assignment. Here is a class wrapping an integer:

Class MyNumber
	Sub Constructor(v as integer)
		Val = v
	End Sub
	Function Operator_Add(value as Integer) As MyNumber
		// to do the +1 in the for loop
		Return New MyNumber(Val + value)
	End Function
	Function Operator_Compare(other as MyNumber) As integer
		If Me.Val < other.Val Then
			Return -1
		ElseIf Me.Val > other.Val Then
			Return 1
		Else
			Return 0
		End If
	End Function
	Sub Operator_Convert(value as integer)
		// for assignment of first value
		Val = value
	End Sub
	Function ToString() As string
		return val.ToString
	End Function
	Property val As Integer
End Class

And then the loop looks just like before, but now uses MyType as numeric variable:

Sub testForMyType(First as Integer, Last as Integer)
	For i As MyNumber = First To Last
		Log "For MyType "+i.ToString
	Next
End Sub

You can do the FOR loop with WHILE. The things translate part by part. The For i As Integer = First becomes Var i As Integer = First. The To Last becomes While i <= Last and the step part becomes the i = i + 1. Yes, please never forgot to change the variable used for the loop, because otherwise you have an endless loop. Here is the test function to do the same as above FOR loop as a WHILE loop:

Sub testWhile(First as Integer, Last as Integer)
	Var i As Integer = First
	While i <= Last
		Log "While "+i.ToString
		i = i + 1
	Wend
End Sub

The DO loop does the comparison on the end of the loop. So we have to make the first comparison ourself and only enter the loop if the condition matches. If First is bigger than Last, we skip the loop. So we have an implementation of the FOR loop with DO LOOP:

Sub testDo1(First as Integer, Last as Integer)
	Var i As Integer = First
	If First <= last Then
		Do
			Log "do1: "+i.ToString
			i = i + 1
		Loop Until i > Last
	End If
End Sub

Alternatively you can have the check on the beginning after the DO keyword. This makes it just like a WHILE loop, but with negated condition:

Sub testDo2(First as Integer, Last as Integer)
	Var i As Integer = First
	Do Until i > Last
		Log "do2: "+i.ToString
		i = i + 1
	Loop
End Sub

Without loops we can do the same with recursion. If another loop is needed, we let the function call itself. To make sure the check is done on the first call, we perform the check before we do anything else. Then we can run our statements and call the function to continue the loop:

Sub testRecurse(Value as Integer, Last as Integer)
	If value <= Last Then
		Log "Recursion "+value.ToString
		
		testRecurse value + 1, last
	end if
End Sub

You learnt something new? Let us know if you have questions for future blog posts.

5 Likes

Super Christian

You mistake “each”

Var dico As New Dictionary
Var tx As String

dico.Value ( 0 ) = "boujour"
dico.Value ( 1 ) = "aurevoir"
dico.Value ( 3) = "topette"

For Each de As DictionaryEntry In dico
  tx = de.Value
Next
2 Likes

Yes, this is only about for loop to count.
The article about for-each comes soon. It’s almost finished.

Excellent week end Christian

1 Like

There’s also the “Downto” loop that is useful for removing elements of an array that you are testing in the loop.

3 Likes

See For each loops in detail

2 Likes