5

文字列を系列に変換する方法があれば知りたいです。解析を使用してデータを抽出しようとしています。キャプチャしたデータの一部を小さなフラグメントに分割して、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."]

私が理解しているように、「検索」はシリーズで機能します。これが、if ステートメントが期待した結果をもたらさない理由である可能性があります。ただし、変数「tag」は単なる文字列です。

文字列をシリーズに変換する方法はありますか? または、文字列で機能して部分文字列を見つける関数はありますか?

4

2 に答える 2

2

以下のステートメントは両方とも実行されますが、2 番目のステートメントは実行されるべきではありません。

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

これは非常に一般的な新規ユーザーの問題であり、当然のことです。

BLOCKについて覚えておくべき重要なこと!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 によって実行されるかどうかは、条件が true かどうかに依存するためです。IF は、そのブロックを DO するかどうかを決定する必要があります。

しかし、IF の最初の引数は条件です。条件が最終的に true になるか false になるかに関係なく、IF ステートメントがヒットするたびに実行する必要があります。したがって、条件にブロックの「ボイラープレート」はありません。このボイラープレートの欠如は、block-as-data をそれに渡すと、問題は「値として見られるデータのブロックは true か false か?」ということになります。まあ...それは本当です:

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

実際、NONE を除いて、すべての値は「条件付きで真」と見なされます。値または LOGIC! 間違い。ゼロでも真です。

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

Almost absolutely every value is true! 

したがって、条件を角括弧ブロックに入れたくありません。そのままにしておくか、括弧ブロック「グループ」を使用できます。括弧は評価されますが、評価された部分を分離します。これにより、優先順位や引数のチェックなどの目的で部分式を分離するのに役立ちます。そう:

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はその条件の周りにボイラープレート ブロックを強制するスタイルにすることができましたが(条件を 1 回評価するものには必要ない場合でも)、システムの目標の 1 つである不必要なボイラープレートに反撃することです。

幸いなことに、その背後にはロジックとルールがあります...一度把握すれば、独自のループ構造などを作成するために使用できます。「狂気だが、それには方法がある」:-)

文字列を系列に変換する方法があれば知りたいです。解析を使用してデータを抽出しようとしています。キャプチャしたデータの一部を小さなフラグメントに分割して、if、case、または switch ステートメントを実行できるようにしたいと考えています。

現在の用語では (他のケースでは少し混乱する可能性があります)、STRING! すでにSERIESのメンバーです!タイプセット。つまり、FIRST または SECOND で要素を選択する、または NEXT でトラバースするなどの操作を実行できます。それが SERIES です。

于 2015-05-09T00:20:55.823 に答える