質問

引数として関数を渡すにはどうすればよいですか?

基本的なアイデアは、このようなものです(機能しません):

∇R ← double a
R ← 2 × a
∇

∇R ← a applytwice f
R ← f f a
∇

5 applytwice double

何かがありますか \fun erlangまたはcの関数ポインターで?

役に立ちましたか?

解決

APLでは、関数が関数の引数として渡されない場合があります。ただし、APLには高次関数である演算子があり、関数を引数として使用できます。たとえば、ベクトル + / vを要約するために使用される /(削減)のような原始的な演算子があります。関数 +は左オペランドであり、演算子に渡されます。

Dyoyog APLでは、(「Power」という名前の名前が付けられた)を使用して、関数をn回適用して、次のことを使用する原始演算子があります。

      double←{2×⍵}
      (double ⍣ 2) 7
28
      (double ⍣ 10) 7
7168

自分のオペレーターを(ほとんどのAPLで)書くこともできます。 Dyoyog APLでは、ApplyTwiceオペレーターを次のように記述できます。

     applytwice←{⍺⍺ ⍺⍺ ⍵}
     double applytwice 7
28

最後に、名前空間に配置し、代わりに名前空間を渡すことで、関数を渡すことができます。これは、メソッドを備えたクラスの非常に軽量なインスタンスのようなものです。例えば:

       s←⎕NS ''
       s.f←{2×⍵}
       ApplyFTwice←{⍺.f ⍺.f ⍵}
       s ApplyFTwice 7
28

この場合、関数の名前はFと名付けられなければなりませんが、それぞれが独自の名前空間にある多くの異なる関数がfという名前の異なる関数ができます。

他のヒント

あなたのapplytwiceは正しいことからそれほど遠くありませんでした。 Dyoyog APLおよび場合によっては、非DFN(レガシー関数定義)コードは次のようになります。

       ∇ R ← (f applytwice) a
  [1]   R ← f f a
       ∇

       - applytwice 42
  42

       {2×⍵} applytwice 42
  168

APLでは、ゼロ、1つ、または2つのデータ引数を受け入れる「プログラム」は「関数」です。 + - などの組み込み関数は、「プリミティブ関数」と呼ばれる場合があります。例の二重関数は、「定義された関数」です。 「オペレーター」は、関数とデータを引数として受け入れます。 + /および +は、還元およびスキャン演算子の例であり、 +は /または演算子の関数左引数です。対照的に、圧縮および展開関数は同じシンボル(/および)を使用しますが、左のデータ引数があります。

これがAPLの命名法です。

これを回避することもできます 引用. 。チャーアレイを渡して、関数内で実行できます。この文字列には、定義された関数の名前または直接的な定義が含まれる場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top