Ranga (język programowania J)
Ranga jest uogólnieniem pętli stosowanej w skalarnych (nie zorientowanych na tablicach ) językach programowania . Jest to także uogólnienie mapcar w języku Lisp i map we współczesnych językach programowania funkcjonalnego oraz uogólnienie rozszerzenia skalarnego, iloczynu wewnętrznego ( macierzy ) i iloczynu zewnętrznego w APL\360. Kanoniczną implementacją rangi może być język J , ale jest on również dostępny w Dyalog APL , Norma techniczna Międzynarodowej Organizacji Normalizacyjnej (ISO) dotycząca rozszerzonego APL i NARS2000.
Ranga ma kilka różnych znaczeń. Ogólnie rzecz biorąc, koncepcja rangi jest używana do traktowania tablicy ortogonalnej w kategoriach jej podtablic. Na przykład tablicę dwuwymiarową można traktować z rangą 2 jako całą macierz, z rangą 1, aby pracować z jej ukrytymi jednowymiarowymi kolumnami lub wierszami, lub z rangą 0, aby pracować na poziomie jej poszczególnych atomów.
- Ranga rzeczownika – ranga rzeczownika jest nieujemną liczbą całkowitą .
- Ranga czasownika – ranga czasownika to lista trzech liczb całkowitych.
-
Spójnik rangi – spójnik rangi (
"
) służy do wyprowadzenia czasownika o określonej randze.
Ranga jako uogólnienie pętli
Zrozumienie rangi wymaga znajomości kilku bardzo podstawowych koncepcji programowania zorientowanego na tablice. W większości języków wykorzystujących tablice redukcję oznacza się ukośnikiem /
. W J ukośnik przyjmuje lewy argument funkcji i prawy argument tablicy, która ma zostać zmniejszona przez tę funkcję.
+ / 1 2 3 6
Wynik to 1 + 2 + 3
, zgodnie z oczekiwaniami.
N-wymiarową tablicę liczb całkowitych można również utworzyć za pomocą i.
który przyjmuje jako argumenty wektor liczb całkowitych. Liczba liczb całkowitych określa wymiar, a wartość bezwzględna każdej liczby całkowitej określa długość odpowiedniego wymiaru.
0
0
0
ja . 3 1 2 ja . 2 3 1 2 3 4 5 ja . 2 3 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
Zredukujmy teraz tablicę dwuwymiarową przez dodanie.
+ / ja . 2 3 3 5 7
Wynik to 0 1 2 + 3 4 5
, zgodnie z oczekiwaniami. Redukcja przebiega wzdłuż każdej kolumny, sumując wszystkie liczby w tej kolumnie.
To zastosowanie +/
do tablicy dwuwymiarowej odpowiada fragmentowi kodu C:
0
0
0
0
for ( jot = ; jot < 3 ; ++ jot ) { suma [ jot ] = ; } for ( ja = ; ja < 2 ; ++ ja ) { for ( jot = ; jot < 3 ; ++ jot ) { suma [ jot ] +=
tablica [ i ] j ]; } }
Załóżmy, że chcemy dodać elementy każdego wiersza, jak we fragmencie kodu C:
0
0
0
for ( ja = ; ja < 2 ; ++ ja ) { suma [ ja ] = ; for ( jot = ; jot < 3 ; ++ jot ) { suma [ ja ] += tablica [ ja ][ jot ]; } }
Aby uzyskać wynik 3 12
. Możemy to zrobić w J bez pętli, po prostu używając rangi.
+ / " 1 ja . 2 3 3 12
Aby lepiej zilustrować działanie rangi w J, możemy zobaczyć, że oryginalne wyrażenie ma rangę 2. Operator jest odwzorowywany na tablicy o najwyższej randze.
+ / " 2 ja . 2 3 3 5 7
Powszechnie używa się tych nazw do tablic niskowymiarowych, chociaż czasami są one kwestionowane.
Nazwa Ranga Atom lub skalar 0 Wektor lub lista 1 Tabela lub macierz 2 Tensor lub sześcian 3
ranga rzeczownika
Rzeczowniki w J są tablicami . Ranga rzeczownika to liczba wymiarów tej tablicy. Czasownik pochodny #@$
określa rangę rzeczownika.
Ranga czasownika
Czasowniki w języku J to funkcje, które przyjmują argumenty rzeczownikowe i dają wyniki rzeczownikowe. Ranga czasownika określa sposób, w jaki czasownik jest stosowany do rzeczowników o randze większej niż 0. Rangę czasownika wyraża się za pomocą trzech liczb:
- Ranga dla przypadku monady; na przykład
-y
używa-
jako monady - Ranga dla lewego argumentu w przypadku diady; na przykład
x−y
używa−
jako diady - Oceń właściwy argument w przypadku diady
We wszystkich przypadkach istnieje pewna podstawowa definicja czasownika, która ma zastosowanie do komórek , które są podtablicami wskazanej rangi. Lub, jeśli argument nie ma tak wielu wymiarów, cały argument.
W przypadku czasowników ranga ujemna jest interpretowana jako ranga rzeczownika podanego dla tego argumentu pomniejszona o wskazaną wartość. (Ale nigdy mniej niż zero.)
- Na przykład czasownik o randze monadycznej ujemnej, gdy podano argument o randze 3, dzieli argument na listę tablic o randze 2. Treść czasownika jest stosowana jednokrotnie do każdej z tych dwuwymiarowych tablic podrzędnych.
W kontekście określonego czasownika i konkretnego rzeczownika wymiary tego rzeczownika są podzielone na sekwencję wymiarów przedrostków, zwaną ramką, i sekwencję wymiarów przyrostków, zwanych komórkami . Pozytywne stopnie czasownika wskazują liczbę wymiarów komórki, ujemne rangi czasownika wskazują liczbę wymiarów ramki.
W przypadku diadycznym istnieją dwie ramki: jedna dla lewego argumentu i jedna dla prawego argumentu. Ramy te muszą się zgadzać. Jeżeli ramki nie są identyczne, jedna musi być przedrostkiem drugiej; np . (i. 2 3) *"0 1 i. 2 3 4
mnoży każdy skalar (element zerowymiarowy) po lewej stronie przez każdy wektor (element jednowymiarowy) po prawej stronie. Wynik oceny tego czasownika będzie miał wymiary najdłuższej ramki jako wymiary przedrostka jej wyniku. Końcowe wymiary wyniku, jeśli istnieją, będą wynikiem czasownika zastosowanego do odpowiednich komórek. W przypadkach zdegenerowanych, gdzie argumenty nie mają wystarczających wymiarów, ranga czasownika jest skutecznie obniżona (co miałoby wpływ na jego wynik).
Na przykład,
10 + 4 5 6 14 15 16
Tutaj czasownik +
ma rangę 0 0 0, lewy argument ma rangę 0, a prawy argument ma rangę 1 (o wymiarze 3). Zatem lewy argument ma ramkę o randze 0, a prawy argument ma ramkę o randze 1 (o wymiarze 3). (pusta) ramka lewego argumentu jest prawidłowym przyrostkiem ramki prawego argumentu, więc jest to poprawna operacja. Wynik ma rangę 1 i wymiar 3.
Spójnik rangi
Spójnik rangi wykorzystuje lewy argument czasownika i prawy argument rzeczownika, aby utworzyć nowy czasownik. Prawy argument rzeczownika składa się z maksymalnie trzech liczb określających odpowiednio rangę monadyczną, lewą rangę diadyczną i prawą rangę diadyczną.
Jeśli prawym argumentem są tylko dwie liczby, przyjmuje się je jako rangi w przypadku diady: pierwsza liczba to ranga lewego argumentu, a druga liczba to ranga prawego argumentu. Jeśli więc chcemy dodać wektor do każdego wektora w macierzy:
1 2 3 +"1 1 tj. 3 3 1 3 5 4 6 8 7 9 11
Jeśli zamiast tego chcielibyśmy dodać każdy skalar po lewej stronie do każdego wektora po prawej stronie, zrobilibyśmy to w ten sposób:
1 2 3 +"0 1 tj. 3 3 1 2 3 5 6 7 9 10 11
Jeśli właściwym argumentem jest tylko jedna liczba, przyjmuje się ją jako rangę we wszystkich trzech przypadkach.
Jeśli właściwym argumentem jest czasownik, używana jest jego ranga. Na przykład wszystkie one wywodzą ten sam czasownik:
* +"0 0 0 * +"0 0 * +"0 * +"+
Jeśli lewy argument spójnika rangi jest rzeczownikiem, tworzony jest czasownik stały. Treść tego czasownika ignoruje wartości jakichkolwiek argumentów i zawsze daje wynik, którym jest ten rzeczownik.
Abrams, PS (luty 1970). „§II.E”. Maszyna APL (PDF) . Uniwersytet Stanforda (doktorat).
Backus, JW, Czy można wyzwolić programowanie od stylu von Neumanna? Styl funkcjonalny i jego algebra programów ( https://www.thocp.net/biographies/papers/backus_turingaward_lecture.pdf ), Komunikaty ACM, tom 21, numer 8, 1978–08.; §11.3.3.
Bernecky, R., An Wprowadzenie do Function Rank ( https://dl.acm.org/citation.cfm?id=55632 ), APL88 Conference Proceedings, APL Quote Quad, tom 18, numer 2, 1987–12.
Bernecky, R.; Iverson, KE (6–8 października 1980). „Operatory i tablice zamknięte” . Postępowanie . 1980 Spotkanie użytkowników APL. Joprogramowanie .
Bernecky, R.; Iverson, Ke; McDonnell,EE; Metzger, RC; Schueler, JH (02.05.1983). „SATN 45: Rozszerzenia językowe z maja 1983 r.” . Joprogramowanie . IP Sharp Associates Limited.
Brown, JA, The Principles of APL2 ( http://www.softwarepreservation.org/projects/apl/Papers/PRINCIPLESOFAPL2 ), TR 03.247, IBM Santa Teresa Laboratory, San Jose, Kalifornia, 1984–03; §20.0.
Dyalog, Dyalog APL wersja 14.0 — informacje o wydaniu ( http://www.dyalog.com/dyalog-version-140.htm ), Dyalog Limited, 2015.
Hui, RKW, Rank and Uniformity ( http://www.jsoftware.com/papers/rank.htm ), APL95 Conference Proceedings, APL Quote Quad, tom 25, numer 4, 1995–06.
Hui, RKW, Wspominając Kena Iversona ( https://keiapl.org/rhui/remember.htm ), 2004-11.
Hui, RKW, Produkt wewnętrzny — stary/nowy problem ( http://www.jsoftware.com/papers/innerproduct/ip.htm ), Konferencja Brytyjskiego Stowarzyszenia APL 2009, 8.06.2009.
Iverson, KE, Operatory i funkcje ( http://www.jsoftware.com/papers/opfns.htm ), Raport badawczy nr RC7091, IBM, 26.04.1978.
Iverson, KE, A Dictionary of APL ( http://www.jsoftware.com/papers/APLDictionary.htm ), APL Quote Quad, tom 18, numer 1, 1987–09.
Iverson, KE, A Personal View of APL ( http://www.jsoftware.com/papers/APLPersonalView1.htm ), IBM Systems Journal, tom 30, numer 4, 1991–12.
Slepak, Justin; Dreszcze, Olin; Manolios, Panagiotis, Język zorientowany na tablice z polimorfizmem rangi statycznej ( http://www.ccs.neu.edu/home/jrslepak/typed-j.pdf ).