Cette macro R5RS est ce que j'ai essayé et est à peu près ce que je veux faire. Racket ou d'autres implémentations n'aiment pas cette macro exactement où je voulais que la magie se produise.Est-il possible de faire correspondre des motifs répétés dans des macro R5RS define-syntax/syntax-rules?
(define-syntax quote-unique
(syntax-rules (magic end)
;; end case
((quote-unique magic processed end)
'processed)
;; finished iteration
((quote-unique magic (processed ...) sym1 end rest ...)
(quote-unique magic (processed ... sym1) rest ... end))
;; match (doesn't work since racket doesn't like sym1 twice in template)
;; but I'm looking for the same expression twice
((quote-unique magic processed sym1 sym1 . rest)
(quote-unique magic processed sym1 . rest))
;; rotate
((quote-unique magic processed sym1 sym2 rest ...)
(quote-unique magic processed sym1 rest ... sym2))
;; start iteration
((quote-unique rest ...)
(quote-unique magic() rest ... end))))
Cela aurait été facile en Common Lisp:
(defmacro quote-unique (&rest xs)
(labels ((remove-duplicates (lis)
(if lis
(if (member (car lis) (cdr lis))
(remove-duplicates (cdr lis))
(cons (car lis) (remove-duplicates (cdr lis)))))))
(list 'quote (remove-duplicates xs))))
J'ai également lu Define syntax primer et pense que la mise en œuvre est-eq? m'aurait indiqué dans les bonnes directions, mais il semble que ce n'est pas une macro qui y est définie.
Si ce n'est pas possible dans la compilation R5RS, comment cela peut-il être fait avec R6RS?