微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Fortran中的关联链?

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。