call

From Kolmafia
Revision as of 06:52, 23 February 2021 by Philmasterplus (talk | contribs) (Highlight the callbacks themselves, which should make the explanation more intuitive)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Syntax: call [type] <identifier>( param, ... );

type is an optional parameter which must match the return value of the function. If not specified, type defaults to void.

For instance, the following ASH code:

 1 int foo( int a, int b ) {
 2    return a + b;
 3 }
 4 
 5 String a = "foo";
 6 float c = call float a( 2, 3 );
 7 print( "c = " + c );
 8 
 9 a = "print";
10 call a( "print 1" );
11 print( "done" );

will output the following to the CLI:

c = 5.0
print 1
done

Scope

call can only execute functions that are visible in the scope of the call statement.

For example, executing the following ASH code will result in an error, because the func_inside_bar() function is not visible from within foo():

 1 void foo( string callback ) {
 2    // foo() cannot see func_inside_bar()
 3    call void callback( 123 );
 4 }
 5 
 6 void bar() {
 7    void func_inside_bar( int arg ) {
 8       print( arg );
 9    }
10    foo( "func_inside_bar" );
11 }
12 
13 bar(); // Error: Function 'func_inside_bar( int )' undefined.

However, the following code will run successfully:

 1 void foo( string callback ) {
 2    void func_inside_foo( int arg ) {
 3       print( arg );
 4    }
 5    call void callback( 123 );
 6 }
 7 
 8 void bar() {
 9    // Although bar() cannot see func_inside_foo(),
10    // it can still pass its name to foo()
11    foo( "func_inside_foo" );
12 }
13 
14 bar(); // Prints "123"