如何允许Racket中的模块中存在重复定义?
我希望基本上允许程序重新定义标识符,当任何其他语句使用该标识符时,它将绑定到最新的标识符 例如,我想要这样的东西:如何允许Racket中的模块中存在重复定义?,racket,definition,identifier,Racket,Definition,Identifier,我希望基本上允许程序重新定义标识符,当任何其他语句使用该标识符时,它将绑定到最新的标识符 例如,我想要这样的东西: #lang racket (define x 3) (write x) (define x 5) (write x) 要输出35这是一个很难回答的问题,因为您可能有许多不同的原因想要这样做 1) 您希望能够更改绑定到的内容 在这种情况下,也许您会对set感到满意。e、 g: #lang racket (define x 3) (write x) (set! x 5) (write
#lang racket
(define x 3)
(write x)
(define x 5)
(write x)
要输出
35
这是一个很难回答的问题,因为您可能有许多不同的原因想要这样做
1) 您希望能够更改绑定到的内容
在这种情况下,也许您会对set感到满意代码>。e、 g:
#lang racket
(define x 3)
(write x)
(set! x 5)
(write x)
2) 您希望跨多个方案实现运行代码
在这种情况下,使用类似于#lang r5rs
的方法
3) 你会发现定义比设置更美观代码>
这里的答案更为复杂:Racket是一种可编程编程语言,您可以轻松地制作自己的Racket版本,该版本具有您想要的语义。然而,Racket被故意设计成不具有这种语义,因为阅读以这种风格编写的代码是困难的;在一个大文件和一种允许多个定义的语言中,读者可能很容易找到错误的定义,并认为它是唯一的定义
这有帮助吗?我想这可能有助于理解我这样做的理由是什么。我正在尝试将OCaml程序转换为Racket,因为这种行为在OCaml中是有效的,所以在Racket中也可以使用一种快速的方法。也就是说,我不太熟悉如何在Racket中编写用户语法规则、宏等。在Racket中是否可以将关键字绑定为“如果标识符未绑定,则使用define,否则,使用set!”@podington在最近的线程中尝试解决方案:实际上,当我想要修改预先存在的构造时,这会成为一个问题,例如==。好像定了!不允许这样做,而define允许这样做。@podington能够设置来自其他模块的代码>标识符将非常糟糕,因为它会调整其他模块的行为。听起来你其实并不想修改它们,只是给它们加上阴影。您可以使用(require(在…)中重命名)
导入=
,例如,原始-=
,然后定义您自己的=
。