2012-07-27 9 views
6

私はこの (define s (hi,there)) のようなものを持っているならば、私は (match s [(,h , ,t)] ...) のような試合 に書くことができます。しかしmatchので、私はこれをどのように行うことができます,を必要とするため、それは、動作していませんか?どのようにラケットの試合で一致するか?

+0

が迷惑コメントを許し値を持っていますが、それカンマを含む入力を解析するためにラケットの「一致」を使用すると、おそらく素晴らしいアイデアではないようです。入力の残りがラケット/ LISPに非常に非常に近い場合を除き、これは弾丸を噛んで実際のパーサを使用する場合のように聞こえます。あなたのユースケースを誤解している場合は、事前にお詫び申し上げます。 –

+0

@JohnClements私はあなたが正しいと思います。私の主なプログラムはRacketで書かれています。私は、Racketでファイルを解析して構築したデータ構造を取得したいだけです。ファイルはS-Expのように見えますが、非常に遅くまでコンマがあることがわかりました... –

+0

ソースファイルにどのような形式があるのか​​についての仕様はありますか?ソースファイルはよく知られた言語で書かれていますか? –

答えて

7

最初に、コンマ,は読者の略語であることに注意してください。 (hi,there)(hi (unquote there))と表示されています。これは、 のスポットがありません。デフォルトのプリンタでは、最初の要素が特別な方法でunquoteのリスト が印刷されるためです。

Welcome to DrRacket, version 5.3.0.14--2012-07-24(f8f24ff2/d) [3m]. 
Language: racket. 
> (list 'hi (list 'unquote 'there)) 
'(hi ,there) 

したがって、必要なパターンは '(list h(list' unquote t)) 'です。

> (define s '(hi,there)) 
> (match s [(list h (list 'unquote t)) (list h t)]) 
(list 'hi 'there) 
2

あなたが引用された部分の内部シンボルとしてカンマを使用したい場合は、バックスラッシュを使用します。

> (define s '(hi \, there)) 
> (match s [(list h c t) (symbol->string c)]) 
"," 

とスタンドアロンコンマシンボルの'|,|を使用しています。

> (match s [(list h '|,| t) (list h t)]) 
'(hi there) 

どちらの場合でも、実際には空白を使用して物を分け、リストを使用する必要があります。

(define s (hi,there))は有効なラケットではありません。

+0

コンマがある理由は、私は多くのものを分離するためにそれを使用しているファイルを解析し、ファイルを解析するためにラケットのマッチを使用したいということですコンマはラケットではとても特別です!)しかし、お返事いただきありがとうございます。 –

1

あなたはカンマが必要な場所について混乱するかもしれないと思います。 Racketでは、リスト内の要素を区切るためにカンマを使用しません。代わりに、空白を使用するだけです。これが間違っているかどうか教えてください。しかし、私が想像していることは、(define s '(hi there))のような式にマッチさせようとしていることです。これを行うには、あなたは省略記号があるエリアで、その後

(match s 
    [`(,h ,t) ...]) 

を使用することになり、変数hは値'hiを持ち、変数t'there

+0

ラケットで 'match 'を利用して、括弧の中にあるCOMMを使ってs式のような形式を解析したいだけです。 –

関連する問題