2012-07-27 25 views
6

si tengo algo como esto (define s (hi,there)) entonces ¿cómo puedo escribir en el partido como (match s [(,h , ,t)] ...) Pero no está funcionando, porque necesita la match, así que ¿cómo puedo hacer esto?¿Cómo hacer coincidir, en coincidencia en raqueta?

+0

perdonéis los comentarios no solicitados, pero me parece que usar la 'coincidencia' de la raqueta para analizar la entrada que contiene comas probablemente no sea una gran idea; a menos que el resto de la entrada esté realmente muy cerca de la raqueta/LISP, esto suena como un caso para morder la bala y usar un analizador real. Disculpas de antemano si he entendido mal tu caso de uso. –

+0

@JohnClements Creo que tienes razón ... y la historia es que mi programa principal está escrito en Racket y solo quiero que las estructuras de datos compiladas analicen el archivo en Racket. El archivo casi se ve como S-Exp, y hasta muy tarde, encontré que había comas ... –

+0

¿Tiene algún tipo de especificación de qué formularios pueden aparecer en el archivo fuente? ¿El archivo fuente está escrito en algún idioma conocido? –

Respuesta

7

Primero tenga en cuenta que la coma , es una abreviatura de lector especial. (hi,there) es leído como (hi (unquote there)). Esto es difícil de detectar, ya que la impresora predeterminada imprime listas cuyo primer elemento es un unquote de una manera especial.

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

Por lo tanto, el patrón que necesita es '(list h (list' unquote t)) '.

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

Utilice una barra invertida si desea usar una coma como un símbolo dentro de una sección citado:

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

Y el uso de '|,| para el símbolo de coma independiente.

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

En cualquier caso, debería utilizar los espacios en blanco para separar cosas y usar listas.

(define s (hi,there)) no es válido Racket.

+0

La razón por la que hay una coma adentro es que el archivo que estoy analizando lo usa para separar muchas cosas y quiero usar Racket Match para analizar el archivo (en realidad me interesa más cuando encuentro ¡la coma es tan especial en Racket!) Pero gracias por las respuestas de ustedes, muchachos) –

1

Creo que puede estar confundido acerca de dónde necesita las comas. En Racket, no usa comas para separar elementos en una lista. En cambio, solo usa espacios en blanco. Dime si esto está mal, pero lo que imagino es que estás tratando de hacer coincidir una expresión como (define s '(hi there)). Para ello, se utilizaría

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

A continuación, en la zona donde las elipses es, la variable h tiene el valor 'hi, y la variable t tiene el valor 'there

+0

Solo quiero aprovechar el 'match' en Racket para analizar ese formato de s-expression WITH COMMA dentro de paréntesis. –

Cuestiones relacionadas