Difference between revisions of "User Defined Function"

852 bytes added ,  04:31, 19 September 2014
expanded
imported>Odessa
m (+cat)
imported>Odessa
(expanded)
Line 2: Line 2:
User defined functions (UDF) are added by NVSE V4. They must be saved as 'object' type scripts that must use the "Function" block type only. Although 'object' type, they must not be attached to any object and are instead called directly by script name from within other scripts, using the [[Call]] command.  
User defined functions (UDF) are added by NVSE V4. They must be saved as 'object' type scripts that must use the "Function" block type only. Although 'object' type, they must not be attached to any object and are instead called directly by script name from within other scripts, using the [[Call]] command.  


UDFs may optionally return a single value of any type, using the [[SetFunctionValue]] command within them. They may optionally accept one or more arguments of any type, which are defined within curly braces:
UDFs may optionally return a single value of any type, using the [[SetFunctionValue]] command within them. They may optionally accept up to 15 arguments of any type, which are defined within curly braces:
<pre>
<pre>
scn SomeUDF
scn SomeUDF
Line 30: Line 30:
</pre>
</pre>


==Example==
==Examples==
<pre>
scn GetRandomForm
 
; *** This script accepts a form list and returns one random form from it
 
; local variables
int iCount
int iChoice
ref RandomForm
 
; arguments
ref rFormList
 
Begin Function { rFormList }
 
    let iCount := ListGetCount rFormList
    let iChoice := Rand 0, iCount
    let RandomForm := ListGetNthForm rFormList, iChoice
   
    SetFunctionValue RandomForm
 
End
</pre>
 
<pre>
<pre>
scn fnShuffle
scn fnShuffle
Line 77: Line 101:
End
End
</pre>
</pre>
==Accepting any type arguments (advanced)==
In some contexts, it is useful to allow arguments of any type for a UDF. Since [[Array Variable|array]] elements can be any type, this can be conveniently achieved using the [[NVSE Expressions]], <b>*</b> ('box') and <b>&</b> ('unbox'), and the [[TypeOf]] / [[GetType]] functions.
<pre>
scn MyUDF
array_var AnyTypeArgument
Begin Function { AnyTypeArgument }
    if eval (TypeOf *AnyTypeArgument) == "form"
        ...
End
</pre>
<pre>
ref MyRef
int MyInt
call MyUDF &MyRef
call MyUDF &MyInt
</pre>
==Notes==
==Notes==
*UDFs may be used recursively by saving the script once first without the sub call.
*UDFs may be used recursively by saving the script once first without the sub call.
*This article is a simple overview, seek external documentation for further information.


==See Also==
==See Also==
Anonymous user