2009-06-24 58 views

回答

8

据我所知,这在Scheme中是不可能的。而且,对于所有意图和目的,这不是绝对必要的。只需像常规变量那样在顶层定义值,然后不会更改它。为了帮助你记住,你可以通过一个约定来命名这些常数 - 我已经看到书籍的顶层变量是用*stars*围绕它们的名字来定义的。

在其他语言中,有些库会覆盖您创建的定义。然而,Scheme的词汇范围界定与PLT的模块系统相结合确保了这一点永远不会发生。

+7

在Common Lisp中,通常* stars *用于顶层变量,+ plus-signs +用于常量。 – Svante 2009-06-24 01:46:44

+0

我不在Lisp中编程,我一直想知道*约定。感谢您清除它。 – unj2 2009-06-24 03:29:01

2

您可以定义计算结果为常量的宏,这将保护您免受简单的用途set!

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

然后你只需要使用(constant)无处不在,这是不超过打字*不变*

5

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

,我认为的
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