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

有帮助吗?

解决方案

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

在其他语言中,某些库可能会覆盖您创建的定义。然而,Scheme的词汇范围加上PLT的模块系统确保了这种情况永远不会发生。

其他提示

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

您可以定义一个评估为常量的宏,这样可以保护您免受set!

的简单使用
(define-syntax constant
  (syntax-rules () 
    ((_) 25)))

然后你只需在任何地方使用(constant),这不再是* 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