Groovy supports defining "functions" (technically methods). This is a good feature. But SexScripts is designed in such a way that method definitions are impossible. This is a very bad design. Based on the error, it sounds to me like the Groovy scripts are being executed in a place where methods can't be defined, or something (I'm not very familiar with Java).
Instead of functional programming, scripts usually tend to use an infinite loop made of a switch statement, which is indexed by a variable called "block" or something like that. This is a very crappy system, very difficult to program in a way that isn't redundant, highly inflexible, and easily resulting in spaghetti code. I can't describe how much I hate this programming style.
Just look at this example using functional programming:
Code:
def foo() {
instruction1()
instruction2()
instruction3()
instruction4()
instruction5()
instruction6()
instruction7()
instruction8()
}
def bar(x, y, z) {
instruction9()
instruction10(x)
instruction11()
instruction12()
instruction13()
instruction14(y)
instruction15(z)
instruction16()
instruction17()
}
if (myCondition == "value1") {
foo()
instruction18()
instruction19()
}
else if (myCondition == "value2") {
instruction20()
bar(1, 2, 3)
}
else if (myCondition == "value3") {
foo()
bar(4, 5, 6)
instruction21()
foo()
}
else {
instruction22()
}
And compare it to this awful mess:
Code:
def running = true
def block
def next_block
def x
def y
def z
if (myCondition == "value1") {
block = "block1"
}
else if (myCondition == "value2") {
block = "block2"
}
else if (myCondition == "value3") {
block = "block3"
}
else {
block = "block4"
}
while (running) {
switch block {
case "foo":
instruction1()
instruction2()
instruction3()
instruction4()
instruction5()
instruction6()
instruction7()
instruction8()
block = next_block
break
case "bar":
instruction9()
instruction10(x)
instruction11()
instruction12()
instruction13()
instruction14(y)
instruction15(z)
instruction16()
instruction17()
block = next_block
break
case "block1":
block = "foo"
next_block = "block1_2"
break
case "block1_2":
instruction18()
instruction19()
block = "end"
break
case "block2":
instruction20()
x = 1
y = 2
z = 3
block = "bar"
next_block = "end"
break
case "block3":
block = "foo"
next_block = "block3_2"
break
case "block3_2":
x = 4
y = 5
z = 6
block = "bar"
next_block = "block3_3"
break
case "block3_3":
instruction21()
block = "foo"
next_block = "end"
break
case "block4":
instruction22()
block = "end"
break
case "end":
default:
running = false
break
}
}
This example is actually pretty optimistic; in real applications, the number of special variables for these faux "functions" would increase dramatically, to the point where the reduction of redundancy doesn't seem worth it. So you're more likely to end up with results like this, using a larger number of simpler macros:
Code:
def running = true
def block
def next_block
if (myCondition == "value1") {
block = "block1"
}
else if (myCondition == "value2") {
block = "block2"
}
else if (myCondition == "value3") {
block = "block3"
}
else {
block = "block4"
}
while (running) {
switch block {
case "foo":
instruction1()
instruction2()
instruction3()
instruction4()
instruction5()
instruction6()
instruction7()
instruction8()
block = next_block
break
case "bar1":
instruction11()
instruction12()
instruction13()
block = next_block
break
case "bar2":
instruction16()
instruction17()
block = next_block
break
case "block1":
block = "foo"
next_block = "block1_2"
break
case "block1_2":
instruction18()
instruction19()
block = "end"
break
case "block2":
instruction20()
instruction9()
instruction10(1)
block = "bar1"
next_block = "block2_2"
break
case "block2_2":
instruction14(2)
instruction15(3)
block = "bar2"
next_block = "end"
break
case "block3":
block = "foo"
next_block = "block3_2"
break
case "block3_2":
instruction9()
instruction10(4)
block = "bar1"
next_block = "block3_3"
break
case "block3_3":
instruction14(5)
instruction15(6)
block = "bar2"
next_block = "block3_4"
break
case "block3_4":
instruction21()
block = "foo"
next_block = "end"
break
case "block4":
instruction22()
block = "end"
break
case "end":
default:
running = false
break
}
}
I'm not speaking from speculation here, just to be clear. I have been frustrated the past couple of days trying to code just one complex script with some sanity. This is not fun programming. If I didn't have a strong personal desire for what I'm scripting, I would have given up as soon as I found out that I can't use functions.
Please, please, please fix this problem so I and probably other programmers can have our sanity back. (I would fix it myself, but I'm not very experienced in Java and wouldn't know where to look.)