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 现在有复数(1J2
、1.0E42J1.000042
),需要相应地更改 vi。 vi
不支持复数。未来的 APL 可能包括四元数、八元数、凯莱数,所有这些都可能需要更改 vi
。对于临时验证,处理 1
1.0
1.
.1
就足够了。
我一直在查看 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 现在有复数(1J2
、1.0E42J1.000042
),需要相应地更改 vi。 vi
不支持复数。未来的 APL 可能包括四元数、八元数、凯莱数,所有这些都可能需要更改 vi
。对于临时验证,处理 1
1.0
1.
.1
就足够了。