Difference between revisions of "Call"

From Kolmafia
Jump to navigation Jump to search
(Fix formatting, add Scope section)
(Highlight the callbacks themselves, which should make the explanation more intuitive)
 
Line 33: Line 33:
 
For example, executing the following ASH code will result in an error, because the <code>func_inside_bar()</code> function is not visible from within <code>foo()</code>:
 
For example, executing the following ASH code will result in an error, because the <code>func_inside_bar()</code> function is not visible from within <code>foo()</code>:
  
<syntaxhighlight lang="d" line highlight="3">
+
<syntaxhighlight lang="d" line highlight="7-9">
 
void foo( string callback ) {
 
void foo( string callback ) {
 
   // foo() cannot see func_inside_bar()
 
   // foo() cannot see func_inside_bar()
Line 51: Line 51:
 
However, the following code will run successfully:
 
However, the following code will run successfully:
  
<syntaxhighlight lang="d" line highlight="5">
+
<syntaxhighlight lang="d" line highlight="2-4">
 
void foo( string callback ) {
 
void foo( string callback ) {
 
   void func_inside_foo( int arg ) {
 
   void func_inside_foo( int arg ) {

Latest revision as of 06:52, 23 February 2021

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"