Fortran中的关联链?

问题描述

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