Seb*_*ian 6 rpg rpgle ibm-midrange
我最近进入了IBM的RPG世界,所以在编写一些代码并查看其他人的代码时,我发现有些人使用Eval,而另一些人则使用Move来完成同样的事情.它们之间有什么区别吗?
谢谢.
Buc*_*bro 15
是! 这些操作代码之间存在很大差异.在RPG Reference手册是一个良好的开端.
了解RPG是一种强类型语言非常重要.给定变量被声明为某种类型,具有一定的大小,并且在重新编译程序之前它是永久的.对于字符变量,仅允许字符操作.对于数字变量,仅允许数字运算.编译器禁止不属于变量类型的操作.
MOVE(以及变体MOVEL和MOVEA)用于在内存中移动(复制)字节.某些MOVE操作的故意副作用是在字符数据类型和数字之间进行转换.它需要一本书来描述MOVEx具有的无数用途,但是每一个都与它从这个存储器位置移动(复制)字节到该存储器位置的事实密切相关.
EVAL具有非常不同的主要功能:EVAL旨在评估表达式.大多数语言都允许像BASIC这样的表达式LET N = X^2 + Y + Z.在旧的(非常古老的)RPG中,没有表达.每行代码只进行一次计算.可以将此数字添加到该数字,或者将此变量与此进行比较.如果我们必须在(非常旧的)RPG中实现上述计算,我们需要这样的东西:
C X MULT X N
C N ADD Y N
C N ADD Z N
Run Code Online (Sandbox Code Playgroud)
使用EVAL,我们可以这样做:EVAL N = X*X + Y + Z 了解此EVALuation需要编译器创建一些内部工作变量以保存中间结果,这一点至关重要.在转换旧代码之前,这些中间字段的数字精度非常重要.那是因为固定格式代码操作MULT和ADD可以非常好地静默截断,但EVAL将发出溢出信号.
为什么我花了这么多时间谈论表达和EVAL?因为其中一个可能的表达式是"将此变量复制到那个".EVAL 不会在数据类型之间进行转换.如果您需要转换,您将需要提供类似%dec()或代码的代码%editc().
这就是为什么你会在最近的代码中看到MOVE的原因; 有人希望编译器使用MOVE进行隐式类型转换,而不是使用EVAL来编写显式表达式.
另外,甚至EVAL都已过时了.当前(7.1)版本的RPG允许完全自由的表单规范.第6列中没有"规范类型",没有/免费或/无结束:但是完全免费的表单文件,数据和计算描述.较早版本(如5.4)允许在/ free语句后进行自由格式计算.我在10年内没有写过固定的表格计算线.在任何当前的编译器中,EVAL(大多数)是可选的.
我喜欢巴克的答案,但要解释一下......
MOVE的结果只能通过检查源变量和目标变量的属性来获知; 以及对各种情况下MOVE如何工作的深入了解.MOVE有很多隐含性.
而EVAL基本上只有一种方式.您最终可以获得与MOVE相同的结果,但是您必须明确地利用各种内置函数(也称为BIF),例如$ dec(),%char(),%subst().
从可维护性的角度来看,EVAL获胜.因此,IBM离开MOVE的原因和兄弟姐妹的自由格式.
| 归档时间: |
|
| 查看次数: |
11319 次 |
| 最近记录: |