之间有什么区别
a: [b 1]
; and
a: [b: 1]
两者都给出相同的结果
> a/b
1
不过,它们对于
a/1
有所不同。你什么时候用什么?第二个是一组,第一个是什么?
最佳答案
the 2nd is a set, what is the 1st?
您可以通过查看类型来获得答案:
>> type? first [b 1]
== word!
>> type? first [b: 1]
== set-word!
What is the difference
当您使用表达式
a/b
时,您正在编写一些类似于 SELECT 语句的内容,在 b
指示的块中查找与 a
匹配的“任何单词类型”,然后在块中返回它之后的项目。Red 遵循 Rebol 的传统——默认路径选择是 SELECT 的“非严格”形式,它使用“非严格”形式的平等
>> (first [a:]) = (first [a]) ;-- default comparison
true
>> select [b 1] (quote b)
== 1
>> select [b: 1] (quote b)
== 1
要获得区分差异的严格行为,您需要使用/CASE 细化(在“区分大小写”的意义上):
>> (first [a:]) == (first [a]) ;-- strict comparison
true
>> select/case [b: 1] (quote b)
== none
>> select/case [b: 1] (quote b:)
== 1
Red 似乎至少比 R3-Alpha 更一致一点,例如尊重 1% 和 0.01 的相等性:
>> 1% = 0.01
== true ;-- both R3-Alpha and Red
>> select [0.01 "test"] 1%
== "test" ;-- in Red
>> select [0.01 "test"] 1%
== none ;-- in R3-Alpha
但它表明平等语义背后有一段有点狡猾的历史。
When do you use what?
好问题。 :-/在你的源代码中,你应该使用你觉得最适合你想要表达的东西的符号。如果你觉得一个SET-WORD!是合适的然后使用它,否则使用 WORD!。在实现方面,有一些细微差别超出了简单答案的范围(例如,本地人聚集在 FUNCTION 中)。如果您知道最终需要将某些内容转换为作业,则使用 SET-WORD 可能会有所帮助。
在我看来,路径评估是粗略的。它作为一种语法便利而出现,但随后为从其他类型中选择的每种类型产生了行为的叉积。更不用说函数工作方式的差异了(
x: :append/dup/only/10/a
是什么意思?)小例子:路径! Rebol 中的行为使用启发式方法,如果您正在评估路径,如果路径组件是整数,它将充当 PICK:
>> numbers: [3 2 1]
>> pick numbers 3
== 1 ;-- because the 3rd element is a 1
>> select numbers 3
== 2 ;-- because 2 comes after finding a 3
>> numbers/3
== 1 ;-- acts like PICK because (...)/3 uses an INTEGER!
...但如上所述,如果选择的内容是 WORD,它将像 SELECT(非严格)一样!:
>> words: [a b c]
>> select words 'a
== b ;-- because b is the thing after a in the block
>> pick words 'a
;-- In Rebol this is an error, Red gives NONE at the moment
>> words/a
== b ;-- acts like SELECT because (...)/a uses a WORD!
所以 SELECT 和 PICK 之间的差异解释了您所看到的差异。
对于其他类型,它变得更奇怪。路径绝对是古怪的,并且可以使用某种大的统一理论。
关于rebol - `a: [b 1]` 和 `a: [b: 1]` 之间有什么区别,红色的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40095593/