左结合编程语言的例子?
Example of programming language that is left associative?
我正在教一个朋友编程,但我很难说服他们 a = b
和 b = a
是两个截然不同的东西。
我最终找到了描述它的正确词语 (right associative),这让我开始思考。
有没有左结合的编程语言?我从未见过一种语言:
a = b
导致 b 被设置为 a 的值。
我不这么认为。尽管您总是可以重载赋值运算符并在您的 C++ 中造成完全混乱。
R 定义了 <-
和 ->
赋值运算符。
> b <- 42
> b -> a
> a
[1] 42
如果我们谈论 Operator associativity
,我们实际上应该考虑两种类型的 associativity
:side_associative
(例如 =
)或 non-associative
(例如 ==
) 因为对于机器来说,如果它是从左到右或从右到左的线,它没有任何区别。
没有这样的编程语言最初是 left associative
,但其中一些允许通过运算符重载,而一些(例如 R
)将同时允许:->
和 <-
.
我相信在欧洲没有人会喜欢它,但在中东可能会觉得它很可爱。我可以想象有 IDE
可以将右侧与左侧切换,但最后编译器是以欧洲方式编写的。
你误解了结合律。如果 (a op b) op c
等价于 a op (b op c)
,则运算符 op
是关联的。对于非关联运算符,a op b op c
代表前者还是后者变得很重要。因此我们区分左结合运算符,它是 (a op b) op c
,和右结合运算符,它是 a op (b op c)
.
大多数语言中的大多数运算符都是左结合的。以-
为例:a - b - c
在大多数语言中等同于(a - b) - c
,而不是a - (b - c)
。
赋值运算符是一个例外,因为 (a = b) = c
通常是不合法的(因为您不能对赋值结果进行赋值)。因此在大多数语言中 a = b = c
等同于 a = (b = c)
。一个值得注意的例外是 Python,其中 a = b = c
根本不关联并且完全是非法的。
None与a = b
和b = a
的区别有什么关系。由于这只涉及 =
运算符的一次使用,因此关联性根本不会考虑在内。相反,相关的 属性 是 commutativity:如果 a op b
等价于 b op a
,则运算符 op
是可交换的。我不知道任何语言的赋值是可交换的,我也不知道它是怎么回事。
不存在左交换性或右交换性等概念。据我所知,问题 "Does a = b
assign b
to a
or vice-versa?" 没有术语 - 这只是赋值运算符语义的一部分。
我正在教一个朋友编程,但我很难说服他们 a = b
和 b = a
是两个截然不同的东西。
我最终找到了描述它的正确词语 (right associative),这让我开始思考。
有没有左结合的编程语言?我从未见过一种语言:
a = b
导致 b 被设置为 a 的值。
我不这么认为。尽管您总是可以重载赋值运算符并在您的 C++ 中造成完全混乱。
R 定义了 <-
和 ->
赋值运算符。
> b <- 42
> b -> a
> a
[1] 42
如果我们谈论 Operator associativity
,我们实际上应该考虑两种类型的 associativity
:side_associative
(例如 =
)或 non-associative
(例如 ==
) 因为对于机器来说,如果它是从左到右或从右到左的线,它没有任何区别。
没有这样的编程语言最初是 left associative
,但其中一些允许通过运算符重载,而一些(例如 R
)将同时允许:->
和 <-
.
我相信在欧洲没有人会喜欢它,但在中东可能会觉得它很可爱。我可以想象有 IDE
可以将右侧与左侧切换,但最后编译器是以欧洲方式编写的。
你误解了结合律。如果 (a op b) op c
等价于 a op (b op c)
,则运算符 op
是关联的。对于非关联运算符,a op b op c
代表前者还是后者变得很重要。因此我们区分左结合运算符,它是 (a op b) op c
,和右结合运算符,它是 a op (b op c)
.
大多数语言中的大多数运算符都是左结合的。以-
为例:a - b - c
在大多数语言中等同于(a - b) - c
,而不是a - (b - c)
。
赋值运算符是一个例外,因为 (a = b) = c
通常是不合法的(因为您不能对赋值结果进行赋值)。因此在大多数语言中 a = b = c
等同于 a = (b = c)
。一个值得注意的例外是 Python,其中 a = b = c
根本不关联并且完全是非法的。
None与a = b
和b = a
的区别有什么关系。由于这只涉及 =
运算符的一次使用,因此关联性根本不会考虑在内。相反,相关的 属性 是 commutativity:如果 a op b
等价于 b op a
,则运算符 op
是可交换的。我不知道任何语言的赋值是可交换的,我也不知道它是怎么回事。
不存在左交换性或右交换性等概念。据我所知,问题 "Does a = b
assign b
to a
or vice-versa?" 没有术语 - 这只是赋值运算符语义的一部分。