如何将 Red/Rebol 字符串转换为系列
How to Convert a Red/Rebol String into a Series
我想知道是否有办法将字符串转换为系列。我正在尝试使用解析提取数据,并且我想将一些捕获的数据分解成更小的片段,以便我可以执行 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" 只是一个字符串。
有没有办法把一个字符串转换成一个系列?或者是否有任何函数可以在字符串上查找子字符串?
在 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."]
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."]
这是一个非常常见的新用户问题,可以理解。
关于 BLOCK 的重要事项!是一个块是 "just data" 除非你(或你调用的函数)"bring that block to life" 通过用 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作为一个值传入,因为它是否会被IF"brought to life"和运行取决于条件是否为真。 IF 必须决定是否执行该块。
但是 IF 的第一个参数是条件。无论条件最终是真还是假,每次 IF 语句被命中时它都必须是 运行。因此,在该条件下没有块的 "boilerplate"。缺少样板文件意味着如果您将块作为数据传递给它,那么问题就归结为 "is a block of data, seen as a value, true or false?" 好吧......这是真的:
>> true? [some arbitrary block]
== true
事实上,除了 NONE 之外,所有值都被视为 "conditionally true"!价值或逻辑!错误的。偶数为零:
>> 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 could 已被设计为在其条件周围强制执行样板块 (即使对于一次性评估条件的东西来说不是必需的),反击不必要的样板是系统的目标之一。
好消息是它背后有一个逻辑和规则...一旦掌握了它,您就可以用来制作自己的循环结构等等。 "Madness, but there is a method to it.":-)
I would like to know if there is a way to convert a string into a series.
I'm trying to extract data using parse, and I want to break some of that
captured data down into smaller fragments so that I can do if, case or
switch statement.
在今天的术语中(在其他情况下可能有点混乱),一个字符串!已经是SERIES的成员了!排版。也就是说,您可以执行诸如使用 FIRST 或 SECOND 从中挑选元素,或使用 NEXT 遍历等操作。这就是 SERIES。
我想知道是否有办法将字符串转换为系列。我正在尝试使用解析提取数据,并且我想将一些捕获的数据分解成更小的片段,以便我可以执行 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" 只是一个字符串。
有没有办法把一个字符串转换成一个系列?或者是否有任何函数可以在字符串上查找子字符串?
在 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."]
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."]
这是一个非常常见的新用户问题,可以理解。
关于 BLOCK 的重要事项!是一个块是 "just data" 除非你(或你调用的函数)"bring that block to life" 通过用 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作为一个值传入,因为它是否会被IF"brought to life"和运行取决于条件是否为真。 IF 必须决定是否执行该块。
但是 IF 的第一个参数是条件。无论条件最终是真还是假,每次 IF 语句被命中时它都必须是 运行。因此,在该条件下没有块的 "boilerplate"。缺少样板文件意味着如果您将块作为数据传递给它,那么问题就归结为 "is a block of data, seen as a value, true or false?" 好吧......这是真的:
>> true? [some arbitrary block]
== true
事实上,除了 NONE 之外,所有值都被视为 "conditionally true"!价值或逻辑!错误的。偶数为零:
>> 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 could 已被设计为在其条件周围强制执行样板块 (即使对于一次性评估条件的东西来说不是必需的),反击不必要的样板是系统的目标之一。
好消息是它背后有一个逻辑和规则...一旦掌握了它,您就可以用来制作自己的循环结构等等。 "Madness, but there is a method to it.":-)
I would like to know if there is a way to convert a string into a series. I'm trying to extract data using parse, and I want to break some of that captured data down into smaller fragments so that I can do if, case or switch statement.
在今天的术语中(在其他情况下可能有点混乱),一个字符串!已经是SERIES的成员了!排版。也就是说,您可以执行诸如使用 FIRST 或 SECOND 从中挑选元素,或使用 NEXT 遍历等操作。这就是 SERIES。