You can also try using a state machine using the approach described in
https://cs.brown.edu/~sk/Publications/Papers/Published/sk-automata-macros/paper.pdf
On Feb 22, 2016 4:46 PM, "Federico Ramírez" <[email protected]> wrote:

> Hello everyone! I'm new to Scheme, and I need some help wrapping my head
> around it.
>
> I want to write a simple tokenizer, which is just a function that takes a
> string as input and outputs a list of "tokens", which to keep thing simple
> is a tuple of NAME and VALUE.
>
> So, for example:
>
> (tokenize "foo = 1") => '((IDENTIFIER . "foo") (EQUALS . "=") (NUMBER . 1))
>
> I didn't want to use global variables to keep things functional, so my
> solution doesn't use any, but I wouldn't mind much using them. This is some
> code for my current implementation, I omit some code for brevity as it's
> quite repetitive for now:
>
>     (define (match-identifier input)
>       (regexp-match #rx"^[a-zA-Z_]+"))
>
>     (define (consume-identifier input)
>       (let ([match (first (match-identifier input))])
>         (cons `(IDENTIFIER . ,match) (tokenize (substring input (string-
>   length match))))))
>
>     ;; some more matchers and consumers, all pretty similar
>     ;; ...
>
>     (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
>
> I want to get rid of that double-check. I figured I could use some globals
> in order to do it but I'd rather not.
>
> Does anyone have a suggestion/fix on my implementation?
>
> Thank you for your time :)
>
> --
> 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.
>

-- 
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