On Monday, 22 February 2016 19:34:40 UTC-3, Jens Axel Søgaard  wrote:
> 2016-02-22 22:46 GMT+01:00 Federico Ramírez <[email protected]>:
> 
> 
>     (define (tokenize input)
> 
>       (cond
> 
>         ((match-identifier input) (consume-identifier input))
> 
>         ((match-equals     input) (consume-equals     input))
> 
>         ((match-number     input) (consume-number     input))
> 
>         (else '())))
> 
> 
> 
> What bothers me is that it's calling the matchers twice for each token, which 
> isn't very good for performance and it's not pretty :p
> 
> 
> 
> You can use this strategy:
> 
> 
>     (define (tokenize input)
>       (cond
>         ((match-identifier input)    => (lambda (token) ... consume the 
> identifier token...))
>         ((match-equals     input)   => (lambda (token) ... consume the equals 
> token...))
>         ((match-number     input) => (lambda (token) ... consume the number 
> token...))
>         (else '())))
> 
>  
> Here a clause of the form [expression1 => expression2] will calls the result 
> of expression2
> with the result of expression1 as input. That is: when (match-identifier 
> input) returns a token
> the function (lambda (token) ... consume the identifier token...) will be 
> called with the token.
> Given the token you can find it's length n and then skip n bytes of the input 
> stream.
> 
> 
> -- 
> Jens Axel Søgaard

Oh, interesting! I feel like I'll use that quite a lot :) Thanks!

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to