2

最近,我一直在尝试进入 APL。但是,我经常遇到的一个问题是将值分配给向量。

对于我打算获得多个结果的某些程序(例如,将一个字符或一串字母转换为 8 位二进制向量的程序),我尝试制作一个临时 for 循环,然后分配第 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] 被赋值的那一行得到一个长度错误。我的程序有什么问题,我该如何解决?

4

2 回答 2

2
  1. 您正在使用哪种 APL 实现?大多数 APL-Venoders(我知道)现在支持 Unicode,或者直接在 Unicode 中复制和粘贴,或者提供将 APL 转换为 unicode 的方法……然后您可以将其粘贴到此处,而不是转录它……
  2. 你说你还在进入APL。APL 的一个关键方面是“阵列思维”。使用 AT,您不需要循环遍历向量的元素,而是可以立即使用向量。
  3. 您可能可以改进的另一个方面是控制结构。现在大多数 APL 都提供了一些 cs 风格——这就是我问 1 的原因。
  4. 您的作业的问题是if您没有显示的 -function。但通常,if如果条件为真,则 -function 将返回其正确参数,否则返回空向量。所以,在你的情况下,当条件不满足时,你试图将一个空向量插入到数组的位置 - 但那里只有标量是可以接受的(除非你使用嵌套数组,这对于这个问题来说完全是矫枉过正) .

因此,这是一个与您的版本相当接近的版本,但使用控制结构并将给定的数值转换为二进制:

 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在这里您还可以找到其他有用的链接和免费的学生版...

于 2014-09-23T06:42:46.723 回答
1

使您的原始示例工作所需的所有工作,除了一些清理之外,就是简化“if”语句。

     ∇ 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 的方法是使用encode ( ⊤ ) 函数,它会为您执行除法循环。该解决方案很简单

     ∇ r←foo2 c;⎕IO
[1]    ⎕IO←0
[2]    r←⌽(8⍴2)⊤⎕av⍳c
     ∇
于 2014-10-09T07:43:49.160 回答