Avendo giocato con diversi linguaggi di scripting ed essendo un po 'un linguista, sembra esserci un modo per dividere le lingue digitate dinamicamente in due gruppi: le lingue che danno alle variabili un valore predefinito e le lingue che trattano l'accesso a un up-to -now variabile inutilizzata un errore.
Ad esempio, considera questo codice:
print(hi)
- In Lua, stampa
nil
- In PHP (con punto e virgola e
$
), non stampa nulla - In Perl (con punto e virgola e
$
), non stampa nulla (ma utilizzandosay
genera un errore)
Tuttavia,
- In Python getta un
NameError
- In Ruby, lancia un
NameError
(sembra che Ruby abbia cancellato il nome di Python per esso) - In Javascript, genera un
ReferenceError
- In Lisp, si verifica un errore che mi porta a un debugger (sto solo imparando Lisp ora, quindi non so come chiamarlo)
Inoltre, queste lingue si comportano diversamente quando si indicizza una mappa hash, un'operazione simile, e rientrano di nuovo in due campi (e quando dico "niente" intendo la rappresentazione di niente di quella lingua):
- Lua non restituisce nulla
- PHP non restituisce nulla
- Ruby non restituisce nulla
- Perl non restituisce nulla
- Lisp non restituisce nulla
- Javascript non restituisce nulla
Ma
- Python lancia un
KeyError
Quindi mi sto chiedendo quali sono i vantaggi e gli svantaggi comparativi di un linguaggio per rendere l'accesso a una variabile indefinita un errore o semplicemente restituire un valore predefinito, e anche quali decisioni porterebbero un disegnatore linguistico a scegliere un percorso o l'altro.