rebol - `a: [b 1]` 和 `a: [b: 1]` 之间有什么区别,红色的?

标签 rebol red

之间有什么区别

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/

相关文章:

rebol - 如何在 Rebol 2 中对列表进行分区

pdf - 在 Rebol/Red 中创建 pdf 文件

list - Red 语言中的并行列表赋值

rebol - 检查 REBOL 字符串是否包含另一个字符串

rebol - 如何从二进制文件(图像)中删除所有 "black pixels"?

go - 哪种新语言最适合编写操作系统

recursion - 打破递归函数

rebol - 在 rebol 中读取不成功的 http 数据

user-interface - 红色语言可执行文件也打开控制台

rebol - 如何解析简单的xml文件