如何在PLT方案中定义常量?

发布于 2024-07-25 17:53:54 字数 35 浏览 2 评论 0原文

如何声明符号始终代表特定值并且在程序执行过程中不能更改?

How do I declare that a symbol will always stand for a particular value and cannot be changed throughout the execution of the program?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

绝不服输 2024-08-01 17:53:54

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

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

As far as I know, this isn't possible in Scheme. And, for all intents and purposes, it's not strictly necessary. Just define the value at the toplevel like a regular variable and then don't change it. To help you remember, you can adopt a convention for naming these kinds of constants - I've seen books where toplevel variables are defined with *stars* around their name.

In other languages, there is a danger that some library will override the definition you've created. However, Scheme's lexical scoping coupled with PLT's module system ensure this will never happen.

世界如花海般美丽 2024-08-01 17:53:54

在 PLT 方案中,您在自己的模块中编写定义 - 如果您自己的代码没有使用“set!”,则绑定永远不会改变。 事实上,编译器使用它来执行各种优化,因此这不仅仅是一个约定。

In PLT Scheme, you write your definitions in your own module -- and if your own code is not using `set!', then the binding can never change. In fact, the compiler uses this to perform various optimizations, so this is not just a convention.

酒解孤独 2024-08-01 17:53:54

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

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

然后您只需在任何地方使用 (constant) 即可,这与打字无关*持续的 *

You could define a macro that evaluates to the constant, which would protect you against simple uses of set!

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

Then you just use (constant) everywhere, which is no more typing than *constant *

悲念泪 2024-08-01 17:53:54

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

#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

A really hackish answer that I thought of was to define a reader macro that returns your 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

It would then be impossible to redefine this (without changing your reader macro):

(set! #k 6) ;; <-- error, 5 is not an identifier
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文