Просто си играя с NFA за разпознаване на низове. Имам макрос, който създава функция, която консумира входни данни и предава останалата част на някои други функции. Тъй като може да има цикли в моята NFA графика, използвам letrec, за да сглобя всичко. Ето малко код (тестван в PLT-схема):
(define-syntax-rule (match chars next accepting)
; a function that consumes a list of chars from a list l.
; on success (if there's more to do) invokes each of next on the remainder of l.
(lambda (l)
(let loop ((c chars) (s l))
(cond
((empty? c)
(cond
((and (empty? s) accepting) #t)
(else
(ormap (lambda (x) (x s)) next))))
((empty? s) #f)
((eq? (car c) (car s))
(loop (cdr c) (cdr s)))
(else #f)))))
; matches (a|b)*ac. e .g. '(a a b b a c)
(define (matches? l)
(letrec
([s4 (match '( ) '() #t)]
[s3 (match '(c) `(,s4) #f)]
[s2 (match '(a) `(,s3) #f)]
[s1 (match '( ) `(,s2 ,s5) #f)]
[s5 (match '( ) `(,s6 ,s7) #f)]
[s6 (match '(a) `(,s8) #f)]
[s7 (match '(b) `(,s8) #f)]
[s8 (match '( ) `(,s1) #f)])
(s1 l)))
(matches? '(a c))
(matches? '(a b b b a c))
(matches? '(z a b b b a c))
Сега, какво ще стане, ако имах проста структура от данни, която да представя моите NFA, като списък от списъци. напр.
'((s4 () () #t)
(s3 (c) (s4) #f)
...)
Въпросът ми е: Как бих превърнал този списък в бившия израз letrec? Не съм много добър с Macros и моето разбиране е, че вероятно не трябва да използвам eval.
match
да бъде макрос, а не обикновена функция? - person Jérémie Koenig   schedule 13.12.2009