RPL (język programowania) - RPL (programming language)

RPL
Paradygmat Stos , ustrukturyzowany , zorientowany obiektowo
Zaprojektowany przez Hewlett Packard
Po raz pierwszy pojawiły się 1984 (1986)
OS Kalkulatory HP
Dialekty
RPL systemu, RPL użytkownika
Wpływem
RPN , Czwarty , Lisp

RPL to system operacyjny ręcznego kalkulatora i język programowania aplikacji używany w kalkulatorach graficznych firmy Hewlett-Packard RPN (Reverse Polish Notation) z serii HP 28 , 48 , 49 i 50 , ale można go również używać w kalkulatorach innych niż RPN, takie jak serie 38 , 39 i 40 .

RPL to strukturalny język programowania oparty na RPN, ale równie zdolny do przetwarzania wyrażeń algebraicznych i formuł, zaimplementowany jako interpreter wątkowy . RPL ma wiele podobieństw do Forth , oba języki są oparte na stosie , a także LISP oparty na listach . W przeciwieństwie do poprzednich kalkulatorów HP RPN, które miały stały czteropoziomowy stos , stos używany przez RPL jest ograniczony jedynie dostępną pamięcią RAM kalkulatora .

RPL wywodzi się z centrum programistycznego HP Corvallis w stanie Oregon w 1984 roku jako zamiennik wcześniejszej praktyki implementacji systemów operacyjnych kalkulatorów w języku asemblera . Ostatni kalkulator kieszonkowy obsługujący RPL, HP 50g, został wycofany z produkcji w 2015 r. Istnieje jednak wiele emulatorów, które mogą emulować kalkulatory RPL HP, które działają na wielu systemach operacyjnych i urządzeniach, w tym na smartfonach z systemem iOS i Android.

Warianty

Wewnętrzny nisko- i średniopoziomowy wariant RPL, zwany System RPL (lub SysRPL ), jest używany w niektórych wcześniejszych kalkulatorach HP, a także w wyżej wymienionych, jako część ich języka implementacji systemu operacyjnego . W serii HP 48 ten wariant RPL nie jest dostępny dla użytkownika kalkulatora bez użycia narzędzi zewnętrznych, ale w serii HP 49/50 jest wbudowany kompilator do użycia SysRPL. Możliwe jest spowodowanie poważnej awarii podczas kodowania w SysRPL, więc należy zachować ostrożność podczas korzystania z niego. Wysoki poziom RPL użytkownika (lub UserRPL ) wersja językowa jest dostępna na wspomnianej kalkulatorów graficznych dla rozwoju tekstowych, jak i graficznych programów aplikacyjnych. Wszystkie programy UserRPL są wewnętrznie reprezentowane jako programy SysRPL, ale używają tylko bezpiecznego podzbioru dostępnych poleceń SysRPL. Sprawdzanie błędów, które jest częścią poleceń UserRPL, powoduje jednak, że programy UserRPL są zauważalnie wolniejsze niż równoważne programy SysRPL. Komenda UserRPL SYSEVAL nakazuje kalkulatorowi przetwarzanie wyznaczonych części programu UserRPL jako kodu SysRPL.

Bloki kontrolne

Bloki sterujące RPL nie są ściśle przyrostkowe . Chociaż istnieją pewne godne uwagi wyjątki, struktury bloków kontrolnych wyglądają tak, jak w standardowym języku wrostków. Kalkulator zarządza tym, umożliwiając implementację tych bloków, aby w razie potrzeby przeskoczyć do przodu w strumieniu programu.

Instrukcje warunkowe

JEŚLI/TO/INNIE/KONIEC

RPL obsługuje podstawowe testowanie warunkowe poprzez strukturę IF/THEN/ELSE. Podstawowa składnia tego bloku to:

 IF condition THEN if-true [ELSE if-false] END

Poniższy przykład sprawdza, czy liczba na dole stosu to „1”, a jeśli tak, zastępuje ją liczbą „Równa jednemu”:

 « IF 1 == THEN "Equal to one" END »

Konstrukcja JEŻELI ocenia warunek, a następnie sprawdza spód stosu pod kątem wyniku. W rezultacie RPL może opcjonalnie obsługiwać bloki IF w stylu FORTH, umożliwiając określenie warunku przed blokiem. Pozostawiając warunek pusty, instrukcja IF nie spowoduje żadnych zmian na stosie podczas wykonywania warunku i użyje do testu istniejącego wyniku na dole stosu:

 « 1 == IF THEN "Equal to one" END »

IFT/IFTE

Testowanie warunkowe Postfix można wykonać za pomocą funkcji IFT („jeśli-to”) i IFTE („jeśli-to-inaczej”).

IFT i IFTE usuwają odpowiednio dwa lub trzy polecenia ze stosu. Najwyższa wartość jest oceniana jako wartość logiczna i, jeśli prawda, druga najwyższa wartość jest odkładana z powrotem na stos. IFTE zezwala na trzecią „inną” wartość, która zostanie odłożona z powrotem na stos, jeśli wartość logiczna jest fałszywa.

