Domanda

Come dichiaro che un simbolo rappresenterà sempre un valore particolare e non può essere modificato durante l'esecuzione del programma?

È stato utile?

Soluzione

Per quanto ne so, questo non è possibile in Scheme. E, a tutti gli effetti, non è strettamente necessario. Basta definire il valore al livello superiore come una variabile normale e quindi non modificarlo . Per aiutarti a ricordare, puoi adottare una convenzione per nominare questo tipo di costanti: ho visto libri in cui le variabili di livello superiore sono definite con * stars * attorno al loro nome.

In altre lingue, c'è il pericolo che alcune librerie abbiano la precedenza sulla definizione che hai creato. Tuttavia, l'ambito lessicale di Scheme accoppiato con il sistema di moduli PLT assicura che ciò non accada mai.

Altri suggerimenti

Nello schema PLT, scrivi le tue definizioni nel tuo modulo - e se il tuo codice non usa `set! ', l'associazione non potrà mai cambiare. In effetti, il compilatore lo utilizza per eseguire varie ottimizzazioni, quindi questa non è solo una convenzione.

Potresti definire una macro che valuta la costante, che ti proteggerebbe dai semplici usi di set!

(define-syntax constant
  (syntax-rules () 
    ((_) 25)))

Quindi usi (costante) ovunque, che non è più una battitura di * costante *

Una risposta davvero da hacker a cui ho pensato è stata quella di definire una macro di lettore che restituisca la tua costante:

#lang racket
(current-readtable 
  (make-readtable (current-readtable)
                  #\k 'dispatch-macro (lambda (a b c d e f) 5)))

#k ;; <-- is read as 5

Sarebbe quindi impossibile ridefinire questo (senza cambiare la macro del lettore):

(set! #k 6) ;; <-- error, 5 is not an identifier
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top