规范表达式

规范表达式是具有限制的表达式,可用于指定字符长度和数组边界等项。

规范表达式是标量、整数、受限表达式。

受限表达式是一个表达式,其中每个操作都是内在的,每个主项是:
  • 定义的派生类型的类型参数。
  • 常量或常量的子对象。
  • 作为哑参数的变量,既没有 OPTIONAL 也没有 INTENT(OUT) 属性,也没有此类变量的子对象。
  • 在公共块中的变量,或此类变量的子对象。
  • 可通过用法关联或主机关联访问的变量,或此类变量的子对象。
  • 一个数组构造函数,其中每个元素以及每个隐式-DO 的界限和步长都是其主项为受限表达式或隐式-DO 变量的表达式。
  • 结构构造函数,其中每个组件都是受限表达式。
  • 规范查询,其中每个指示符或函数自变量是受限表达式或具有未假定,延迟或由非受限表达式定义的属性的变量。
  • 对本文档中定义的任何剩余内在函数的引用,其中每个参数都是受限表达式。
  • IBM 扩展开始对系统查询函数的引用,其中任何自变量都是受限表达式。 IBM 扩展结束
  • 任何下标或子串表达式都必须是受限表达式。
  • 对规范函数的引用,其中任何参数都是受限表达式。
规范查询 是对以下项的引用:
  • 内部查询函数
  • 一种类型参数查询
  • IEEE 查询函数

您可以在规范表达式中使用规范函数。 如果函数是纯函数,而不是内在函数、内部函数或语句函数,则该函数是规范函数。 规范函数不能具有哑过程参数。

规范表达式中的变量必须具有其类型和类型参数(如果有),由同一作用域限定单元中的先前声明指定,或由对作用域限定单元有效的隐式类型规则指定,或由主机关联或用法关联来指定。 如果规范表达式中的变量是由隐式类型推导规则进行类型推导,那么其在任何后续类型声明语句中的出现都必须确认隐式类型和类型参数。

如果规范表达式包括对同一规范部分中指定的实体的类型参数或数组边界的查询函数的引用,则必须在规范部分的先前规范中指定类型参数或数组边界。 如果规范表达式包含对同一规范部分中指定的数组元素值的引用,则必须在先前的声明中指定数组边界。 先前的规范可以在同一语句中查询函数的左侧。

示例

LBOUND(C,2)+6    ! C is an assumed-shape dummy array
ABS(I)*J         ! I and J are scalar integer variables
276/NN(4)        ! NN is accessible through host association
下面的例子展示了一个用户定义的纯函数 fact 是如何在一个数组值函数结果变量的规范表达式中使用的:
MODULE MOD
CONTAINS
  INTEGER PURE FUNCTION FACT(N)
  INTEGER, INTENT(IN) :: N
  ...
  END FUNCTION FACT
END MODULE MOD

PROGRAM P
  PRINT *, PERMUTE('ABCD')
  CONTAINS
  FUNCTION PERMUTE(ARG)
     USE MOD
     CHARACTER(*), INTENT(IN) :: ARG
     ...
     CHARACTER(LEN(ARG)) :: PERMUTE(FACT(LEN(ARG)))
     ...
  END FUNCTION PERMUTE
END PROGRAM P