Sintassi per le etichette goto

0

In C, C ++ e alcuni dialetti di BASIC, le etichette goto sono dichiarate con la sintassi label: . Sto lavorando su un linguaggio che usa name: type come sintassi per le dichiarazioni variabili, quindi preferirei se possibile usare qualcosa di più distintivo per le etichette. Sono o, a un certo punto, ho familiarizzato passivamente con molti linguaggi che usano quella sintassi per le dichiarazioni variabili, ma in cima alla mia testa non riesco a ricordare nessuno di loro che non vieti il goto (non sto cercando di discutere se questa è una decisione di progettazione buona o cattiva, solo notare che si è verificato in quei casi), quindi sto cercando di capire dove cercare i precedenti sulle etichette.

Quali altre forme di sintassi sono state usate per le etichette goto? Ci sono dei criteri che potrei trascurare nel sceglierne uno rispetto all'altro?

(Ho appena ricordato che Ada è un'eccezione, ma usa <<label>> , che non si combina bene con l'uso di quei simboli come operatori di spostamento in stile C.)

    
posta rwallace 24.02.2012 - 01:04
fonte

6 risposte

5

Gli script batch DOS utilizzano :label .

// Personalmente userò >label . :)

    
risposta data 24.02.2012 - 22:38
fonte
3

Potresti creare label una parola chiave e usare qualcosa come:

label foo;

o

LABEL FOO;

se vuoi che risaltino di più.

Ma come dice Mitch, dipende molto da come è la sintassi del resto della tua lingua.

C'è un argomento da sostenere che la sintassi dell'etichetta non dovrebbe adattarsi perfettamente al resto della lingua, in modo che le etichette goto risalti maggiormente. (Questo era il fondamento logico della sintassi <<LABEL>> di Ada.)

    
risposta data 25.02.2012 - 01:37
fonte
3

Se devi usare le istruzioni GOTO, anche sapendo che non sono necessarie e un invito aperto a rovinare i tuoi programmi, fai ciò che ha fatto Ichbiah et al (i designer originali di Ada): FAI IL SINTASSE UGLY .

Fai sporgere come un pollice gigante con un'infezione fungina davvero orribile che è stata distrutta con un martello. Rendetelo SEMPLICE per i programmatori di manutenzione per vederlo, in modo che sappiano che l'autore del codice che viene richiesto di mantenere è un cretino totale, che ha dovuto essere trasferito forzatamente alla business school, piuttosto che essere autorizzato a immatricolarlo in computer la scienza, quindi saranno alla ricerca degli errori idioti non del tutto ovvi che sono destinati a essere insulti per tutto il suo presunto codice.

Ichbiah ha ammesso di averlo fatto, in così tante parole. Le specifiche DoD per il linguaggio richiedevano esplicitamente che contenesse un'istruzione GOTO, perché il DoD credeva (erroneamente, secondo la mia personale opinione) che il caso contro di esso non fosse stato reso sufficientemente solido. Non potevano NON inserire un GOTO, ma potevano e lo rendevano UGLY, per scoraggiarne l'uso. La maggior parte dei luoghi che utilizzavano Ada ne bandiva immediatamente l'utilizzo, o almeno richiedeva la gestione della firma su ogni GOTO, per incoraggiare il programmatore a trovare un'alternativa senza GOTO.

Qualcosa come ### --- > > > LABEL < < < --- ### funzionerebbe. L'etichetta deve essere su una linea, con una "decorazione" massiccia, fino al margine sinistro e ALL BY STESSO.

O forse qualcosa come --- > > > LABEL ... HEREBEDRAGONS, dove "HEREBEDRAGONS" è una parola riservata nella lingua, e qualsiasi variazione su HEREBEDRAGONS che non è tutto maiuscolo è definita come un errore di sintassi fatale. Rendilo HARD e PAINFUL per il programmatore per usarlo.

    
risposta data 25.02.2012 - 04:40
fonte
0

Non sono sicuro di dove sto ottenendo questo, ma un po 'di% di% di co_de mi sembra naturale.

Ma sospetto anche che la risposta "giusta" dipenda da cosa sta succedendo nel tuo nuovo linguaggio, in sintassi.

    
risposta data 24.02.2012 - 02:00
fonte
0

JavaScript non ha goto ma ha etichette:

outer:for(var i=0;i<10;++i) {...}

e tuttavia ha:

{ outer:"value" }

e tuttavia puoi trovarli lì:

some? outer:"value";

In JavaScript 2.0 sono state aggiunte variabili tipizzate:

var some:int;

Tutto questo non crea conflitti come ':' appare in diversi contesti.

    
risposta data 25.02.2012 - 08:33
fonte
0

Che ne dici di [label] ? Ad esempio,

Stack<Solution> partialSolutions = new Stack<Solution>();
partialSolutions.add(initialSolution);

[weirdSearch]
if (partialSolutions.isEmpty()) {
    acceptedSolution = null;
    goto cleanup;
}

[weirdSearchSkipEmptyCheck]
Solution sol = partialSolutions.pop();
switch (rand() % 3) {
    [0] // accept this
    acceptedSolution = sol;
    goto cleanup;

    [1] // reject this and try the next solution
    goto weirdSearch;

    [2] // try a derived solution
    partialSolutions.push(sol.deriveAnotherSolution());
    goto weirdSearchSkipEmptyCheck;
}

[cleanup]
free(stack);

Non conosco alcun linguaggio che usi questa sintassi, anche se mi ricorda le sezioni nei file INI.

Altre cattive idee:

<label>
.label.
:label:
*label*
>label<

Questi dovrebbero essere tutti facili da analizzare se la tua lingua è simile a Java, poiché nessun'altra istruzione può iniziare con un operatore infisso.

    
risposta data 25.02.2012 - 02:21
fonte

Leggi altre domande sui tag