您可以使用内部函数来包装您的函数,例如
program main
use abstract
use fns
implicit none
procedure(dp_func), pointer :: p
double precision :: x, myA, myB, y
x = 1.0D0
myA = 1.D2
myB = 1.D1
p => g
y=p(x)
p => f2
y = p(x) ! Calls f(1.D2, 1.D1, x)
myA = 1.D3
myB = 1.D2
y = p(x) ! Calls f(1.D3, 1.D2, x)
contains
double precision function f2(x)
double precision, intent(in) :: x
write(*,*) myA, myB
f2 = f(myA,myB,x)
end function
end program main
给定作用域中的内部函数可以使用该作用域中的变量,因此它们可以像闭包一样起作用。
隐式使用myA
and myB
在内部函数中f2
很可能是编程错误的根源,但是,只要范围f2
仍在范围内,此行为与lambda
其他语言中的函数,例如等效的 python lambda:
f2 = lambda x: f(myA,myB,x)
正如 @vladimirF 所指出的,一旦范围f2
超出范围(例如,如果指向f2
被存储并且过程在哪里f2
被声明返回)任何指向f2
将会失效。这可以在这段代码中看到:
module bad
use abstract
use fns
implicit none
contains
function bad_pointer() result(output)
procedure(dp_func), pointer :: output
double precision :: myA,myB
myA = 1.D2
myB = 1.D1
output => f2
contains
double precision function f2(x)
double precision, intent(in) :: x
write(*,*) myA, myB
f2 = f(myA,myB,x)
end function
end function
end module
program main
use abstract
use fns
use bad
implicit none
procedure(dp_func), pointer :: p
double precision :: y,x
p => bad_pointer()
x = 1.D0
y = p(x)
end program
注意:对于这个简单的情况,上面的代码可能运行良好,但它依赖于未定义的行为,因此不应使用。