-1
Я пытаюсь написать let over lambda defmacro/g! в схеме хитрости. У меня есть следующее:Как расширить макросы в схеме хитрости?
(use-modules (srfi srfi-1))
(define (flatten x)
(let rec ((x x) (acc '()))
(cond ((null? x) acc)
((not (pair? x)) (cons x acc))
(else
(rec (car x)
(rec (cdr x) acc))))))
(define (g!-symbol? s)
(and (symbol? s)
(let ((symbol-string (symbol->string s)))
(and (> (string-length symbol-string) 2)
(equal? (string-downcase (substring symbol-string 0 2)) "g!")))))
(define-macro (define-macro/g! name-args . body)
(let ((syms (delete-duplicates
(filter g!-symbol? (flatten body)))))
`(define-macro ,name-args
(let ,(map
(lambda (s)
`(,s (gensym ,(substring (symbol->string s) 2))))
syms)
,@body))))
но когда я пытаюсь макросложить define-macro/g! с помощью этого:
(use-modules (language tree-il))
(tree-il->scheme (macroexpand '(define-macro/g! (foo . body) `(let ((g!car ,(car body))) g!car))))
Я получил это:
$15 = (if #f #f)
почему я получил этот результат? Как я могу расширить define-macro/g!
?
Я не очень понимаю, что вы пытаетесь достичь. Вы хотите отфильтровать список аргументов? Вы уверены, что 'синтаксис-правила' не то, что вы хотите? –