2009-06-24 2 views

Antwort

8

Soweit ich weiß, ist dies in Schema nicht möglich. Und für alle Absichten und Zwecke ist es nicht unbedingt notwendig. Definieren Sie einfach den Wert in der obersten Ebene wie eine reguläre Variable und ändern Sie sie nicht . Damit Sie sich daran erinnern können, können Sie eine Konvention zum Benennen dieser Art von Konstanten übernehmen. Ich habe Bücher gesehen, in denen Toplevel-Variablen mit *stars* um ihren Namen definiert sind.

In anderen Sprachen besteht die Gefahr, dass einige Bibliotheken die von Ihnen erstellte Definition überschreiben. Das lexikalische Scoping von Scheme in Verbindung mit dem PLT-Modulsystem stellt jedoch sicher, dass dies nie passieren wird.

+7

In Common Lisp werden normalerweise * Sterne * für Toplevel-Variablen verwendet, + Pluszeichen + werden für Konstanten verwendet. – Svante

+0

Ich programmiere nicht in Lisp und ich habe mich immer über die * Konvention gewundert. Danke, dass du es gelöscht hast. – unj2

2

Sie könnten ein Makro definieren, die auf die Konstanten ausgewertet, die Sie gegen eine einfache Nutzung von set!

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

Dann schützen würden Sie (constant) einfach überall verwenden, die als nicht mehr Typisierung * Konstante *

5

In PLT Scheme schreiben Sie Ihre Definitionen in Ihr eigenes Modul - und wenn Ihr eigener Code nicht `set! 'Verwendet, kann sich die Bindung niemals ändern. Tatsächlich verwendet der Compiler verschiedene Optimierungen, so dass dies nicht nur eine Konvention ist.

+0

Schön zu sehen, dass Sie bei stackoverflow hören, Sir. – unj2

1

Eine wirklich hackish Antwort, die ich dachte, war ein Leser Makro zu definieren, die Ihre Konstante zurückgibt:

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

#k ;; <-- is read as 5 

Es wäre dann unmöglich sein, diese neu zu definieren (ohne Ihre Leser Makro zu ändern):

(set! #k 6) ;; <-- error, 5 is not an identifier