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 № 1W 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ę.