LINUX.ORG.RU

История изменений

Исправление 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))])))