2012-07-27 21 views
6

jeśli mam coś takiego (define s (hi,there)) wtedy jak mogę pisać w meczu jak (match s [(,h , ,t)] ...) Ale to nie działa, ponieważ match potrzebuje , więc jak mogę to zrobić?Jak dopasować, w meczu w Racket?

+0

wybaczyć niechciany komentarz, ale wydaje mi się, że użycie "dopasowania" rakietowego do analizy danych wejściowych, które zawiera przecinki, prawdopodobnie nie jest świetnym pomysłem; chyba że reszta wejścia jest naprawdę bardzo bliska rakietom/LISP-owi, brzmi to jak przypadek gryzienia pocisku i używania rzeczywistego parsera. Przepraszam z góry, jeśli źle zrozumiałem twój przypadek użycia. –

+0

@JohnClements Myślę, że masz rację ... i historia jest taka, że ​​mój główny program jest napisany w Racket i chcę tylko uzyskać struktury danych zbudowane z analizy pliku w Racket. Plik wygląda prawie jak S-Exp, a potem do późna znalazłem przecinki ... –

+0

Czy masz jakieś specyfikacje, jakie formy mogą wystąpić w pliku źródłowym? Czy plik źródłowy jest napisany w jakimś dobrze znanym języku? –

Odpowiedz

7

Pierwsza uwaga, że ​​przecinek , jest specjalnym skrótem czytelnika. Numer (hi,there) jest odczytywany jako (hi (unquote there)). To jest trudne do wykrycia - - ponieważ domyślna drukarka drukuje listy , których pierwszym elementem jest unquote w specjalny sposób.

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

W związku z tym potrzebny jest wzór "(lista h (lista" nieokreślona t)) ".

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

pomocą ukośnika, jeśli chcesz używać przecinka jako symbol wewnątrz cytowanego paragrafu:

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

I używać '|,| dla autonomicznego przecinkami symbolem.

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

W obu przypadkach naprawdę należy użyć spacji do oddzielenia rzeczy i korzystania z list.

(define s (hi,there)) nie jest prawidłową rakietą.

+0

Powodem jest przecinek w środku jest to, że plik, który parsuję używa go do oddzielenia wielu rzeczy i chcę użyć dopasowania Racket do parsowania pliku (w rzeczywistości bardziej zainteresowani, gdy znalazłem przecinek jest tak wyjątkowy w Racket!) Ale dzięki za odpowiedzi od was) –

1

Myślę, że możesz być zdezorientowany tym, gdzie potrzebujesz przecinków. W Racket nie używa się przecinków do oddzielania elementów na liście. Zamiast tego wystarczy użyć spacji. Powiedz mi, czy to źle, ale wyobrażam sobie, że próbujesz dopasować wyrażenie takie jak (define s '(hi there)). Aby to zrobić, należy użyć

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

Następnie w obszarze, gdzie elips jest zmienna h ma wartość 'hi, a zmienna t ma wartość 'there

+0

Po prostu chcę skorzystać z 'match' w Racket, aby parsować ten format s-expression-like z COMMA wewnątrz nawiasów. –