Здравствуйте, мои маленькие любители макросов!
Есть такой макрос на CL:
(defun has-tag-p (tag record) ... )
(defmacro select (query records)
(let ((rec (gensym "record")))
(labels ((query-helper (q)
(if (and (listp q)
(member (car q) '(and or not)))
`(,(car q) ,@(mapcar #'query-helper (cdr q)))
`(has-tag-p ,q ,rec))))
`(remove-if-not (lambda (,rec) ,(query-helper query)) ,records))))
Аналогичный макрос (без гигиены) на guile:
(define (has-tag? tag record) ... )
(define-macro (select query records)
(define rec (gensym "record"))
(define (query-helper q)
(if (and (list? q)
(memq (car q) '(and or not)))
`(,(car q) ,@(map query-helper (cdr q)))
`(has-tag? ,q ,rec)))
`(filter (lambda (,rec) ,(query-helper query)) ,records))
Вопрос: как написать такое же, но с гигиеной, используя (1) только стандарт R5RS, (2) стандарт R7RS, (3) Racket?
Призываю monk’а и прочих знатоков Scheme.
Ну и с интересом выслушаю замечания бывалых лисперов по приведённому коду.