【问题标题】:What is a Cobol 88-type equivalent in another languages?什么是其他语言中的 Cobol 88 类型等价物?
【发布时间】:2015-12-08 23:29:59
【问题描述】:

我现在正在学习 COBOL,真的很喜欢 88 类型的变量,我想知道在其他语言中是否有类似的东西(大多数已知的语言,如 C、Objective-C),即使使用图书馆。

我认为唯一相似的就是使用

#define booleanResult (variableName==95) 

但不可能将boolenResult 设置为true 并使variableName 假定95 作为值。

【问题讨论】:

    标签: cobol cross-language


    【解决方案1】:
    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
    

    IF 测试与 88(条件名称)关联的数据名称(条件变量)所引用的值,是否为单个值或多个值之一,可以包括范围 (THRU) 和比喻常数(零、空格、低值等)。

    SET 是 1985 年标准对 COBOL 的最新补充,将数据名称的值更改为 88 上指定的第一个值,因此如果您在测试中立即引用 88,则该测试为真。

    COBOL 没有布尔值,即解析为 0 或 1 或其他任何东西,即为假/真。

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

    正如 NealB 在 cmets 中指出的那样,可以使用函数(或过程,或将控制权转移到另一个模块),但数据和对它的引用不会在一起并且不会受到意外伤害。

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

    我不知道另一种语言具有与此等价的直接和自然元素,但是还有很多我不知道的语言。

    NealB 再次在 cmets 中提出了一个关于使用 THRU/THROUGH 指定值范围的重要观点。

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

    如果使用 THRU,请确保您的数据不能包含超出预期范围内的任何内容。如果您的意思是“010”“020”“030”...“090”,那很好,只要数据在其入口点得到验证,这样它就永远不会包含任何中间值。

    经典示例是大型机上的“A”到“Z”。我们都知道作者的意思,但编译器按字面意思理解。您不能单独使用“A”到“Z”进行验证,因为在 EBCDIC 中,三组字母之间存在“间隙”,使用“A”到“Z”会处理这些间隙使用 88 也是如此。

    某些 COBOL 编译器中的 88 级别确实下降的地方是缺少的“FALSE”。

    从上面的例子中重复使用:

        88  a-meaingingful-condition  VALUE "A".
        88  a-meaingingful-condition-NOT 
                                      VALUE "N".
    

    要测试开关/标志,您使用前 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".
    

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

    当然,正如 NealB 在对以下链接之一的评论中指出的那样,仍然可以通过对组项目使用引用修改来进行 MOVE。所以...

    01  FILLER.
        05  FILLER PIC X.
            88  a-meaingingful-condition 
                                      VALUE "A".
            88  a-meaingingful-condition-NOT 
                                      VALUE "N".
    

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

    在这个阶段,标志/开关的值,它的实际值,变得无关紧要。

    01  FILLER.
        05  FILLER PIC X(7).
            88  a-meaingingful-condition 
                                      VALUE "APPLE".
            88  a-meaingingful-condition-NOT 
                                      VALUE "BICYCLE".
    

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

    我不建议使用 APPLE 和 BICYCLE,只是用它们来说明这一点。

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

        88  a-meaingingful-condition  VALUE X"25".
    

    也可以在组项上指定 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).
    

    在文件匹配过程中,可以在文件末尾将键设置为高值,并且使用键仍然会导致其他文件被正确处理(键低于 on这个文件)。

    这里是来自 SO 的一些问题的链接,这些问题与 88 级直接相关或与重要方面相关。

    COBOL level 88 data type

    Group variable in cobol

    In Cobol, to test "null or empty" we use "NOT = SPACE [ AND/OR ] LOW-VALUE" ? Which is it?

    Does a prefix of "NO" have any special meaning in a COBOL variable?

    COBOL Data Validation for capital letter?

    【讨论】:

    • 感谢解答,非常详细。我不知道 SET 仅更改为 88 的第一个值。
    • 在 88 级使用 THRU 时务必小心。它可能会比你想要的更多。例如:'A' THRU 'Z' 使用 EBCDIC 字符集时还包括 } 和 `\` 以及一些您可能不想要的不可打印字符。
    • 任何支持对象的语言都可以用来模仿行为 - 任何支持具有副作用的函数的语言都可以模仿这种行为(并且将是一个很大的数字)。 COBOL 的“美”在于这是语言定义中定义明确的部分,不需要任何用户编写的代码来实现(除了声明)。我不知道有任何其他语言具有此内置功能。
    • 感谢 Bill 和 @NealB,我从中学到了很多,我只是期待“是的,语言 X 有它”或“不,你不会找到任何实现它的语言”。跨度>
    【解决方案2】:

    我的第一个编程语言是 Cobol,现在我使用的是 c#,这是我对 Cobol 88 级的解决方案:

    在 Cobol 中:

    01  ws-valid-countries pic xx.
        88  valid-country 'US', 'UK' 'HK'.
    
    move ws-country  to ws-valid-countries
    
    if  valid-country
        perform...
    

    在 C# 中

    string[] ValidCountries = {"US","UK","HK"} ;
    
    if ( ValidCountries.Contains(newCountry.Trim().ToUpper())  )
    {
       // do something
    

    【讨论】:

    • 问题不是“我如何以任何人愿意贡献的任何随机语言获得与 COBOL 88 相同的功能”。如果你觉得它是一个有用的 C# 问题,请用 C# 标签提出问题,并请自行回答。
    【解决方案3】:

    将其视为一个布尔 getter(本质上就像在您的宏中一样)和一个 setter(强制变量成为相应的值)。谁说 1965 年的 COBOL 不现代?

    【讨论】:

    • 好方法,我对在 Cobol 之后创建的那些语言没有这样的功能印象深刻。谢谢。
    【解决方案4】:

    正如其他人所说,只是一些对象编程。哪个更强大,但远没有那么优雅。喜欢:

    01  MY-DATASET.
        05  MY-DEPARTEMENT PIC 9(2).
            88  ILE-DE-FRANCE VALUES 75, 77, 78, 91 THRU 95.
    

    可以大致翻译成旧 VBA 中名为 MyDataset 的类:

    Public MyDepartement As Integer
    Property Get IleDeFrance() As Boolean
        Dim MyArray() As Variant
        MyArray = Array(75, 77, 78, 91, 92, 93, 94, 95)
        IleDeFrance = UBound(Filter(MyArray, MyDepartement, True)) > -1
    End Property
    

    (刚刚测试,在 VBA-excel2013 上运行) 我使 VBA 尽可能简单,没有干净的部门编号的 getter 或 setter,只是一个公共数据。由于一个类是一个数据仓库以及针对它们的编码操作,因此您可以在里面做比简单的 88 级更多的事情(这可能是为什么这个功能没有构成更现代的语言的原因)。但代价是复杂性和可读性。

    不太优雅,因为必须专门定义数组,并且还必须指定测试存在于其中的情况。虽然它是美妙的88级所固有的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 2020-06-21
      • 1970-01-01
      相关资源
      最近更新 更多