有什么区别
a: [b 1]
; and
a: [b: 1]
Run Code Online (Sandbox Code Playgroud)
两者都给出相同的结果
> a/b
1
Run Code Online (Sandbox Code Playgroud)
但他们有所不同a/1.你什么时候用的?第二集是第一集,第一集是什么?
第二集是什么,第一集是什么?
您可以通过查看类型来获得答案:
>> 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之间的区别在于您所看到的差异.
它对其他类型更加怪异.路径绝对是古怪的,可以使用某种宏大的统一理论.