69 lines
1.4 KiB
Plaintext
69 lines
1.4 KiB
Plaintext
REBOL [
|
|
Title: "Flow Control"
|
|
URL: http://rosettacode.org/wiki/Flow_Control_Structures
|
|
]
|
|
|
|
; return -- Return early from function (normally, functions return
|
|
; result of last evaluation).
|
|
|
|
hatefive: func [
|
|
"Prints value unless it's the number 5."
|
|
value "Value to print."
|
|
][
|
|
if value = 5 [return "I hate five!"]
|
|
print value
|
|
]
|
|
|
|
print "Function hatefive, with various values:"
|
|
hatefive 99
|
|
hatefive 13
|
|
hatefive 5
|
|
hatefive 3
|
|
|
|
; break -- Break out of current loop.
|
|
|
|
print [crlf "Loop to 10, but break out at five:"]
|
|
repeat i 10 [
|
|
if i = 5 [break]
|
|
print i
|
|
]
|
|
|
|
; catch/throw -- throw breaks out of a code block to enclosing catch.
|
|
|
|
print [crlf "Start to print two lines, but throw out after the first:"]
|
|
catch [
|
|
print "First"
|
|
throw "I'm done!"
|
|
print "Second"
|
|
]
|
|
|
|
; Using named catch blocks, you can select which catcher you want when throwing.
|
|
|
|
print [crlf "Throw from inner code block, caught by outer:"]
|
|
catch/name [
|
|
print "Outer catch block."
|
|
catch/name [
|
|
print "Inner catch block."
|
|
throw/name "I'm done!" 'Johnson
|
|
print "We never get here."
|
|
] 'Clemens
|
|
print "We never get here, either."
|
|
] 'Johnson
|
|
|
|
; try
|
|
|
|
div: func [
|
|
"Divide first number by second."
|
|
a b
|
|
/local r "Result"
|
|
][
|
|
if error? try [r: a / b] [r: "Error!"]
|
|
r ; Functions return last value evaluated.
|
|
]
|
|
|
|
print [crlf "Report error on bad division:"]
|
|
print div 10 4
|
|
print div 10 2
|
|
print div 10 1
|
|
print div 10 0
|