我现在正在学习COBOL并且非常喜欢88种类型的变量,我想知道在其他语言中是否有类似的东西(大多数已知的语言,例如C,Objective-C),甚至使用图书馆。
我唯一能想到的就是使用
#define booleanResult (variableName==95)
但是无法将boolenResult
设置为true
并使variableName
假设95为值。
答案 0 :(得分: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
IF测试与88(条件名称)关联的数据名称(条件变量)引用的值,单个值或多个值之一,可以包括范围(THRU)和图形常量(ZERO,SPACE,LOW-VALUES等)。
这种形式的SET是1985年标准版COBOL的最新版本,它将将数据名称的值更改为88 <上指定的第一个值< / em>,这样如果你在测试中立即引用了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".
要测试开关/标志,请使用第一个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个级别。
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?
答案 1 :(得分: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
答案 2 :(得分:1)
将其视为布尔型getter(基本上与宏相同)和setter(强制变量为相应的值)。谁说COBOL在1965年不是现代的?
答案 3 :(得分:-1)
正如其他人所说,只是一些对象编程。哪个更强大,但更不优雅。喜欢:
01 MY-DATASET.
05 MY-DEPARTEMENT PIC 9(2).
88 ILE-DE-FRANCE VALUES 75, 77, 78, 91 THRU 95.
可以在名为MyDataset的类中的旧VBA中粗略翻译:
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尽可能简单,没有干净的吸气剂或设置器,只是一个公共数据。由于一个类是一个数据库加上针对它们的编码操作,你可以在内部做更多的事情而不是一个简单的88级(这可能是为什么这个功能不能用于更现代的语言)。但是以复杂性和价格为代价。可读性。
不太优雅,因为必须专门定义数组,并且还必须指定测试其中的存在。虽然它是88级的精彩内在。