[COLOR=#a020f0]module[/color] funcs
[COLOR=#2e8b57][b]implicit[/b][/color] [COLOR=#2e8b57][b]none[/b][/color]
[COLOR=#a020f0]contains[/color]
[COLOR=#2e8b57][b] real[/b][/color] [COLOR=#a020f0]function[/color] func(x)
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]intent[/b][/color]([COLOR=#2e8b57][b]in[/b][/color]) :: x
func [COLOR=#804040][b]=[/b][/color] x[COLOR=#804040][b]*[/b][/color]x
[COLOR=#a020f0]end function[/color] func
[COLOR=#a020f0]function[/color] dfunc1(v)
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]dimension[/b][/color]([COLOR=#ff00ff]2[/color]), [COLOR=#2e8b57][b]intent[/b][/color]([COLOR=#2e8b57][b]in[/b][/color]) :: v
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]dimension[/b][/color]([COLOR=#ff00ff]2[/color]) :: dfunc1
[COLOR=#0000ff]! return[/color]
dfunc1([COLOR=#ff00ff]1[/color]) [COLOR=#804040][b]=[/b][/color] v([COLOR=#ff00ff]1[/color])
dfunc1([COLOR=#ff00ff]2[/color]) [COLOR=#804040][b]=[/b][/color] v([COLOR=#ff00ff]2[/color])
[COLOR=#a020f0]end function[/color] dfunc1
[COLOR=#a020f0]function[/color] dfunc2(v)
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]dimension[/b][/color]([COLOR=#ff00ff]2[/color]), [COLOR=#2e8b57][b]intent[/b][/color]([COLOR=#2e8b57][b]in[/b][/color]) :: v
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]dimension[/b][/color]([COLOR=#ff00ff]2[/color]) :: dfunc2
[COLOR=#0000ff]! return[/color]
dfunc2([COLOR=#ff00ff]1[/color]) [COLOR=#804040][b]=[/b][/color] v([COLOR=#ff00ff]1[/color]) [COLOR=#804040][b]+[/b][/color] v([COLOR=#ff00ff]2[/color])
dfunc2([COLOR=#ff00ff]2[/color]) [COLOR=#804040][b]=[/b][/color] v([COLOR=#ff00ff]1[/color]) [COLOR=#804040][b]-[/b][/color] v([COLOR=#ff00ff]2[/color])
[COLOR=#a020f0]end function[/color] dfunc2
[COLOR=#a020f0]end module[/color] funcs
[COLOR=#a020f0]module[/color] mult
[COLOR=#2e8b57][b]implicit[/b][/color] [COLOR=#2e8b57][b]none[/b][/color]
[COLOR=#a020f0]contains[/color]
[COLOR=#2e8b57][b] real[/b][/color] [COLOR=#a020f0]function[/color] my_function(func, dfunc, x, v)
[COLOR=#2e8b57][b] real[/b][/color] :: func
[COLOR=#0000ff]! for the vector function we need this interface [/color]
[COLOR=#a020f0]interface[/color]
[COLOR=#a020f0]function[/color] dfunc(v)
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]dimension[/b][/color]([COLOR=#ff00ff]2[/color]), [COLOR=#2e8b57][b]intent[/b][/color]([COLOR=#2e8b57][b]in[/b][/color]) :: v
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]dimension[/b][/color]([COLOR=#ff00ff]2[/color]) :: dfunc
[COLOR=#a020f0]end function[/color] dfunc
[COLOR=#a020f0]end interface[/color]
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]intent[/b][/color]([COLOR=#2e8b57][b]in[/b][/color]) :: x
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]dimension[/b][/color]([COLOR=#ff00ff]2[/color]), [COLOR=#2e8b57][b]intent[/b][/color]([COLOR=#2e8b57][b]in[/b][/color]) :: v
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]dimension[/b][/color]([COLOR=#ff00ff]2[/color]) :: reslt, bar
reslt [COLOR=#804040][b]=[/b][/color] dfunc(v)
my_function [COLOR=#804040][b]=[/b][/color] func(x) [COLOR=#804040][b]+[/b][/color] reslt([COLOR=#ff00ff]1[/color]) [COLOR=#804040][b]+[/b][/color] reslt([COLOR=#ff00ff]2[/color])
[COLOR=#a020f0]endfunction[/color] my_function
[COLOR=#a020f0]end module[/color] mult
[COLOR=#a020f0]program[/color] funcargs
[COLOR=#a020f0]use[/color] funcs
[COLOR=#a020f0]use[/color] mult
[COLOR=#2e8b57][b]implicit[/b][/color] [COLOR=#2e8b57][b]none[/b][/color]
[COLOR=#2e8b57][b] real[/b][/color] :: x
[COLOR=#2e8b57][b] real[/b][/color], [COLOR=#2e8b57][b]dimension[/b][/color]([COLOR=#ff00ff]2[/color]) :: v
x [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]2[/color]
v [COLOR=#804040][b]=[/b][/color] ([COLOR=#804040][b]/[/b][/color][COLOR=#ff00ff]3[/color], [COLOR=#ff00ff]4[/color][COLOR=#804040][b]/[/b][/color])
[COLOR=#0000ff]! This should deliver 2*2 + 3 + 4 = 4 + 3 + 4 = 11[/color]
[COLOR=#804040][b]write[/b][/color] ([COLOR=#804040][b]*[/b][/color], [COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'my_function(func, dfunc1, 2, (3,4)) = '[/color], [highlight #ffff00][COLOR=#0000ff]&[/color][/highlight]
my_function(func, dfunc1, x, v)
[COLOR=#0000ff]! This should deliver 2*2 + (3 + 4) + (3 - 4) = 4 + 7 - 1 = 10[/color]
[COLOR=#804040][b]write[/b][/color] ([COLOR=#804040][b]*[/b][/color], [COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'my_function(func, dfunc2, 2, (3,4)) = '[/color], [highlight #ffff00][COLOR=#0000ff]&[/color][/highlight]
my_function(func, dfunc2, x, v)
[COLOR=#a020f0]end program[/color] funcargs