Global variables Ocaml-全局变量与局部变量
我想创建一个名为result的全局变量,它使用5个字符串连接来创建一个字符串,该字符串包含字符串开始的9倍,以逗号分隔。 我有两段代码,只有第二段声明了一个全局变量。 由于某些原因,它不容易在我的大脑中注册。。。只是因为我使用了一个let,所以第一段代码中的结果是一个局部变量吗?对此有更详细的解释吗Global variables Ocaml-全局变量与局部变量,global-variables,ocaml,local-variables,Global Variables,Ocaml,Local Variables,我想创建一个名为result的全局变量,它使用5个字符串连接来创建一个字符串,该字符串包含字符串开始的9倍,以逗号分隔。 我有两段代码,只有第二段声明了一个全局变量。 由于某些原因,它不容易在我的大脑中注册。。。只是因为我使用了一个let,所以第一段代码中的结果是一个局部变量吗?对此有更详细的解释吗 let start = "ab";; let result = start ^ "," in let result = result ^ result in let result = re
let start = "ab";;
let result = start ^ "," in
let result = result ^ result in
let result = result ^ result in
let result = result ^ result in
let result = result ^ start in
result;;
- : string = "ab,ab,ab,ab,ab,ab,ab,ab,ab"
let result =
let result = start ^ "," in
let result = result ^ result in
let result = result ^ result in
let result = result ^ result in
let result = result ^ start in
result;;
val result : string = "ab,ab,ab,ab,ab,ab,ab,ab,ab"
只是因为我使用了一个let-in
,所以第一段代码的结果是一个局部变量吗
差不多。定义全局变量的语法是
let variable=expression
,在中没有。定义局部变量的语法是let variable=expression in expression
,当您有let时,它将在in
中的之后定义表达式的变量
局部。。。在
中,您正在声明一个局部变量。当您仅拥有let
(在模块的顶层)时,您正在声明模块的全局名称。(即,可以从模块导出的名称。)
您的第一个示例完全由let。。。在
中。因此没有声明顶级名称
您的第二个示例本身有一个let
,后面有几个let。。。在
中。所以它声明了一个顶级名称result
让我成为一个有点无聊的人。OCaml中没有局部和全局变量。这个概念来自于具有不同范围规则的语言。此外,应注意“变量”一词本身。它的意思被类似C的语言歪曲了。这个词的原始数学含义对应于某个数学对象的名称,该名称在公式中使用,表示一系列此类值。在类C语言中,变量与内存单元混淆,内存单元可以随时间变化。因此,为了避免混淆,让我们使用更准确的术语。让我们使用单词name而不是variable。因为,变量。。。抱歉,名称不是存储单元,没有要创建的内容。当您使用let
语法之一时,实际上是在创建绑定,即名称和值之间的关联。let=in
在
表达式的范围内绑定的值。let=in
本身也是一个表达式,因此,例如
也可以包含let。。。在…
内部构造中,例如
let a = 1 in
let b = a + 1 in
let c = b + 1 in
a + b + c
我特别以非惯用的方式缩进代码,以突出表达式的语法结构。OCaml还允许使用已绑定到范围中的名称。新绑定将隐藏现有绑定(例如,在C中不允许),例如
最后,顶级(又称模块级)let绑定(用OCaml术语称为定义)的语法是:let=
,注意这里没有。定义将
绑定到从定义点延伸到封闭模块末尾的词法范围内的
求值结果。在实现模块时,必须使用let=
将代码绑定到名称(可以使用\u
忽略名称)。它与交互式顶层(interactiveocaml
程序)稍有不同,后者实际接受表达式并对其求值。比如说,
let result = start ^ "," in
let result = result ^ result in
let result = result ^ result in
let result = result ^ result in
let result = result ^ start in
result
不是有效的OCaml程序(可以放入ml
文件并编译的程序)。因为它是一个表达式,而不是一个模块定义
let result = start ^ "," in
let result = result ^ result in
let result = result ^ result in
let result = result ^ result in
let result = result ^ start in
result