XFUNC

Updated November 2017 (added Example)

XFUNC (Sbxname, arg1,...,argn)

XFUNC$ (Sbxname, arg1,...,argn)

XFUNC executes an external function, returning a value. It is similar to XCALL, in that it loads and calls an external function, except that it is an expression (which returns a value) rather than a statement (which does not). Sbxname is the name of an SBX subroutine which implements the function, and arg1 through argn are the arguments passed to the SBX routine. The only special requirement for the SBX routine is that it return a value—numeric for XFUNC and string for XFUNC$—via a special form of the RETURN statement.

Note that as with other system functions, XFUNC and XFUNC$() are expressions—not labels—and thus cannot be invoked with the CALL statement.

Example

Here's an example of an SBX to concatenate two strings that can be called via XCALL (returning the result in the 3rd parameter), or via XFUNC$ (returning the result as the value of the function):

map1 var1$,s,30,"  abra   "

map1 result$,s,50

 

    xcall CONCAT2,var1$,"  cadabra  ",result$

    ? "xcall result:  "; result$

 

    ? "xfunc$ result: "; xfunc$("CONCAT2", var1$,"  cadabra  ")

    end

 

Both the XCALL and the XFUNC$ statements above invoke the same CONCAT2.SBX routine, which, if written to handle both calling methods, will result in the same output for the two print statements above, i.e.

.RUN TSTCONCAT2

xcall result:  abracadabra

xfunc$ result: abracadabra

 

This sample program illustrates the use of the XPUTARG and RETURN (expr) statements to support both calling interfaces.

program CONCAT2, 1.0(100)  ! sbx to strip spaces and concatenate 2 strings

!------------------------------------------------------------------------

!NOTES

!   xcall CONCAT, arg1$, arg2$, result$

!or

!   xfunc$("CONCAT", arg1$, arg2$)  - returns result as value of function

!------------------------------------------------------------------------

 

++pragma SBX

 

map1 params

    map2 arg1$,s,0

    map2 arg2$,s,0

    map2 result$,s,0

   

    xgetargs arg1$, arg2$

    xcall TRIM, arg1$

    xcall TRIM, arg2$

    result$ = arg1$ + arg2$

    xputarg 3,result$           ! return result in 3rd param (if XCALL)

    return (result$)            ! in case called via XFUNC$

    end                         ! returns to XCALL caller

 

See Also

•   Call SBX as a Function

•   AG_XFUNC