什么是另一种语言的Cobol 88型等效物?

GBF*_*iel 4 cobol cross-language

我现在正在学习COBOL并且非常喜欢88类型的变量,我想知道是否有其他语言(大多数已知语言,如C,Objective-C),甚至使用库.

我唯一能想到的就是使用

#define booleanResult (variableName==95) 
Run Code Online (Sandbox Code Playgroud)

但它不是可以设置boolenResulttruevariableName承担95为值.

Bil*_*ger 10

05  nicely-named-data             PIC X.
    88  a-meangingful-condition   VALUE "A".
    88  another-meaingingful-condition 
                                  VALUE "A" "B" 
                                     "X" THRU "Z" 
                                      SPACE ZERO.

IF a-meaningful-condition
IF another-meaningful-condition
SET a-meaningful-condition TO TRUE
SET another-meaningful-condition 
                           TO TRUE
Run Code Online (Sandbox Code Playgroud)

IFs测试与88(条件名称)相关联的数据名称(条件变量)引用的值,对于单个值或多个值之一,可以包括范围(THRU)和图形常量(ZERO,空间,低价值等).

SET,这种形式是1985年标准中对COBOL的最新添加,将把数据名的值更改为88上指定第一个值,这样如果你在测试中立即引用了88,测试是真的.

COBOL在解析为0或1或其他任何东西的意义上都没有布尔值,这是假的/真的.

任何支持对象的语言都可以用来模仿行为.也许你甚至没有真正意识到它已经完成了它.

正如NealB在评论中指出的那样,可以使用函数(或程序,或将控制权转移到另一个模块),但数据和对它的引用不会在一起并且防止意外恶作剧.

COBOL在定义数据结构方面具有很大的灵活性.88级是对维护和理解程序以及首先编写程序的有力帮助.

我不知道另一种语言有直接和自然的元素,相当于这个,但是有很多我不知道的语言.

同样,NealB在关于使用THRU/THROUGH指定一系列值的评论中提出了重要观点.

需要注意.虽然作者可能认为他们想要选择的数据可以用"010"THRU"090"范围表示,但他们可能没有意识到编译器所做的是通过生成代码来包含该范围内的每个可能值.大于或等于"010"且小于或等于"090".

如果使用THRU,请确保您的数据不能包含任何不期望的范围内的任何内容.如果你的意思是"010""020""030"......"090"这是好的,只要数据在其入口点得到验证,那么它就永远不会包含任何干预值.

典型的例子是大型机上的"A"THRU"Z".我们都知道作者的意思,但编译器从字面上理解它.您不能单独使用"A"THRU"Z"进行验证,因为在EBCDIC中,三组字母之间存在"间隙",使用"A"THRU"Z"会将这些间隙视为真实用于88.

如果某些COBOL编译器中的88级确实下降,则缺少"FALSE".

要从上面的例子中重用:

    88  a-meaingingful-condition  VALUE "A".
    88  a-meaingingful-condition-NOT 
                                  VALUE "N".
Run Code Online (Sandbox Code Playgroud)

要测试开关/标志,请使用第一个88.要关闭flag.switch,必须使用第二个.不理想.有关88定义的FALSE示例,请参阅以下链接之一.

在过去,设置标志/开关并使用MOVE语句重置.一旦涉及MOVE,您就会遇到与尝试使用函数时相同的问题.MOVE和88级VALUE之间没有约束关系.

这些天,SET可用于更改字段的值,打开或关闭标志/开关.

    05  FILLER PIC X.
        88  a-meaingingful-condition 
                                  VALUE "A".
        88  a-meaingingful-condition-NOT 
                                  VALUE "N".
Run Code Online (Sandbox Code Playgroud)

被测试的字段甚至不需要名称(可以是FILLER或省略(隐含的FILLER)).

当然,正如NealB在下面其中一个链接的评论中指出的那样,有人仍然可以通过对组项目进行引用修改的MOVE来到现场.所以...

01  FILLER.
    05  FILLER PIC X.
        88  a-meaingingful-condition 
                                  VALUE "A".
        88  a-meaingingful-condition-NOT 
                                  VALUE "N".
Run Code Online (Sandbox Code Playgroud)

现在他们甚至不能使用引用修改,因为没有要命名的字段.该字段的值只能来自定义中的VALUE子句,或者来自将88中的一个设置为TRUE的SET语句.

在该阶段,标志/开关具有的值,其实际值变得无关紧要.

01  FILLER.
    05  FILLER PIC X(7).
        88  a-meaingingful-condition 
                                  VALUE "APPLE".
        88  a-meaingingful-condition-NOT 
                                  VALUE "BICYCLE".
Run Code Online (Sandbox Code Playgroud)

因为没有任何东西可用于测试文字/数据名称,并且该字段不能是除SET之外的任何动词的目标,所以您不再需要检查所有包含N,或Y或0的字段,或者1,这样做,并且它们不是错误的情况,并且在这些字段中没有其他值.

我并不是建议使用APPLE和BICYCLE,只是用它们来说明问题.

88也可以有一个以十六进制表示法表示的值,就像任何字母数字字段一样:

    88  a-meaingingful-condition  VALUE X"25".
Run Code Online (Sandbox Code Playgroud)

也可以在组项上指定88,通常使用比喻常量作为值:

01  a-group-item.
    88  no-more-data-for-matching VALUE HIGH-VALUES.
    05  major-key                 PIC X(10).
    05  minor-key                 PIC X(5).
Run Code Online (Sandbox Code Playgroud)

在文件匹配过程中,可以在文件结尾处将密钥设置为高值,并且使用密钥仍将导致其他文件正确处理(密钥低于此文件) .

以下是SO的一些问题的链接,这些问题直接或与重要方面相关,涉及88个级别.

COBOL等级88数据类型

cobol中的组变量

在Cobol中,为了测试"null或empty",我们使用"NOT = SPACE [AND/OR] LOW-VALUE"?这是什么?

"NO"的前缀在COBOL变量中是否有任何特殊含义?

大写字母的COBOL数据验证?

  • 在88级使用"THRU"时要小心.它可能比你想要的更多.例如:''''THRU'Z'`在使用EBCDIC字符集时还包括`}`和`\\`以及一些你可能不想要的不可打印的字符. (2认同)
  • **任何支持对象的语言都可以用来模仿行为** - 任何支持带有副作用的*函数*的语言都可以模仿这种行为(这将是一个很大的数字).COBOL的"美"在于它是语言定义中定义明确的部分,不需要任何用户编写的代码来实现(声明除外).我不知道任何其他语言具有此内置功能. (2认同)