...
Block based syntax
| Code Block |
|---|
import System.Windows.Forms
button = Button(Text: "Click me")
button.Click += def ():
print("$button was clicked!")
print("and yes, this is just like any other block...")
|
Braces based
| Code Block |
|---|
import System.Windows.Forms
button1 = Button(Text: "Click me", Click: { print "clicked!" })
button2 = Button(Text: "Me too!")
button2.Click += { print "$button2 was clicked!";
print "whitespace is ignored inside {}...";
print "that's why you need to use semicolons to include multiple statements...";
print "but please, don't write code like this just because you can :)"
}
|
...
Boo closures have have full access (to read and write) to their enclosing lexical environment. For Instance:
| Code Block |
|---|
a = 0 # declare a new variable
getter = { return a }
setter = { value | a = value }
assert 0 == getter()
setter(42)
assert 42 == getter()
assert 42 == a
|
...
This will not work because "c" is unknown from inside the closure:
| Code Block |
|---|
c = do(x as int):
print x
--x
c(x) if x > 0
c(5)
|
so you can use a regular named function or else create a 2nd callable to hold the name:
| Code Block |
|---|
def c(x as int):
print x
--x
c(x) if x > 0
c(5)
//or:
d as callable
c = do(x as int):
print x
--x
d(x) if x > 0
d = c
c(5)
|
And you can use regular named functions to overload a method:
| Code Block |
|---|
def doit(x as int):
print x
def doit(x as string):
print x
doit(3)
|
...
