2

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, 2*a, 3*a])
    PRINT *, a
    PRINT *, b
  END ASSOCIATE
END PROGRAM toyexample

Fortran 中是否有任何功能允许我这样做?

4

1 回答 1

1
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 *, a, b, c ! All compilers print: 22 33 22
    end block
    block; integer, parameter :: a = 2, b(*) = ([a, 2*a, 3*a]) ! PGfortran crash
        print *, a, b(:) ! All compilers print 2 2 4 6
    end block
end program toyexample1
于 2021-03-10T15:22:43.360 回答