如何将Red / Rebol字符串转换为系列

时间:2015-05-08 21:11:21

标签: string block series rebol red

我想知道是否有办法将字符串转换为系列。我正在尝试使用parse提取数据,我想将一些捕获的数据分解为更小的片段,以便我可以执行IF,CASE或SWITCH语句。

下面是一些代码。

; A line of text with simple markup
current-line: {[chapter 1] The Wanderer}

; Parse the current line of input
parse current-line [
  "["
  copy tag to "]"
  skip
  copy rest-of-line to end
]

; Just some output to see if i captured data properly
print ["Extracted: " tag]
print ["Rest of line: " rest-of-line]

; The statements below both execute
; but the second one definitely shouldn't execute.
if [find tag  "chapter"] [print "The tag is chapter."]
if [find tag  "list"]    [print "The tag is list."]

据我了解,“find”适用于一系列,这可能就是为什么那些if语句没有给出我期望的结果。但是变量“tag”只是一个字符串。

有没有办法将字符串转换为系列?或者是否有任何函数可以在字符串上查找子字符串?

2 个答案:

答案 0 :(得分:2)

在Rebol中,字符串!是系列的子类型!所以任何可以在系列中运行的东西!会接受一个字符串!:

>> X: {Foo}
== "Foo"
>> type? X
== string!
>> series? X
== true

>> find X {o}
== "oo"

' if的第一个参数被视为逻辑!,但你在一个块中传递! - 这将永远是真的:

>> to-logic []
== true

您要做的是在将查找传递给if之前对其进行评估。只需删除[]

即可
if find tag  "chapter" [print "The tag is chapter."]
if find tag  "list"    [print "The tag is list."]

答案 1 :(得分:2)

  

下面的陈述都执行,但第二个绝对不应该执行。

if [find tag  "chapter"] [print "The tag is chapter."]
if [find tag  "list"]    [print "The tag is list."]

这是一个非常常见的新用户问题,这是可以理解的。

关于BLOCK的一个关键要记住!是一个块是"只是数据"除非你(或你所称的功能)"把这个块带到生活中#34;通过DO执行它。看看IF的帮助:

>> help if

USAGE:
    if cond then-blk

DESCRIPTION:
    If condition is true, evaluate block; else return NONE.
    if is of type: native!

ARGUMENTS:
    cond [any-type!]
    then-blk [block!]

你必须将THEN-BLOCK作为一个值传递给它,因为它是否会被带到生活中#34;并由IF运行取决于条件是否为真。 IF必须决定是否进行该阻止。

但IF的第一个参数是条件。无论条件是真还是假,都必须在每次IF语句被触发时运行。因此,没有"样板"条件的块。缺少样板文件意味着如果你将一个块作为数据传递给它,那么问题归结为"是一个数据块,被视为一个值,是真还是假?"嗯......这是真的:

>> true? [some arbitrary block]
== true

事实上,所有的价值都被视为"有条件的真实"除了没有!价值还是LOGIC!假。即使是零也是如此:

>> if 0 [print "Almost absolutely every value is true!"]

Almost absolutely every value is true! 

因此,您不希望将您的病情置于方括号内。要么将其关闭,要么可以使用括号块" group"。括号会进行求值,但会对已评估的部分进行隔离,这可以帮助您将子表达式隔离出来,例如优先级或参数检查。所以:

if find tag "chapter" [print "The tag is chapter."]
if (find tag "list") [print "The tag is list."]

希望这是有道理的,但你总是要考虑评估模型,以了解使用或不使用块的动机。例如,WHILE循环与IF不同,因为它需要多次运行该条件。

>> x: 0
>> while x < 2 [ 
    print x 
    x: x + 1 
]

*** Script error: while does not allow logic for its cond argument

当定义WHILE时,必须对条件采取阻止。因为否则WHILE函数会将其第一个参数计算为TRUE,然后没有x < 2表达式来评估每次循环。所以:

>> x: 0
>> while [x < 2] [ 
    print x 
    x: x + 1 
]

0
1

你可能会犯错误;如果将WHILE转换为IF,它会特别容易。然而,虽然IF 可以被设计为围绕其条件强制执行样板块(即使对于一次评估条件的东西不是必需的),回到样板,其中不必要的是系统的目标之一。

好消息是它背后有一个逻辑和规则......一旦掌握了,你就可以用来制作自己的循环结构等等。 &#34;疯狂,但有一种方法。&#34; : - )

  

我想知道是否有办法将字符串转换为系列。   我试图使用解析来提取数据,我想打破其中一些   捕获数据到较小的片段,以便我可以做if,case或   切换声明。

在今天的术语中(在其他一些情况下可能有点令人困惑),一个STRING!已经是SERIES的成员了!排版。也就是说,您可以执行诸如使用FIRST或SECOND从中挑选元素或使用NEXT遍历它等操作。这就是SERIES的内容。