QUAD VI、QUAD FI 和 QUAD VFI 的 APL2 等价物是什么?

What are the APL2 equivalents for QUAD VI, QUAD FI, and QUAD VFI?

我一直在查看 APL 代码示例,其中一些使用了 QUAD FI、QUAD VI 和 QUAD VFI。前两个在我的教科书中有描述(APL 一种交互式方法)。当我在 APL2 中尝试这些时,我得到一个值错误。

APL2 中是否有等效项?

虽然我认为 QUAD FI 和 QUAD VI 是 MicroAPL 的 APLX 的一部分,但 APL2(根据可用的 IBM APL2 手册)似乎没有直接支持它们。

如果您只需要找到可以 运行 您的代码示例的实现,APLX 作为已停产的 APL2 兼容产品可以在 http://www.dyalog.com/aplx.htm

免费下载

在普通的 APL2 中,您可以通过在 space 处拆分输入字符串来模拟行为,编写您自己的有效性检查器(以避免执行任意代码),并使用 (执行)获取值。

一个不太正确的 QUAD VI 实现可以是:

∇r←valide str
 ⍝ This doesn't test if ¯ sign occurs in the middle
 r←∧/str∊'¯0123456789.'
∇
∇r←VI str
r←valide¨(' '≠str)⊂str
∇
    VI '100.32  2,,3 0 12.2 ¯3 +2 -2'
1 0 0 1 1 1 0 0

有了 QUAD VI,我们可以通过

制作 QUAD FI
∇r←FI str;mesh
⍝ again this is very crude on edge cases
r←mesh\⍎¨(mesh←VI str)/(' '≠str)⊂str
∇

(注意上面的例子在 Dyalog APL 中不起作用)

由于题目有dyalog标签,所以Dyalog APL有QUAD VFI系统函数,简单来说就是另外两个的组合。所以 (⊃⊢⌿)∘⎕VFI 显然等于 ⎕FI(⊃⊣⌿)∘⎕VFI 等于 ⎕VI.

这是一个 ⎕VI 等价物,我记得在 1980 年代的某个时候在 APL Quote-Quad 中看到过,是凭记忆输入的。我认为原作者是 G. Bamberger。由于我在各大分时公司(Sharp、STSC)上用过APL,后来又在没有⎕VI的IBM VSAPL上工作,这个功能非常有用。

     ∇ r←vi x;t;b                                                                                                                                                                                                                                          
[1]    t←' 11111111112345'[' 1234567890¯E.'⍳x]                                                                                                                                                                                                             
[2]    b←t='1'                                                                                                                                                                                                                                             
[3]    t←(b⍲0,¯1↓b)/t                                                                                                                                                                                                                                      
[4]    r←(⍎t,',⍳0')∊1 14 21 41 131 141 214 241 1321 1431 2131 2141 4131 14131 14321 21321 21431 21432 24131 41321 141321 214131 241321 2141321                                                                                                             
     ∇     

LdBeth 的 FI 进行了更改以使其适用于空向量。

∇r←fi str;mesh
r←mesh\⍎(⍕(mesh←vi str)/(' '≠str)⊂str),',⍳0'
∇

(我用 ⎕ML←3 在 Dyalog 上检查过这个)

如果您不同意 ⎕VI 的默认答案,vi 可能会很有趣。

假设您希望 high 或 low minus 有效,以及指数表示法的大写和小写 E:

[1]    t←' 1111111111223345'[' 1234567890-¯Ee.'⍳x]   

或者如果您想要逗号作为小数点分隔符(在某些区域设置中)

[1]    t←' 11111111112345'[' 1234567890¯E,'⍳x]   

如果你根本不想支持 E 表示法

[1]    t←' 1111111111234'[' 1234567890¯.'⍳x]   

不要忘记相应地更改第 4 行的幻数,留给 reader 练习。还要在伴随 fi 函数中相应地替换字符。

最后,许多 APL 现在有复数(1J21.0E42J1.000042),需要相应地更改 vi。 vi 不支持复数。未来的 APL 可能包括四元数、八元数、凯莱数,所有这些都可能需要更改 vi。对于临时验证,处理 1 1.0 1. .1 就足够了。