红色的"a:[b 1]"和"a:[b:1]"之间的区别是什么?

Wol*_*ing 4 rebol red

有什么区别

a: [b 1]
; and
a: [b: 1]
Run Code Online (Sandbox Code Playgroud)

两者都给出相同的结果

> a/b
1
Run Code Online (Sandbox Code Playgroud)

但他们有所不同a/1.你什么时候用的?第二集是第一集,第一集是什么?

Hos*_*ork 9

第二集是什么,第一集是什么?

您可以通过查看类型来获得答案:

>> type? first [b 1]
== word!

>> type? first [b: 1]
== set-word!
Run Code Online (Sandbox Code Playgroud)

有什么不同

当您使用表达式时,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
Run Code Online (Sandbox Code Playgroud)

为了获得区分的严格行为,您需要使用/ CASE细化(在"区分大小写"的意义上):

>> (first [a:]) == (first [a]) ;-- strict comparison
true

>> select/case [b: 1] (quote b)
== none

>> select/case [b: 1] (quote b:)
== 1
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但它表明,平等语义背后有一些狡猾的历史.

你什么时候用的?

好问题.: - /在您的来源中使用符号,您应该使用您认为最适合您想表达的内容.如果你认为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!
Run Code Online (Sandbox Code Playgroud)

...但是如上所述,如果选择的东西是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!
Run Code Online (Sandbox Code Playgroud)

因此,SELECT和PICK之间的区别在于您所看到的差异.

它对其他类型更加怪异.路径绝对是古怪的,可以使用某种宏大的统一理论.