/ / Przekaż funkcję jako argument w APL - funkcja, wskaźniki funkcyjne, przekazywanie argumentów, apl

Przekaż funkcję jako argument w APL - funkcja, wskaźniki funkcyjne, przekazywanie argumentów, apl

Jak przekazać funkcję jako argument?

Podstawową ideą jest coś takiego (co nie działa):

∇R ← double a
R ← 2 × a
∇

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

5 applytwice double

Czy jest coś takiego fun w erlang lub wskaźniki funkcji w C?

Odpowiedzi:

9 dla odpowiedzi № 1

W APL funkcje nie mogą być przekazywane jako argumentydo funkcji. APL ma jednak operatory, które są funkcjami wyższego rzędu, które mogą przyjmować funkcje jako argumenty. Istnieją operatory pierwotne, takie jak / (redukcja) używane na przykład do podsumowania wektora + / v. Funkcja + jest lewym operandem i jest przekazywana do operatora /.

W aplikacji Dyalog APL istnieje prymitywny operator używający (nazwanego "moc") do zastosowania funkcji n razy, abyśmy mogli napisać:

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

Możesz także napisać własne operatory (w większości APL-ów). W aplikacji Dyalog APL możemy napisać Twój operator applytwice jako:

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

Na koniec możesz przekazać funkcje, umieszczając je w przestrzeni nazw i zamiast tego przekazując przestrzeń nazw. To jest jak bardzo lekka instancja klasy z metodą. Na przykład:

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

W tym przypadku funkcja musi mieć nazwę f, ale możemy mieć wiele różnych funkcji o nazwie f, każda w swojej własnej przestrzeni nazw.


4 dla odpowiedzi nr 2

Twoja prośba nie była tak odległa. W Dyalog APL i prawdopodobnie innych, non-dfn (definicja funkcji starszej) kod wyglądałby tak:

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

- applytwice 42
42

{2×⍵} applytwice 42
168

W APL: dowolny "program" akceptujący zero, jeden lubdwa argumenty danych to "funkcja". Wbudowane funkcje, takie jak + - itd. Mogą być nazywane "funkcjami pierwotnymi". Podwójna funkcja w przykładach będzie "zdefiniowaną funkcją". "Operator" akceptuje funkcje i dane jako argumenty. + / i + to przykłady operatora redukcji i skanowania, + to funkcja lewego argumentu dla operatora /. Natomiast funkcje kompresji i rozszerzania używają tych samych symboli (/ i), ale mają lewy argument danych.

Taka jest nomenklatura APL.


0 dla odpowiedzi № 3

Możesz też obejść to przez cytując. Możesz przekazać tablicę znaków, a następnie wykonać ją w ramach funkcji. Ten ciąg może zawierać nazwę zdefiniowanej funkcji lub bezpośrednią definicję.