2

最近、私はAPLに入ろうとしています。ただし、私が頻繁に直面する問題の 1 つは、ベクトルに値を代入することです。

複数の結果を取得する予定の特定のプログラム (たとえば、文字または文字列を 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 の重要な側面の 1 つは、「配列思考」です。AT を使用すると、ベクターの要素をループする必要はありませんが、ベクターをすぐに処理できます。
  3. 改善できる可能性があるもう 1 つの側面は、制御構造です。最近のほとんどの APL は、cs のフレーバーを提供しています。
  4. あなたの割り当ての問題は、あなたifが示していない -function です。しかし、通常、if関数は条件が true の場合は正しい引数を返し、それ以外の場合は空のベクトルを返します。したがって、あなたの場合、条件が満たされない場合、空のベクトルを配列の位置に挿入しようとしていますが、そこではスカラーのみが受け入れられます(ネストされた配列を使用しない限り、これは完全にやり過ぎです) .

したがって、これはあなたのものにかなり近いバージョンですが、制御構造を使用し、特定の数値をバイナリに変換します。

 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-Solution は次のようになります。(8⍴2)⊤number

最後に、APL に「入り込む」だけでなく、APL をマスターすることに興味がある場合は、その正確なタイトルの本を入手できます ;-) (無料でダウンロードできます!) http://dyalog.com/mastering-dyalogから-apl.htmには、他の役立つリンクや無料の学生版もあります...

于 2014-09-23T06:42:46.723 に答える