История изменений
Исправление monk, (текущая версия) :
А Chicken’овские трансформеры — всего лишь гигиенизирующая надстройка над процедурной трансформацией синтаксиса в стиле CL.
Так короче, но можно и просто как надстройку использовать:
(define-syntax select
(lambda (stx)
(syntax-case stx ()
[(select query records)
(letrec ((query-helper
(lambda (q)
(if (list? q)
(cond ((eq? (car q) 'and)
`(and ,@(map query-helper (cdr q))))
((eq? (car q) 'or)
`(or ,@(map query-helper (cdr q))))
((eq? (car q) 'not)
`(not ,(query-helper (cadr q))))
(else `(has-tag? ,q rec)))
`(has-tag? ,q rec)))))
#`(filter (lambda (rec) #,(datum->syntax #'rec (query-helper (syntax->datum #'query)))) records))])))
Исходная версия monk, :
А Chicken’овские трансформеры — всего лишь гигиенизирующая надстройка над процедурной трансформацией синтаксиса в стиле CL.
Так короче, но можно и просто как надстройку использовать:
(define-syntax select
(lambda (stx)
(syntax-case stx ()
[(select query records)
(letrec ((query-helper (lambda (q)
(if (list? q)
(cond ((eq? (car q) 'and)
`(and ,@(map query-helper (cdr q))))
((eq? (car q) 'or)
`(or ,@(map query-helper (cdr q))))
((eq? (car q) 'not)
`(not ,(query-helper (cadr q))))
(else `(has-tag? ,q rec)))
`(has-tag? ,q rec)))))
#`(filter (lambda (rec) #,(datum->syntax #'rec (query-helper (syntax->datum #'query)))) records))])))