I simboli non sono protetti perché non è necessario che lo siano. Alcune lingue hanno nomi riservati perché la loro sintassi non può tollerare di avere una classe chiamata "classe", anche se tecnicamente si potrebbe evitarlo. A volte è fatto apposta per evitare l'ambiguità nella mente del programmatore e, veramente, ridefinendo -
per significare +
è il tipo di cose che in teoria sarebbero davvero disastrose. Tuttavia, questo fa parte di un ambiente dinamico, dove a volte questo tipo di flessibilità è utile.
Questi problemi spariscono quando si utilizzano diversi spazi dei nomi, in modo che mypackage:+
sia diverso da yourpackage:+
(gli usi non qualificati di +
possono essere controllati durante lo sviluppo per sapere quali simboli sono effettivamente utilizzati).
A proposito, il tuo esempio è in Scheme (lo hai etichettato come lisp in origine), ma Common Lisp è un po 'diverso in questo senso.
I simboli 978 nel pacchetto "COMMON-LISP" standardizzato non devono essere ridefiniti in un programma portatile (comportamento non definito se si esegue questa operazione). Un'implementazione come SBCL offre un modo per bloccare i pacchetti, per evitare modifiche accidentali. Certo, ti dà un modo per sbloccarli.
Questo non è un problema nella pratica perché generalmente non si vuole ridefinire gli operatori standard ma fornire il proprio operatore, definito nel proprio pacchetto.
I pacchetti sono di prima classe, puoi persino modificare quali simboli sono importati in un dato pacchetto, in modo che tu possa a volte cambiare la semantica di un programma esistente senza toccare i suoi file, semplicemente cambiando ciò che significa una funzione non qualificata +
( e ricompilare).
Questo è utile, ad esempio, per eseguire alcuni tipi di strumentazione , come differenziazione automatica . Sostituisci un gruppo di operatori perché vuoi calcolare le informazioni sul tuo programma, ad esempio.