String Invocation

In Verge there is a function called CallFunction which allows you call a function by a string of its name at runtime.

As of Verge 3.1 there is a newer, more convenient way to perform function calls from just a string. This new syntax is termed as string invocation or string-calling. (For the curious: It is essentially syntax sugar for CallFunction, but it is a change that makes Verge code appear cleaner and more expressive.)

Here is an example.

void MyFunc()
{
	Log("You called me!");
}

void AutoExec()
{
	string s = "MyFunc";
	s(); // String invocation, which will call the function MyFunc
}

This may be done with any string expression.

void MyFunc()
{
	Log("You called me!");
}

void AutoExec()
{
	"MyFunc"(); // A literal string.
	"My" + "Func"(); // A combined expression

	int dict = DictNew();
	DictSetString(dict, "fun", "MyFunc");
	DictGetString(dict, "fun")(); // A function call that returns a string.
}

String-calls can pass arguments to a function.

void MyNumberFunc(int a)
{
	Log("You called me and passed in a = " + str(a));
}

void AutoExec()
{
	"MyNumberFunc"(5);

	string s = "MyNumberFunc";
	s(42);
}

A string-call must pass all required arguments of a function, or you will get a runtime error.

void MyNumberFunc(int a)
{
	Log("You called me and passed in a = " + str(a));
}

void AutoExec()
{
	"MyFunc"(); // RUNTIME ERROR. Doesn't supply all required arguments!
}

However, it is possible to pass more than the required amount of arguments without issues (it'll simply ignore the extra arguments)

void MyNumberFunc(int a)
{
	Log("You called me and passed in a = " + str(a));
}

void AutoExec()
{
	"MyNumberFunc"(42, "Whatever");
}
But if the function being invoked is a variadic function, it will gather all excess arguments and pass them to the varargs parameter.
void PrintSumOfNumbers(... args)
{
	int i, sum;
	for(i = 0; args.length; i++)
	{
		if(args.is_int[i])
		{
			sum += args.int[i];
		}
	}
	Log("Sum is " + str(sum));
}

void AutoExec()
{
	string func = "PrintSumOfNumbers";
	func(3, 4, 5, 10, 200);
}

There are limitations though. The string-call statement is treated as void. This means that whatever function is being called will not give a return-value. This in turn, means a string-call cannot appear on the right-hand side of an assignment, or anywhere a string/int expression is expected.

int MyFuncWithReturnValue()
{
	return 42;
}

void AutoExec()
{
	int a = "MyFuncWithReturnValue"(); // ERROR. Does not compile.
	string a = str("MyFuncWithReturnValue"()); // ERROR. Does not compile.
	
	"MyFuncWithReturnValue"(); // Works. but no return value caught, obviously.
}

Despite limitations though, using the string-calling syntax, you can make powerful callback handlers for your scripts, allowing a great degree of abstraction and flexibility.

Talkback

There are no talkbacks on this documentation page yet. Post the first?

Post a new comment?

Doc Nav

Your docs
View All Docs

If you log in, you can edit the documentation, or create your own documents and tutorials!

Ben McGraw's lovingly crafted this website from scratch for years.
It's a lot prettier this go around because of Jon Wofford.
Verge-rpg.com is a member of the lunarnet irc network, and would like to take this opportunity to remind you that regardless how babies taste, it is wrong to eat them.