Здравствуйте, мои маленькие любители макросов!


Есть такой макрос на 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.


Ну и с интересом выслушаю замечания бывалых лисперов по приведённому коду.









 , , , ,






URL записи