Scheme 如何在PLT方案中定义常数?

Scheme 如何在PLT方案中定义常数?,scheme,racket,Scheme,Racket,我如何声明一个符号将始终代表一个特定的值,并且在整个程序执行过程中不能更改?据我所知,这在Scheme中是不可能的。而且,无论出于何种目的,这都不是绝对必要的。只需像常规变量一样在顶层定义值,然后不要更改它。为了帮助您记住,您可以采用一种命名这类常量的约定——我看过一些书,其中顶级变量的名称周围有*stars* 在其他语言中,存在一种危险,即某些库将覆盖您创建的定义。然而,Scheme的词法作用域与PLT的模块系统相结合,确保了这种情况永远不会发生。您可以定义一个计算结果为常量的宏,这将保护您不

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

据我所知,这在Scheme中是不可能的。而且,无论出于何种目的,这都不是绝对必要的。只需像常规变量一样在顶层定义值,然后不要更改它。为了帮助您记住,您可以采用一种命名这类常量的约定——我看过一些书,其中顶级变量的名称周围有
*stars*


在其他语言中,存在一种危险,即某些库将覆盖您创建的定义。然而,Scheme的词法作用域与PLT的模块系统相结合,确保了这种情况永远不会发生。

您可以定义一个计算结果为常量的宏,这将保护您不被简单使用
set

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

然后,您只需在任何地方使用
(常量)
,这与PLT方案中的*constant*

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

我想到的一个非常粗糙的答案是定义一个返回常量的读取器宏:

#lang racket
(current-readtable 
  (make-readtable (current-readtable)
                  #\k 'dispatch-macro (lambda (a b c d e f) 5)))

#k ;; <-- is read as 5
#朗球拍
(当前可读表)
(使可读(当前可读)
#\k'分派宏(lambda(a b c d e f)5)

#k;;在普通的Lisp语言中,通常用星号表示顶级变量,+加号+表示常量。我不使用Lisp语言编程,我一直想知道*的约定。谢谢你清理。很高兴看到你在stackoverflow听到,先生。
(set! #k 6) ;; <-- error, 5 is not an identifier