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.

