rust - recta - pinzas para faldas
Clonar una estructura que almacena un cierre (0)
Actualmente estoy intentando implementar una biblioteca simple de Parser-Combinator en Rust. Para eso me gustaría tener una función de map
genérico para transformar el resultado de un analizador.
El problema es que no sé cómo copiar una estructura que contiene un cierre. Un ejemplo es la estructura del Map
en el siguiente ejemplo. Tiene un campo mapFunction
almacena una función, que recibe el resultado del analizador anterior y devuelve un nuevo resultado. Map
es en sí mismo un analizador sintáctico que se puede combinar con otros analizadores.
Sin embargo, para que los analizadores sintácticos se combinen, necesitaría que se puedan copiar (teniendo el rasgo de Clone
), pero ¿cómo proporciono esto para el Map
?
Ejemplo: (Solo el pseudocódigo, probablemente no se compile)
trait Parser<A> { // Cannot have the ": Clone" bound because of `Map`.
// Every parser needs to have a `run` function that takes the input as argument
// and optionally produces a result and the remaining input.
fn run(&self, input: ~str) -> Option<(A, ~str)>
}
struct Char {
chr: char
}
impl Parser<char> for Char {
// The char parser returns Some(char) if the first
fn run(&self, input: ~str) -> Option<(char, ~str)> {
if input.len() > 0 && input[0] == self.chr {
Some((self.chr, input.slice(1, input.len())))
} else {
None
}
}
}
struct Map<''a, A, B, PA> {
parser: PA,
mapFunction: ''a |result: A| -> B,
}
impl<''a, A, B, PA: Parser<A>> Parser<B> for Map<''a, A, B, PA> {
fn run(&self, input: ~str) -> Option<(B, ~str)> {
...
}
}
fn main() {
let parser = Char{ chr: ''a'' };
let result = parser.run(~"abc");
// let mapParser = parser.map(|c: char| atoi(c));
assert!(result == Some(''a''));
}