如何声明符号始终代表特定值,并且在整个程序执行过程中无法更改?
答案 0 :(得分:8)
据我所知,这在Scheme中是不可能的。并且,出于所有意图和目的,它并非绝对必要。只需在常规变量中定义顶层的值,然后不要更改它。为了帮助你记住,你可以采用一种约定来命名这些常量 - 我已经看过书中的顶层变量是用*stars*
来定义的。
在其他语言中,某些库可能会覆盖您创建的定义。然而,Scheme的词汇范围加上PLT的模块系统确保了这种情况永远不会发生。
答案 1 :(得分:5)
在PLT Scheme中,您可以在自己的模块中编写定义 - 如果您自己的代码不使用`set!',那么绑定永远不会改变。实际上,编译器使用它来执行各种优化,因此这不仅仅是一种约定。
答案 2 :(得分:2)
您可以定义一个评估为常量的宏,这样可以保护您免受set!
的简单使用
(define-syntax constant
(syntax-rules ()
((_) 25)))
然后你只需在任何地方使用(constant)
,这不再是* constant *
答案 3 :(得分:1)
我想到的一个非常苛刻的答案是定义一个返回常量的读取器宏:
#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