最近,我一直试图进入APL。但是,我经常遇到的一个问题是为向量赋值。
对于我打算获得多个结果的某些程序(例如,将字符或字符串转换为8位二进制向量的程序),我尝试过制作临时转换,然后分配i我的范围向量的一部分具有正确的值。例如,使用char-> bin矢量程序:
r = 8[rho]' ' (creates a vector of length 8 with only blank spaces)
i = 8
e = [the numerical value of character c]
a1: r[8-i] <- 1
r[8-i] <- 0(if)(0=2|e)
e <- (floor value of e/2)
i = i - 1
->a1(if)i != 1
但是,每次我尝试这个时,我都会在r [x]被赋值的行上得到一个长度错误。我的程序有什么问题,我该如何解决?
答案 0 :(得分:2)
if
- 您未展示的功能。但通常情况下,如果条件为真,则if
- 函数将返回其右参数,否则返回空向量。因此,在您的情况下,当条件不满足时,您尝试将空向量插入到数组的位置 - 但只有标量可以在那里接受(除非您使用嵌套数组,这对于此问题总是过度杀伤) 所以,这是一个与你的版本相当接近的版本,但使用控制结构并将给定的数值转换为二进制文件:
r←foo c;i;⎕IO;res
⍝ Converts integer value c to binary (loopy-version)
⎕IO←0
i←7
r←8⍴0
:if (i>255)∨(i≠⌊i)∨i<0 ⋄ r←¯1 ⋄ :endif ⍝ some cases we do not want to handle and return ¯1 to indicate error
:While i≥0
res←1=⌊c÷2*i
r[7-i]←res
c←c-res×2*i
i-←1
:EndWhile
但是,此解决方案仅用于说明在APL中实现某些一般方面的一些方法(并在学习APL时为您提供一些内容)。对于给定的问题,“真正的”APL解决方案将是(8⍴2)⊤number
最后,如果您不仅想要“进入”APL,而且想要掌握APL,那么可以从http://dyalog.com/mastering-dyalog-apl.htm获得一本精确标题的书籍;-)(免费下载!)还可以找到其他有用的链接和免费的学生版...
答案 1 :(得分:1)
除了一些清理之外,让原始示例工作所需要的只是简化&#34; if&#34;言。
∇ r←foo1 c;i;e;⎕IO
[1] ⎕IO←0
[2] r←8⍴0 ⍝ creates a vector of length 8 with only blank spaces
[3] i←8
[4] e←⎕AV⍳c ⍝ arbitrary choice of numeric value of a char
[5] a1:r[8-i]←2|e ⍝ simplified this here, no "if" needed
[6] e←⌊e÷2
[7] i←i-1
[8] →(i≠1)/a1
∇
问题在于,索引分配的参数显然不匹配。给定r [x]←y,x和y必须在等级和形状(或者如果向量的长度)中匹配。一个重要的例外是标量扩展,其中y可以是标量。最适合实验。
尽管如此,更多APL式的方法来解决这个问题的方法是使用编码(⊤)函数,它为你做分割循环。那个解决方案就是
∇ r←foo2 c;⎕IO
[1] ⎕IO←0
[2] r←⌽(8⍴2)⊤⎕av⍳c
∇