(define eat-c (lambda (pred) (letrec ((loop (lambda (str acc) (if (null? str) (list acc ()) (let ((char (car str))) (if (not (pred char)) (list acc str) (loop (cdr str) (append acc (list char))))))))) loop))) (define eat-number (lambda (str) (let ((x ((eat-c char-numeric?) str ()))) (list (string->number (apply string (car x))) (cadr x))))) (define eat-symbol (lambda (str) (let ((x ((eat-c char-alphabetic?) str ()))) (list (string->symbol (apply string (car x))) (cadr x))))) (define scan (lambda (ls) (if (null? ls) () (let ((char (car ls))) (cond ((eq? char #\space) (scan (cdr ls))) ((member char '(#\( #\) #\, #\[ #\] #\+ #\- #\* #\/ #\= #\> #\<)) (cons char (scan (cdr ls)))) ((char-numeric? char) (let ((x (eat-number ls))) (cons (car x) (scan (cadr x))))) ((char-alphabetic? char) (let ((x (eat-symbol ls))) (cons (car x) (scan (cadr x))))) (else (error "illegal character.")))))))