Gli specificatori in Verse descrivono comportamenti relativi alla semantica e possono essere aggiunti agli identificatori e ad alcune parole chiave. La sintassi degli specificatori utilizza <
e >
, con la parola chiave in mezzo, come ad esempio IsPuzzleSolved()<decides><transacts> : void
.
Gli attributi in Verse descrivono un comportamento che viene utilizzato al di fuori del linguaggio Verse (a differenza degli specificatori, che descrivono la semantica di Verse). L'attributo sintassi utilizza @
seguito dalla parola chiave, come ad esempio @editable
.
Le sezioni seguenti descrivono tutti gli specificatori e gli attributi di Verse e i diversi casi di utilizzo.
Specificatori di effetto
Gli effetti in Verse indicano le categorie di comportamento che una funzione è consentita ad assumere. Puoi aggiungere specificatori di effetto a:
()
posto dopo il nome in una definizione di funzione:name()<specifier> : type = codeblock
.- La parola chiave
class
:name := class<specifier>():
.
Gli specificatori di effetto si dividono in due categorie:
Esclusivo: puoi aggiungere solo uno o nessuno degli specificatori di effetto esclusivo a una funzione o alla parola chiave class
. Se non viene aggiunto alcun specificatore di effetto esclusivo, l'effetto predefinito è no_rollback
.
Additivo: puoi aggiungere tutti, alcuni o nessuno degli specificatori di effetto additivo a una funzione o alla parola chiave class
.
Fai clic sull'immagine per ingrandirla.
Esempio | Effetto |
---|---|
|
no_rollback: è l'effetto predefinito quando non viene specificato un effetto esclusivo. L'effetto |
Effetti esclusivi | |
|
transacts: questo effetto indica che può essere eseguito il rollback di qualsiasi azione eseguita dalla funzione. L'effetto transacts è richiesto ogni volta che viene scritta una variabile modificabile ( |
|
varies: questo effetto indica che lo stesso input della funzione potrebbe non generare sempre lo stesso output. L'effetto |
|
computes: questo effetto richiede che la funzione non abbia effetti collaterali e non è garantito che venga completata. Esiste un requisito non controllato che la funzione, se fornita con gli stessi argomenti, generi lo stesso risultato. Qualsiasi funzione che non disponga dello specificatore |
|
converges: questo effetto garantisce non solo che non ci siano effetti collaterali dall'esecuzione della funzione correlata, ma anche che la funzione si completi definitivamente (non sia ricorsiva all'infinito). Questo effetto può essere visualizzato solo nelle funzioni che hanno lo specificatore |
Effetti additivi | |
|
decides: indica che la funzione può non riuscire e che la chiamata a questa funzione è un'espressione fallibile. Le definizioni di funzioni con l'effetto |
|
suspends: indica che la funzione è asincrona. Crea un contesto asincrono per il corpo della funzione. |
In tutti i casi, la chiamata di una funzione che ha un effetto specifico richiede che anche il chiamante abbia quell'effetto.
Specificatori di accesso
Gli specificatori di accesso definiscono cosa può interagire con un membro e in che modo. Gli specificatori di accesso possono essere applicati a quanto segue:
- L'identificatore di un membro:
name<specifier> : type = value
- La parola chiave
var
per un membro:var<specifier> name : type = value
|
Pubblico: l'identificatore è universalmente accessibile. Puoi utilizzare questo specificatore su:
|
|
Protetto: l'identificatore può essere consultato solo alla classe corrente e agli eventuali sottotipi. Puoi utilizzare questo specificatore su:
|
|
Privato: l'identificatore può essere consultato solo nell'ambito corrente, di inclusione immediata (sia esso un modulo, una classe, una struttura, ecc.). Puoi utilizzare questo specificatore su:
|
|
Interno: l'identificatore può essere consultato solo nel modulo corrente di inclusione immediata. È il livello di accesso predefinito. Puoi utilizzare questo specificatore su:
|
Specificatori di classe
Gli specificatori di classe definiscono alcune caratteristiche delle classi o dei loro membri, come la possibilità di creare una sottoclasse di una classe.
|
abstract: quando una classe o un metodo di classe ha lo specificatore abstract, non è possibile creare un'istanza della classe. Le classi astratte sono destinate a essere utilizzate come superclassi con implementazione parziale o come interfaccia comune. È utile quando non ha senso avere istanze di una superclasse, ma non si vogliono duplicare proprietà e comportamenti di classi simili. |
|
concrete: quando una classe ha lo specificatore concrete, deve essere possibile costruirla con un archetipo vuoto, il che significa che ogni campo della classe deve avere un valore predefinito. Ogni sottoclasse di una classe concreta è implicitamente concreta. Una classe concreta può ereditare direttamente da una classe astratta, solo se entrambe le classi sono definite nello stesso modulo. |
|
unique: lo specificatore unique può essere applicato a una classe per renderla univoca. Per costruire un'istanza di una classe univoca, Verse alloca un'identità univoca per l'istanza risultante. Ciò consente di confrontare le istanze di classi univoche per l'uguaglianza confrontando le loro identità. Le classi prive dello specificatore univoco non hanno tale identità e quindi si possono confrontare solo per l'uguaglianza in base ai valori dei loro campi. Ciò significa che le classi univoche si possono confrontare con gli operatori = e <> e sono sottotipi del tipo confrontabile. |
|
final: lo specificatore finale può essere utilizzato soltanto su queste classi e campi di classi:
|
Specificatori di implementazione
Mentre non potrai utilizzare gli specificatori di implementazione quando scrivi il codice, potrai visualizzarli nelle API UEFN.
|
native: indica che i dettagli di definizione dell'elemento sono implementati in C++. Le definizioni di Verse con lo specificatore
|
|
native_callable: indica che un metodo di istanza è nativo (implementato in C++) e può essere richiamato da altro codice C++. Puoi vedere questo specificatore utilizzato su un metodo di istanza. Questo specificatore non si propaga alle sottoclassi e quindi non è necessario aggiungerlo a una definizione, quando esegui l'override di un metodo che include lo specificatore stesso |
Attributi
Gli attributi in Verse descrivono un comportamento che viene utilizzato al di fuori del linguaggio Verse (a differenza degli specificatori, che descrivono la semantica di Verse). Gli attributi possono essere aggiunti nella riga di codice prima delle definizioni.
La sintassi degli attributi utilizza @
, seguito dalla parola chiave.
|
editable: indica che questo campo è una proprietà esposta che può essere modificata direttamente tramite UEFN, quindi non è necessario modificare il codice Verse per cambiarne il valore. Per maggiori dettagli, vedi Personalizzare le proprietà del dispositivo. |
|
doc: un campo della nota generico che si trova nelle classi e nelle funzioni (ma non nei parametri delle funzioni). Deve contenere informazioni utili sulle operazioni che esegue l'elemento che descrive o su come utilizzarlo, e viene usato per popolare la pagina di quell'elemento nella guida API di Verse. |