0

私は長い間エラーを見つけようとしてきました、私はプログラミング言語をやっていて、ラグを使って次のコードを持っています、私はデータとしてブラケットを持つ構文オブジェクト(resto ...)を持っています、私はこの構文を変換します-データムへのオブジェクト:

   (let ([i (syntax->datum #'(resto ...))])
           (display "Content i:")
            (display i)
           (if (eq? i (string->symbol "(})"))
               (display "true")
               (display "false")
            )
   )

出力は次のとおりです。

Content: (})
false

しかし、私がこれを行う場合

   (for ([i (syntax->datum #'(resto ...))])
     (displayln "Content:")
     (displayln i)
     (if (eq? i (string->symbol "}"))
           (display "true")
           (display "false")
     )
   )

出力は次のとおりです。

Content: }
true

私の質問: ¿なぜ節 let の IF が FALSE なのですか? ¿私はこれらの 2 つのタイプを比較することができ、その結果は FOR なしで TRUE ですか?

関数に関するドキュメント:

構文 -> データム

4

1 に答える 1

1

コードの各部分は非常に異なることを行っています。それぞれを機能させる方法を紹介します。最初のものはlet、によって返されたリスト全体を変数に代入するために使用しsyntax->datum、その後、それを別のリストと比較します (equal?同等性をテストするために使用する方が適切です。より一般的です)。

(let ([i (syntax->datum #'(|}|))]) ; `i` contains `(})`
  (display "Content i: ")
  (displayln i)
  (if (equal? i '(|}|)) ; a list with a single element, the symbol `}`
      (displayln "true")
      (displayln "false")))

コードの 2 番目の部分はfor、シンボルが見つかるまで、リスト内の各要素を反復処理するために使用してい}ます。

(for ([i (syntax->datum #'(|}|))]) ; `i` contains `}`
  (display "Content i: ")
  (displayln i)
  (if (equal? i '|}|) ; the symbol `}`
      (displayln "true")
      (displayln "false")))

補足として、言語でこれらすべての中括弧を処理する方法には非常に注意する必要があります。それらは Racket{}では通常の括弧として解釈され、処理が難しくなります。()それらを垂直バーで囲むことでそれらをエスケープします。

于 2016-06-07T02:13:21.660 に答える