Poniższy przykład używa funkcji IFT, aby zdjąć obiekt z dołu stosu i, jeśli jest równy 1, zastępuje go „Jeden”:

 « 1 == "One" IFT »

Poniższy przykład używa funkcji IFTE, aby zdjąć obiekt z dołu stosu i, jeśli jest równy 1, zastępuje go „Jeden”. Jeśli nie jest równy 1, zastępuje go ciągiem „Not one”:

 « 1 == "One" "Not one" IFTE »

IFT i IFTE ocenią blok programu podany jako jeden z jego argumentów, umożliwiając bardziej zwartą formę logiki warunkowej niż struktura IF/THEN/ELSE/END. Poniższy przykład wyskakuje obiekt z dołu stosu i zastępuje go wartościami „Jeden”, „Mniej” lub „Więcej”, w zależności od tego, czy jest równy, mniejszy lub większy niż 1.

 «
   DUP 1 ==
   « DROP "One" »
   « 1 < "Less" "More" IFTE »
   IFTE
 »

PRZYPADEK/NASTĘPNIE/KONIEC

Aby obsługiwać bardziej złożoną logikę warunkową, RPL udostępnia strukturę CASE/THEN/END do obsługi wielu wyłącznych testów. Tylko jedna z gałęzi w instrukcji CASE zostanie wykonana. Podstawowa składnia tego bloku to:

 CASE 
  condition_1 THEN if-condition_1 END 
   ...
  condition_n THEN if-condition_n END
  if-none
 END

Poniższy kod ilustruje użycie bloku CASE/THEN/END. Mając literę na dole stosu, zastępuje ją jej odpowiednikiem w postaci ciągu lub „Nieznaną literą”:

 « 
   CASE 
      DUP "A" == THEN "Alpha" END
      DUP "B" == THEN "Beta" END
      DUP "G" == THEN "Gamma" END
      "Unknown letter"
   END
   SWAP DROP  @ Get rid of the original letter
 »

Ten kod jest identyczny z następującym odpowiednikiem zagnieżdżonego bloku IF/THEN/ELSE/END:

 «
    IF DUP "A" ==
    THEN
       "Alpha"
    ELSE 
       IF DUP "B" == THEN
          "Beta"
       ELSE 
          IF DUP "G" == THEN
             "Gamma"
          ELSE
             "Unknown letter"
          END
       END 
    END
    SWAP DROP  @ Get rid of the original letter
 »

Zapętlone stwierdzenia

W NASTĘPNYM

RPL udostępnia instrukcję FOR/NEXT do przechodzenia z jednego indeksu do drugiego. Indeks pętli jest przechowywany w tymczasowej zmiennej lokalnej, do której można uzyskać dostęp w pętli. Składnia bloku FOR/NEXT to:

index_from index_to FOR variable_name loop_statement NEXT

Poniższy przykład wykorzystuje pętlę FOR do sumowania liczb od 1 do 10. Zmienna indeksu pętli FOR to „I”:

 « 
    0       @ Start with zero on the stack
    1 10    @ Loop from 1 to 10
    FOR I   @ "I" is the local variable
       I +  @ Add "I" to the running total
    NEXT    @ Repeat...
 »

START/DALEJ

Blok START/NEXT jest używany do prostego bloku, który biegnie od indeksu początkowego do indeksu końcowego. W przeciwieństwie do pętli FOR/NEXT zmienna zapętlająca nie jest dostępna. Składnia bloku START/NEXT to:

 index_from index_to START loop_statement NEXT

DO/KROK i START/KROK

Zarówno FOR/NEXT, jak i START/NEXT obsługują przyrost kroku zdefiniowany przez użytkownika. Zastępując kończące słowo kluczowe NEXT słowem inkrementacyjnym i słowem kluczowym STEP, zmienna pętli będzie zwiększana lub zmniejszana o inną wartość niż domyślna wartość +1. Na przykład następująca pętla cofa się od 10 do 2, zmniejszając indeks pętli o 2:

 « 10 2 START -2 STEP »

PODCZAS/POWTÓRZ/KONIEC

Blok WHILE/REPEAT/END w RPL obsługuje nieskończoną pętlę z testem warunku na początku pętli. Składnia bloku WHILE/REPEAT/END to:

 WHILE condition REPEAT loop_statement END

DO/DO/KONIEC

Blok DO/UNTIL/END w RPL obsługuje nieskończoną pętlę z testem warunków na końcu pętli. Składnia bloku DO/UNTIL/END to:

 DO loop_statement UNTIL condition END

Uwagi

1. ^ "RPL" wywodzi się od Reverse Polish Lisp według jego pierwotnych twórców, podczas gdy przez krótki czas w 1987 roku marketing HP próbował wymyślić dla niego backronimowy język proceduralny oparty na ROM . Ponadto inicjały RPL są czasami interpretowane jako Reverse Polish Logic lub Reverse Polish Language, ale nazwy te nie są oficjalne.

Zobacz też

Bibliografia

Dalsza lektura

Linki zewnętrzne