Il token var è necessario per segnalare la dichiarazione delle variabili?

2

Quando crei una variabile foo , Python ti permette di scrivere solo foo = bar . Tuttavia, molte lingue, come C # o JavaScript, richiedono una sintassi aggiuntiva come var foo = bar o foo := bar per segnalare la stessa cosa. C'è un motivo per cui C # / JS richiede una differenziazione esplicita di una dichiarazione dall'assegnazione?

Posso immaginare che un parser, dopo aver letto foo = bar , debba decidere se = significa dichiarazione o assegnazione. Ma è facile: basta controllare se foo è stato dichiarato in precedenza. Mi sto perdendo qualcosa qui?

    
posta uryga 02.02.2016 - 23:50
fonte

4 risposte

10

But that's easy - just check if foo was declared earlier

E qui sta il tuo problema.

In linguaggi come Javascript, è fin troppo facile "sfumare" una variabile che hai già definito in precedenza senza saperlo, e ora hai uno strano comportamento che non puoi spiegare. Il problema è esacerbato in Javascript perché tutte le variabili non altrimenti sequestrate in una funzione risiedono nello spazio dei nomi globale, dove vengono facilmente calpestate dal codice canaglia.

C # elimina questo problema definendo un rigido insieme di regole che governano il modo in cui le variabili possono essere dichiarate e quando. Una parte di queste regole sta avendo una sintassi che distingue la dichiarazione dall'assegnazione (ovvero la parola chiave var ) e non consente il riutilizzo dei nomi di variabili che appaiono nell'ambito di inclusione.

    
risposta data 02.02.2016 - 23:57
fonte
3

ci sono due passaggi distinti coinvolti, "creare" una variabile e "assegnare" un valore. Pensala come "costruire una casa" e "affittare una casa". la casa può essere costruita solo una volta, ma può essere affittata un numero infinito di volte. Diverse lingue lo gestiscono in modo diverso perché alcuni progettisti di linguaggi pensano che sia una buona idea far costruire una casa ogni volta che si ottiene il primo affittuario, e alcuni vogliono assicurarsi che la casa sia costruita prima di tentare di affittarla.

    
risposta data 03.02.2016 - 07:07
fonte
1

Is there a reason why C#/JS require explicitly differentiating a declaration from assignment?

C'è, non vuoi che gli errori di battitura dichiarino nuove variabili, vuoi che non funzionino.

Ad esempio, considera il seguente codice Python:

someValue = 42
if someCondition:
    someVaule = 43;

Questo è chiaramente un bug causato da un errore di battitura, ma Python non impedisce di scrivere tale codice. C #, per garantire che gli errori di battitura non diventino bug.

    
risposta data 03.02.2016 - 22:54
fonte
0

Devi imparare più linguaggi di programmazione, c'è molto più di C # & Javascript e amp; C ++ e amp; Pitone. Quindi leggi il Programming Pragmatics di lingua di Scott & SICP (un ottimo libro introduttivo che ti insegnerebbe Scheme )

In particolare, variables in Ocaml, Scheme, Common Lisp, Haskell sono molto diversi da ciò che credi (o cosa sono in C ++, C #, Javascript). Si noti in particolare che in Ocaml, le variabili introdotte da alcuni let vincolanti non variano mai . E le variabili in Prolog sono anche molto diverse.

C'è anche il problema degli errori di battitura sulle variabili durante la digitazione del codice. Mi piacciono le lingue e le implementazioni in cui un errore di battitura (ad esempio fooo invece di foo ) dà immediatamente un po 'di diagnostica la maggior parte del tempo.

    
risposta data 03.02.2016 - 09:01
fonte

Leggi altre domande sui tag