Zwracane dane i kończenie
Dostępne są dwa wyrażenia, które kończą wykonywanie bieżącej podrouty lub programu; wyrażenia return
i fail
. Ogólnie rzecz biorąc, wywołania mogą zakończyć wykonywanie przed wykonaniem wszystkich instrukcji za pomocą wyrażenia return
lub fail
. Wyrażenie return
zakończy wykonywanie bieżącego wywołania, a fail
wyrażenie zakończy wykonywanie całego programu i spowoduje wystąpienie błędu środowiska uruchomieniowego.
Wyrażenie zwracane
Wyrażenie return
kończy działanie z bieżącego elementu wywołującego i zwraca kontrolkę do metody wywoływanej. Zmienia kontekst wykonywania, wyskakując ramkę stosu.
Wyrażenie zawsze zwraca wartość do kontekstu obiektu wywoływanego; składa się ze słowa kluczowego return
, po którym następuje wyrażenie odpowiedniego typu. Wartość zwracana jest obliczana przed wykonaniem wszystkich akcji zakończenia i zwróceniem kontrolki. Akcje zakończenia obejmują na przykład czyszczenie i zwalnianie kubitów przydzielonych w kontekście wywołania. W przypadku uruchamiania na symulatorze lub sprawdzaniu poprawności akcje zakończenia często obejmują również kontrole związane ze stanem tych kubitów, na przykład, czy są one prawidłowo odłączone od wszystkich kubitów, które pozostają aktywne.
Wyrażenie return
na końcu wywołania, które zwraca Unit
wartość, może zostać pominięte. W takim przypadku kontrolka jest zwracana automatycznie po uruchomieniu wszystkich instrukcji i wykonaniu wszystkich akcji zakończenia. Obiekty wywołujące mogą zawierać wiele return
wyrażeń, choć implementacja adjoint dla operacji zawierających wiele return
wyrażeń nie może być generowana automatycznie.
Na przykład
return 1;
lub
return ();
Wyrażenie niepowodzenia
Wyrażenie fail
kończy obliczenia całkowicie. Odpowiada on błędowi krytycznemu, który przerywa program.
Składa się z słowa kluczowego fail
, po którym następuje wyrażenie typu String
.
Element String
powinien podać informacje o napotkanym niepowodzeniu.
Na przykład
fail "Impossible state reached";
lub, przy użyciu ciągu interpolowanego,
fail $"Syndrome {syn} is incorrect";
Oprócz podanego String
fail
wyrażenia najlepiej zbiera i zezwala na pobieranie informacji o stanie programu. Ułatwia to diagnozowanie i naprawianie źródła błędu oraz wymaga obsługi wykonywanego środowiska uruchomieniowego i oprogramowania układowego, które może się różnić w różnych miejscach docelowych.