APL/360 I-beam 26在Dyalog APL中的等效实现及代码转换咨询
APL/360 I-beam 26 在 Dyalog APL 中的转换方案
背景说明
APL/360中的⌶26用于获取当前行计数器的值:
⌶26 Current value of line counter. In the execution
of a defined function, this is the command
number of the command being executed. ⌶26 can
be used for branching. For example, →2+⌶26 is a
branch to two commands beyond the present one.
用户提供的APL/360示例代码如下:
→(3 2 1 ⍴⍴X)/(DFTERR+F←0), 2 3 +⌶26
→(∧/0≤Y)/2+⌶26
转换方案
方案1:动态行号获取(直接替代)
Dyalog APL中可通过⎕SI.Line获取当前执行的行号,直接替换⌶26即可:
转换后的第一行代码:
→(3 2 1 ⍴⍴X)/(DFTERR+F←0), 2 3 +⎕SI.Line
转换后的第二行代码:
→(∧/0≤Y)/2+⎕SI.Line
注意事项:
⎕SI依赖栈检查功能,若函数使用:Optimize指令优化,该方法可能失效。- 行号计数规则与APL/360一致,均从1开始递增。
方案2:标签式分支(推荐)
为避免依赖栈检查、提升代码可读性,建议用标签替代动态行号计算。为目标分支行添加标签后,直接分支到标签即可。
例如原代码→2+⌶26是跳转到当前行后第2行,可将目标行标记为NEXT_STEP,改写为:
→NEXT_STEP
对应到用户示例,假设2+⌶26指向的行标签为SKIP2,3+⌶26指向的行标签为SKIP3,第一行代码可改写为:
→(3 2 1 ⍴⍴X)/(DFTERR+F←0), SKIP2 SKIP3
这种方式更直观,且不受优化指令影响,是长期维护代码的优选方案。
内容的提问来源于stack exchange,提问作者Neil Bartlett
相关产品推荐
相关产品推荐

