Пишу на PLT.
Хочу написать макры, которые будут транслировать в SQL код.
(require scheme)
(require scheme/list)
(require scheme/base)
(define-syntax ($! stx)
(syntax-case stx ()
((_ x)
(let ((e (syntax-e #'x)))
(cond ((string? e) #'x)
((symbol? e) #`(symbol->string '#,e))
((list? e)
(let* ((operator (syntax-e (car e)))
(args (map (λ (x)
(expand `($! ,(syntax-e x))))
(cdr e))))
(case operator
((and) #`(apply string-append (add-between #,args #'" AND ")))
(else #'"s"))))
(else (error "$!: not implemented")))))
((_ x y ...)
#'(string-append ($! x) " " ($! y ...)))))
(define-syntax $
(syntax-rules (select from where)
((_ select value from source)
(string-append " SELECT " ($! value)
" FROM " ($! source)))
((_ select value from source where conditions ...)
(string-append " SELECT " ($! value)
" FROM " ($! source)
" WHERE " ($! conditions ...) " "))))
($ select id from med.users where (and a b c))
Хотел получить инфу о syntax-object, узнать строка, или символ, во время раскрытия макроса. Использовал syntax-e, ничего более хорошего не нашёл.
Как я понял, макры всегда должны возвращать syntax-object.
Почему-то не выходит. Что не так?