问题描述
ASSOCIATE
特性原则上非常有用,因为它允许为名称赋值,而不会产生显式定义局部变量的语法开销。但是,它的实用性是有限的,因为值仅在ASSOCIATE
语句之后 绑定。这很快导致需要嵌套关联语句,例如
PROGRAM toyexample
IMPLICIT NONE
ASSOCIATE(a => 2)
ASSOCIATE(b => [a,2*a,3*a])
PRINT *,a
PRINT *,b
END ASSOCIATE
END ASSOCIATE
END PROGRAM toyexample
在 Lisp 术语中,这将是 let
的行为,而我试图模仿 let*
的行为,这将允许我编写
PROGRAM toyexample
IMPLICIT NONE
ASSOCIATE(a => 2,b => [a,3*a])
PRINT *,a
PRINT *,b
END ASSOCIATE
END PROGRAM toyexample
Fortran 中是否有任何功能允许我执行此操作?
解决方法
program toyexample1
implicit none
integer,parameter :: a = 11
integer,parameter :: b = 22
integer,parameter :: c = 33
associate(a => b,b => c,c => a)
print *,a,b,c ! Intel Fortran print: 22 33 22,other 22 33 11
end associate
block; integer,parameter :: a = b,b = c,c = a ! NAG Fortran rejected
print *,c ! All compilers print: 22 33 22
end block
block; integer,parameter :: a = 2,b(*) = ([a,2*a,3*a]) ! PGfortran crash
print *,b(:) ! All compilers print 2 2 4 6
end block
end program toyexample1