2009-06-24 7 views

답변

8

제가 아는 한, 이것은 Scheme에서는 불가능합니다. 그리고 모든 의도와 목적을 위해, 그것은 꼭 필요한 것은 아닙니다. 최상위 변수의 값을 일반 변수처럼 정의한 다음 을 변경하지 마십시오.. 기억을 돕기 위해 이러한 상수 명명 규칙을 채택 할 수 있습니다. 최상위 변수의 이름이 *stars* 인 책을 보았습니다.

다른 언어에서는 일부 라이브러리가 생성 한 정의보다 우선 적용될 위험이 있습니다. 그러나 PLT의 모듈 시스템과 결합 된 Scheme의 어휘 범위 지정 (lexical scoping)은 결코 일어나지 않을 것입니다.

+7

커먼 리스프에서는 보통 별표 변수에 * 별 *이 사용되고 상수에는 + 더하기 기호 +가 사용됩니다. – Svante

+0

나는 Lisp에서 프로그램을 쓰지 않고 나는 항상 대회에 대해 궁금해했다. 그것을 지워 줘서 고마워. – unj2

2

당신은 그럼 당신은 단지보다는 더 이상 입력됩니다없는, 사방 (constant)를 사용 set!

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

의 간단한 사용으로부터 보호 할 상수로 평가되는 매크로를 정의 할 수 있습니다 * * 일정

5

PLT Scheme에서는 자신의 모듈에 정의를 작성하고, 자신의 코드가`set! '을 사용하지 않으면 바인딩을 변경할 수 없습니다. 실제로 컴파일러는이를 사용하여 다양한 최적화 작업을 수행하므로 단순한 규칙이 아닙니다. 내가 생각

+0

당신이 stackoverflow에서 들리는 것을 보니 반가워요. – unj2

1

정말 hackish 대답은 당신의 상수를 반환하는 리더 매크로를 정의했다 :

#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 
관련 문제