Specyfikatory w Verse opisują zachowanie powiązane z semantyką i można je dodawać do identyfikatorów i określonych słów kluczowych. Składnia specyfikatora zawiera nawiasy ostre <
i >
, między którymi umieszcza się słowo kluczowe, na przykład IsPuzzleSolved()<decides><transacts> : void
.
Atrybuty w Verse opisują zachowanie używane poza językiem Verse (w przeciwieństwie do specyfikatorów, które opisują semantykę języka Verse). Składnia atrybutu wykorzystuje symbol @
, po którym następuje słowo kluczowe, na przykład @editable
.
W poniższych sekcjach opisano wszystkie specyfikatory i atrybuty w Verse oraz okoliczności, w których się je stosuje.
Specyfikatory efektów
Efekty w Verse wskazują kategorie zachowania, jakie wolno przejawiać funkcji. Specyfikatory efektów można dodać do następujących elementów:
- Nawiasy
()
po nazwie w definicji funkcji:name()<specifier> : type = codeblock
. - Słowo kluczowe
class
:name := class<specifier>():
.
Specyfikatory efektów można podzielić na dwie kategorie:
- Wyłączne: Do funkcji lub słowa kluczowego
class
można dodać co najwyżej jeden wyłączny specyfikator efektu lub można nie dodawać żadnego. Jeśli nie zostanie dodany żaden wyłączny specyfikator efektu, efektem domyślnym będzieno_rollback
. - Addytywny: Do funkcji lub słowa kluczowego
class
można dodać wszystkie lub niektóre addytywne specyfikatory efektów lub można nie dodawać żadnego.
Kliknij obraz, aby go powiększyć.
Przykład | Efekt |
---|---|
|
no_rollback: Jest to efekt domyślny stosowany, gdy nie zostanie wskazany żaden efekt wyłączny. Efekt |
Efekty wyłączne | |
|
transacts: Ten efekt wskazuje na możliwość cofnięcia dowolnej akcji wykonanej przez funkcję. Efekt transacts jest wymagany przy każdym zapisie modyfikowalnej zmiennej ( |
|
varies: Ten efekt wskazuje, że wprowadzenie do funkcji tych samych danych wejściowych nie zawsze musi generować te same dane wyjściowe. Efekt |
|
computes: Ten efekt wymaga, aby funkcja nie zawierała żadnych efektów ubocznych, a jego finalizacja nie jest gwarantowana. Istnieje niesprawdzony wymóg, aby funkcja zwracała jednakowe wyniki po wprowadzeniu tych samych argumentów. Dobrym przykładem zastosowania efektu |
|
converges: Ten efekt gwarantuje, że wykonanie powiązanej funkcji nie przynosi efektów ubocznych, a dodatkowo funkcja zostanie definitywnie zrealizowana (nie podlega nieskończonej rekursji). Ten efekt może występować wyłącznie w funkcjach zawierających specyfikator |
Efekty addytywne | |
|
decides: Wskazuje, że funkcja może się zakończyć niepowodzeniem, a wywołanie takiej funkcji jest wyrażeniem zawodnym. Definicje funkcji z efektem |
|
suspends: Wskazuje, że funkcja jest asynchroniczna. Tworzy asynchroniczny kontekst ciała funkcji. |
W każdym przypadku wywołanie funkcji zawierające określony efekt wymaga, aby wywoływacz także zawierał dany efekt.
Specyfikatory dostępu
Specyfikatory dostępu określają, co i w jaki sposób może wchodzić w interakcje z elementem członkowskim. Specyfikatory dostępu można dodać do następujących elementów:
- Identyfikator elementu członkowskiego:
name<specifier> : type = value
- Słowo kluczowe
var
elementu członkowskiego:var<specifier> name : type = value
|
Publiczny (public): Identyfikator jest powszechnie dostępny. Ten specyfikator można dodawać do następujących elementów:
|
|
Chroniony (protected): Dostęp do identyfikatora mają jedynie bieżąca klasa i dowolne podtypy. Ten specyfikator można dodawać do następujących elementów:
|
|
Prywatny (private): Dostęp do identyfikatora jest możliwy tylko w bieżącym, bezpośrednio otaczającym go zakresie (którym może być moduł, klasa, struktura itp.). Ten specyfikator można dodawać do następujących elementów:
|
|
Wewnętrzny (internal): Dostęp do identyfikatora jest możliwy tylko w bieżącym, bezpośrednio otaczającym go module. Jest to domyślny poziom dostępu. Ten specyfikator można dodawać do następujących elementów:
|
Specyfikatory klas
Specyfikatory klas określają konkretne cechy klas lub ich elementów członkowskich, takie jak możliwość utworzenia podklasy danej klasy.
|
Abstrakcyjna (abstract): Gdy klasa lub metoda klasy zawiera ten specyfikator, nie można utworzyć instancji danej klasy. Klasy abstrakcyjne służą jako nadklasy z częściową implementacją lub jako wspólny interfejs. Jest to przydatne, gdy tworzenie instancji nadklasy nie ma sensu i nie chcemy dublować właściwości oraz zachowań w podobnych klasach. |
|
Konkretna (concrete): Gdy klasa zawiera ten specyfikator, musi istnieć możliwość utworzenia tej klasy z pustym archetypem, co oznacza, że każde pole klasy musi mieć wartość domyślną. Każda podklasa klasy konkretnej w domyśle także jest konkretna. Klasa konkretna może dziedziczyć bezpośrednio z klasy abstrakcyjnej, jeśli obie klasy są zdefiniowane w tym samym module. |
|
Unikatowa (unique): Specyfikator unique można zastosować do klasy, aby uczynić ją klasą unikatową. Aby skonstruować instancję klasy unikatowej, Verse przydziela unikatową tożsamość do powstałej instancji. Dzięki temu można porównywać instancje unikatowych klas pod względem równości, porównując ich tożsamości. Klasy bez specyfikatora unique nie mają takiej tożsamości, dlatego można je porównywać pod względem równości tylko na podstawie wartości ich pól. Oznacza to, że klasy unikatowe można porównywać za pomocą operatorów |
|
Końcowa (final): Tego specyfikatora można używać tylko w odniesieniu do klas i ich elementów członkowskich:
|
Specyfikatory implementacji
Nie da się używać specyfikatorów implementacji podczas pisania kodu, jednak będą one widoczne przy przeglądaniu interfejsów API UEFN.
|
native: Wskazuje, że szczegóły definicji elementu są zaimplementowane w C++. Definicje Verse zawierające specyfikator
|
|
native_callable: Wskazuje, że metoda instancji jest zarówno natywna (zaimplementowana w C++), jak i może być wywoływana przez inny kod C++. Ten specyfikator jest używany w metodzie instancji. Nie propaguje się on do podklas, więc nie trzeba dodawać go do definicji podczas zastępowania metody, która ma ten specyfikator. |
Atrybuty
Atrybuty w Verse opisują zachowanie używane poza językiem Verse (w przeciwieństwie do specyfikatorów, które opisują semantykę języka Verse). Atrybuty można dodać do wiersza kodu przed definicjami.
Składnia atrybutu wykorzystuje symbol @
, po którym następuje słowo kluczowe.
|
editable: Wskazuje, że dane pole jest właściwością uwidocznioną, którą można zmieniać bezpośrednio z poziomu UEFN, więc zmiana jej wartości nie wymaga modyfikowania kodu Verse. Aby dowiedzieć się więcej, patrz Dostosowywanie właściwości urządzeń. |
|
doc: Pole uwagi ogólnej, które można znaleźć w klasach i funkcjach (ale nie w parametrach funkcji). Powinno ono zawierać przydatne informacje o tym, co robi opisywany element lub jak go używać, i służy ono do wypełnienia strony danego elementu w odwołaniach do interfejsu API Verse. |