Sway 参考手册/组合基本类型
就像基本类型本身一样,基本类型的组合也是表达式。例如,假设你忘记了你的乘法表,不确定 8 乘以 7 是 54 还是 56。我们可以问 Sway,向解释器呈现表达式
sway> 8 * 7; INTEGER: 56
和以前一样,分号表示表达式的结束。乘号 * 被称为运算符,因为它操作 8 和 7,产生一个等价的基本类型值。8 和 7 被称为操作数。似乎各种操作数的实际名称不再被教授了,所以为了怀旧,这里有它们。乘号左侧的操作数(在本例中为 8)被称为被乘数。右侧的操作数(在本例中为 7)被称为乘数。结果被称为积。
其他基本运算符的操作数也有特殊的名称。对于加法,左侧操作数被称为被加数,右侧操作数被称为加数。结果被称为和。对于减法,左侧操作数是被减数,右侧是减数,结果是差。最后,对于除法(我认为这仍然是教授的),左侧操作数是被除数,右侧操作数是除数,结果是商。
一般来说,运算符与其操作数之间用空格、制表符或换行符隔开,统称为空白[1]。
输入表达式 8*7; 将是一个错误,因为乘法运算符没有必要的空白。
事实上,Sway 总是接收一个表达式,并显示一个等价的基本表达式(例如,整数或实数)。所有 Sway 运算符都是二元的,意味着它们恰好对两个操作数进行运算。我们首先看一下数值运算符。
如果将两个事物加在一起有意义,你可能可以使用 + 运算符在 Sway 中执行此操作。例如
sway> 2 + 3; INTEGER: 5 sway> 1.9 + 3.1; REAL: 5.00000000000 sway> "hello" + "world" STRING: helloworld
可以看出,如果将两个整数加在一起,结果是一个整数。如果对两个实数做同样的事情,结果是一个实数。对字符串加字符串也是如此。当添加不同类型的对象时,事情变得更加有趣。将整数和实数(按任何顺序)加在一起,总是产生一个实数。
sway> 2 + 3.3; REAL: 5.30000000000 sway> 3.3 + 2; REAL: 5.30000000000
将整数和字符串(被加数为整数)加在一起,产生一个整数。加数字符串,如果可能的话,被解释为整数
sway> 2 + "3"; INTEGER: 5 sway> 2 + "3.3"; INTEGER: 5 sway> 2 + "hello"; INTEGER: 2
将整数和字符串(被加数为字符串)加在一起,产生一个整数。加数整数被解释为字符串
sway> "hello" + 2; INTEGER: "hello2" sway> "3" + 2; STRING: "32"
数字的减法、乘法和除法遵循与加法相同的规则。但是,这些运算符,按照定义,不适用于字符串[2]。
特别要注意的是,除法运算符对于整数操作数而言。考虑计算以下表达式
14 / 2
如果要求 Sway 解释器执行此任务,结果将如预期的那样为 7。但是,如果要求解释器计算表达式...
14 / 5
结果将是 2,而不是 2.8。根据上面的规则,整数除法总是返回一个整数,如果有小数部分,则会丢弃。请注意,以下所有六个表达式都计算为 2.8
14 / 5.0 14.0 / 5 14.0 / 5.0 14 / real(5) real(14) / 5 real(14) / real(5)
最后三个说明了转换函数的使用。在上面的情况下,整数在除法发生之前被转换为实数。
整数除法的补充是模运算符 %。虽然整数除法的结果是商,但模运算符的结果是余数。因此
14 % 5
计算结果为 4,因为 5 除以 14 剩下 4。为了检查这是否属实,可以要求解释器计算
14 / 5 * 5 + (14 % 5) == 14
这个复杂的表达式提出了问题“商乘以除数加上余数是否等于原始被除数?”。Sway 解释器将回答,确实如此。使用圆括号的原因是 Sway 算术运算符之间缺乏优先级,将在下一章中详细解释。
计算机程序中的空白(制表符、换行符和空格)有两个目的。首先是使语言中的表达式赏心悦目。第二,空白通常表示一个基本类型的结束。与许多编程语言不同,Sway 使用空白来表示运算符的结束。因此,8 * 7 被解释为由 * 运算符隔开的两个数字,而 8*7(没有空格)将被认为是“错误的数字”。我们将在稍后了解变量。
还记得布尔基本类型 :true 和 :false 吗?我们可以使用布尔比较运算符生成这样的值。例如,我们可以询问 3 是否小于 4
sway> 3 < 4; SYMBOL: :true
解释器的响应表明,确实,3 小于 4。如果不是,解释器将响应 :false。除了 <(小于)之外,还有其他布尔比较运算符:<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)和 !=(不等于)。
除了整数之外,我们还可以使用小于或大于之类的运算符比较实数与实数,比较字符串与字符串。一般来说,比较整数或实数与字符串是非法的。
任何 Sway 类型都可以使用 == 和 != 比较运算符与任何其他类型进行比较。如果使用这些运算符比较整数与实数,则在进行比较之前,整数将被转换为实数。在其他情况下,使用 == 比较不同类型将产生 :false 值。相反,使用 != 比较不同类型将产生 :true(上述例外是整数与实数的比较)。如果类型匹配,则 == 仅当值也匹配时才产生 true。运算符 != 也会相应地执行。
我们可以使用布尔逻辑连接词 &&(和)和 ||(或)组合比较。
sway> 3 < 4 && 4 < 5; SYMBOL: :true sway> 3 < 4 || 4 < 5; SYMBOL: :true sway> 3 < 4 && 5 < 4; SYMBOL: :false sway> 3 < 4 || 5 < 4; SYMBOL: :true
第一个交互询问表达式3 < 4和表达式4 < 5是否都为真。由于两者都为真,解释器响应 :true。第二个交互询问至少一个表达式是否为真。同样,解释器响应 :true。&& 和 || 之间的区别在最后两个交互中得到说明。由于只有一个表达式为真(后一个表达式为假),因此只有 || 运算符产生真值。
还有一个布尔逻辑运算,称为非。它只是反转附加到它的表达式的值。非运算符只能作为函数调用(因为它不是二元运算符)。由于你还不了解函数,我会向你展示它的外观,但不会解释它的操作。
sway> not(3 < 4 && 4 < 5); SYMBOL: :false sway> not(3 < 4 || 4 < 5); SYMBOL: :false sway> not(3 < 4 && 5 < 4); SYMBOL: :true sway> not(3 < 4 || 5 < 4); SYMBOL: :false
请注意,我们已经将非附加到之前涉及逻辑连接词的每个表达式。另请注意,解释器的响应在每种情况下都与之前相反。
- ↑ 计算机科学家在写年度报告时,经常将他们所做和正在报告的事物称为暗空间。拥有大量的暗空间总是好的!
- ↑ 这并不意味着你永远不能减去字符串。稍后你将学习如何覆盖 Sway 的减号运算符,这样你就可以随心所欲地减去奇怪的东西。