Credits Overview Plotting Styles Commands Terminals

function blocks

The function command signals the definition of a here-document containing a named block of gnuplot code that can be called as a function. As with data blocks, the name of a function block must begin with a '$'. Up to nine named parameters may be specified as part of the definition. These names may be used inside the function block as local variables. See local and scope.

Once the function block is defined, you can invoke it by name anywhere that a normal function could be used.

Example:

     function $sinc(arg) << EOF
         if (arg == 0) { return 1.0 }
         return sin(arg) / arg
     EOF
     gnuplot> plot $sinc(x) with lines title "sinc(x) as a function block"

It is not necessary to specify a list of named arguments to a function block at the time it is declared. Arguments to the function passed from the command line can be also be accessed from inside the function block as ARGV[1] etc, as they would be for a call command. See ARGV. This allows defining a function block that can operate on a variable number of arguments.

Example:

     function $max << EOF
         local max = real("-Inf")
         if (ARGC == 0) { return NaN }
         do for [i=1:ARGC] {
             if (max < ARGV[i]) {
                 max = ARGV[i]
             }
         }
         return max
     EOF
     gnuplot> foo = $max( f(A), 2.0, C, Array[3] )
     gnuplot> baz = $max( foo, 100. )

The primary motivation for function block support is to allow definition of complicated functions directly in gnuplot. Execution is of course slower than if the same function were coded directly in C or Fortran, but this is acceptable for many purposes. If execution speed matters then the function can be implemented later as a plugin instead (see plugins).

A non-trivial example of using function blocks to implement and plot a 15-term Lancosz approximation for the complex lngamma function is provided in the demo collection as function_block.dem The function block implementation is slower by a factor of roughly 25 compared to the built-in lnGamma function using the same algorithm coded directly in C. Nevertheless it is still fast enough for 3D interactive rotation.

Use of function blocks is EXPERIMENTAL. Details may change before inclusion in a release version.