4

我如何声明一个符号将始终代表一个特定的值,并且在整个程序执行过程中不能更改?

4

4 回答 4

9

据我所知,这在 Scheme 中是不可能的。而且,出于所有意图和目的,这并不是绝对必要的。只需像常规变量一样在顶层定义值,然后不要更改它。为了帮助您记住,您可以采用约定来命名这些类型的常量 - 我看过一些书籍,其中顶级变量是用*stars*它们的名称定义的。

在其他语言中,存在某些库会覆盖您创建的定义的危险。然而,Scheme 的词法作用域加上 PLT 的模块系统确保这永远不会发生。

于 2009-06-24T00:58:56.450 回答
5

在 PLT Scheme 中,您在自己的模块中编写定义——如果您自己的代码没有使用 `set!',那么绑定永远不会改变。事实上,编译器使用它来执行各种优化,所以这不仅仅是一个约定。

于 2009-06-25T03:50:32.287 回答
2

您可以定义一个评估为常量的宏,这将保护您免受简单使用set!

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

然后你就(constant)在任何地方使用,它不会比 *constant * 更多的类型

于 2009-06-24T15:02:01.713 回答
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
于 2011-06-29T17:01:45.520 回答