Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何允许Racket中的模块中存在重复定义?_Racket_Definition_Identifier - Fatal编程技术网

如何允许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(在…)中重命名)
导入
=
,例如,
原始-=
,然后定义您自己的
=