Как вы определяете константу в схеме PLT? - PullRequest
4 голосов
/ 24 июня 2009

Как мне объявить, что символ всегда будет обозначать определенное значение и не может быть изменен во время выполнения программы?

Ответы [ 4 ]

8 голосов
/ 24 июня 2009

Насколько я знаю, в Схеме это невозможно. И, по сути, это не является строго необходимым. Просто определите значение на верхнем уровне как обычную переменную, а затем не меняйте его . Чтобы помочь вам вспомнить, вы можете принять соглашение об именовании таких констант - я видел книги, в которых переменные верхнего уровня определены с *stars* вокруг их имени.

В других языках существует опасность, что некоторая библиотека переопределит определение, которое вы создали. Однако лексическая область видимости Схемы в сочетании с модульной системой PLT гарантирует, что этого никогда не произойдет.

5 голосов
/ 25 июня 2009

В PLT Scheme вы пишете свои определения в своем собственном модуле - и если ваш собственный код не использует `set! ', То привязка никогда не изменится. Фактически, компилятор использует это для выполнения различных оптимизаций, так что это не просто соглашение.

2 голосов
/ 24 июня 2009

Вы можете определить макрос, который оценивает константу, которая защитит вас от простого использования set!

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

Тогда вы просто используете (constant) везде, что не более печатает, чем * constant *

1 голос
/ 29 июня 2011

По-настоящему хакерским ответом, о котором я подумал, было определение макроса читателя, который возвращает вашу константу:

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

#k ;; <-- is read as 5

Тогда было бы невозможно переопределить это (без изменения макроса читателя):

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