数组是类型还是值?
Is an array a type or a value?
我正在编写我自己的语言(只是为了好玩),我即将实现数组。
我将数组定义为具有固定最终长度且包含多个值的数据结构。所以他们应该像 Java 一样工作,即 C-like
数组应创建为:
nr[] a = [1, 2, 5, 3, 4]
其中 nr
是值的类型,a
是名称,[1, 2, 5, 3, 4]
是容器。
数组应按名称传递给函数:
main {
nr[] a = [1, 2, 5, 3, 4]
printArray(a)
}
func printArray(array):
print(array)
或字面意思
main:
printArray([1, 2, 5, 3, 4])
func printArray(array):
print(array)
该语言包含三种主要数据类型,bool、text 和 nr,以及 var 关键字,它根据值设置类型。数组可以在方法之间传递,也可以像变量一样存储值本身。
我称存储值的事物为文字(5,“text”或 false),或名称(a = 10),或调用(function()),“ValueHolders”,因为它们都持有一个具体值。
现在回答我的问题:我的数组是 ValueHolder 还是数据类型,还是我必须为此想出一些全新的东西?
请使用其他语言的示例,我很想了解更多!
编辑;举几个例子:
- 带有数组括号的类型是“数组类型”:
nr[] a = ...
该声明后面的任何内容都会隐式转换为 nr 数组。
- Arraybrackets with values/calls 创建一个“arrayliteral”:
["a", b(), [1, 2, 3]]
这是一个可变数组,数组中值的类型未知。没有办法提前找出这些值共享哪些类型,因为在该行被执行之前没有生成。为什么?如果此数组中的值是函数的 return 值,则必须调用该函数,并且在非函数式语言中,这可能会改变程序的整个结构。
- 函数可以将数组设置为 return 值:
func a() -> nr:
这只是意味着:将每个 return 值转换为 nr 数组。如果这不起作用,则 return 值无效,程序将抛出运行时异常。 (我知道这不是最简洁的方法,但是 return类型是可选的,更像是一个指南,而不是严格的规则。)
我想你想知道什么,真的取决于上下文,因为 var[]
与 [1, 2, 3]
的目的完全不同。
用你的话来说:
- 容器
[val1, val2, ...]
是一个ValueHolder,因为它可以传递给函数和声明。它 returns 一个数组值。
- 如果您将数组定义为
var[] array = ...
,“数组”也是一个 ValueHolder,returns 也是一个数组值。
var[] a = ...
是一种声明类型,它告诉 =
. 之后的值需要哪种类型
a[1] = ...
是数组访问,但既不是 ValueHolder,也不是声明。
function(a[2])
是另一个数组访问,但是这次,它持有一个返回值。将其想象成类似于函数调用的东西。
对于您的语言,您必须分别处理这些情况,它们都有不同的含义。祝你好运:)
我正在编写我自己的语言(只是为了好玩),我即将实现数组。 我将数组定义为具有固定最终长度且包含多个值的数据结构。所以他们应该像 Java 一样工作,即 C-like
数组应创建为:
nr[] a = [1, 2, 5, 3, 4]
其中 nr
是值的类型,a
是名称,[1, 2, 5, 3, 4]
是容器。
数组应按名称传递给函数:
main {
nr[] a = [1, 2, 5, 3, 4]
printArray(a)
}
func printArray(array):
print(array)
或字面意思
main:
printArray([1, 2, 5, 3, 4])
func printArray(array):
print(array)
该语言包含三种主要数据类型,bool、text 和 nr,以及 var 关键字,它根据值设置类型。数组可以在方法之间传递,也可以像变量一样存储值本身。
我称存储值的事物为文字(5,“text”或 false),或名称(a = 10),或调用(function()),“ValueHolders”,因为它们都持有一个具体值。
现在回答我的问题:我的数组是 ValueHolder 还是数据类型,还是我必须为此想出一些全新的东西?
请使用其他语言的示例,我很想了解更多!
编辑;举几个例子:
- 带有数组括号的类型是“数组类型”:
nr[] a = ...
该声明后面的任何内容都会隐式转换为 nr 数组。
- Arraybrackets with values/calls 创建一个“arrayliteral”:
["a", b(), [1, 2, 3]]
这是一个可变数组,数组中值的类型未知。没有办法提前找出这些值共享哪些类型,因为在该行被执行之前没有生成。为什么?如果此数组中的值是函数的 return 值,则必须调用该函数,并且在非函数式语言中,这可能会改变程序的整个结构。
- 函数可以将数组设置为 return 值:
func a() -> nr:
这只是意味着:将每个 return 值转换为 nr 数组。如果这不起作用,则 return 值无效,程序将抛出运行时异常。 (我知道这不是最简洁的方法,但是 return类型是可选的,更像是一个指南,而不是严格的规则。)
我想你想知道什么,真的取决于上下文,因为 var[]
与 [1, 2, 3]
的目的完全不同。
用你的话来说:
- 容器
[val1, val2, ...]
是一个ValueHolder,因为它可以传递给函数和声明。它 returns 一个数组值。 - 如果您将数组定义为
var[] array = ...
,“数组”也是一个 ValueHolder,returns 也是一个数组值。 var[] a = ...
是一种声明类型,它告诉=
. 之后的值需要哪种类型
a[1] = ...
是数组访问,但既不是 ValueHolder,也不是声明。function(a[2])
是另一个数组访问,但是这次,它持有一个返回值。将其想象成类似于函数调用的东西。
对于您的语言,您必须分别处理这些情况,它们都有不同的含义。祝你好运:)