1 ; Work in progress...
\r
3 (define (one-of string)
\r
4 (map list (string->list string)))
\r
6 (define (match pattern x)
\r
7 (define (single-match pat x)
\r
8 (cond ((procedure? pat) (pat x))
\r
9 ((char? pat) (and (char=? pat (car x))
\r
10 (cons (car x) (cdr x))))))
\r
11 (let loop ((acc (list)) (pattern pattern) (x x))
\r
13 (cons (reverse acc) x)
\r
14 (let ((result (single-match (car pattern) x)))
\r
16 (loop (cons (car result) acc) (cdr pattern) (cdr result)))))))
\r
18 (define-syntax do-it
\r
21 ((_ x f) (apply f x))))
\r
23 (define-syntax make-parser
\r
25 ((_ start (rulename (pattern ...) . function) ...)
\r
30 ((lambda (y) (cons (do-it (car y) . function) (cdr y)))
\r
32 ((match (list . pattern) x))
\r
35 (start (string->list string)))))))
\r
40 (one ((#\1 two three)) list)
\r
41 (two ((#\2)) (lambda (x) "SHIT"))
\r
44 (define (showcons x)
\r
51 (showcons (test-parser "123a"))