Quantcast
Channel: Xojo Programming Forum - Latest topics
Viewing all articles
Browse latest Browse all 3798

Loop variants in Xojo

$
0
0

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.

6 posts - 3 participants

Read full topic


Viewing all articles
Browse latest Browse all 3798

Trending Articles