문제

기호는 항상 특정 값을지지하며 프로그램 실행을 통해 변경 될 수 없다고 선언하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

내가 아는 한, 이것은 체계에서는 불가능합니다. 그리고 모든 의도와 목적을 위해 엄격하게 필요하지 않습니다. Toplevel의 값을 일반 변수처럼 정의 한 다음 변경하지 마십시오. 당신이 기억하기 위해, 당신은 이러한 종류의 상수를 지명하기위한 컨벤션을 채택 할 수 있습니다 - 나는 toplevel 변수가 정의되는 책을 보았습니다. *stars* 그들의 이름 주위.

다른 언어에서는 일부 라이브러리가 생성 한 정의를 무시할 위험이 있습니다. 그러나 PLT의 모듈 시스템과 함께 Scheme의 어휘 스코핑은 이것이 결코 일어나지 않을 것입니다.

다른 팁

PLT 체계에서는 자신의 모듈에 정의를 작성합니다. 자신의 코드가 'set!'을 사용하지 않으면 바인딩이 변경 될 수 없습니다. 실제로 컴파일러는이를 사용하여 다양한 최적화를 수행하므로 이는 단순한 컨벤션이 아닙니다.

상수로 평가하는 매크로를 정의 할 수 있으며, 이는 간단한 사용으로부터 보호 할 수 있습니다. set!

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

그럼 당신은 그냥 사용합니다 (constant) 모든 곳에서는 *상수 *보다 더 많이 타이핑하지 않습니다 *

내가 생각했던 정말 해킹 된 대답은 당신의 상수를 반환하는 독자 매크로를 정의하는 것이 었습니다.

#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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top