你如何在PLT计划中定义一个常量?

时间:2009-06-24 00:13:47

标签: scheme racket

如何声明符号始终代表特定值,并且在整个程序执行过程中无法更改?

4 个答案:

答案 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