Лисперы, прошу помощи.
Есть задача: парсить файлы с S-выражениями и на основе их содержимого создавать структуры данных. S-выражения эти представляют собой маленький DSL следующего вида:
(define-my-struct struct-name
(optional-keyword1 <optional-value1>)
(optional-keyword2 <optional-value2>)
(optional-keyword3 <optional-value3>)
(mandatory-keyword <mandatory-value>))
Любой из optional-keywordN может отсутствовать (тогда используется значение по умолчанию), но если присутствуют несколько из них, то они всегда идут по порядку (т.е. optional-keyword2 может идти только после optional-keyword1), а mandatory-keyword всегда идёт последним.
Так вот, я хочу написать такой макрос, чтобы содержимоe файла просто скармливать eval'y. Первое пришедшее решение в лоб:
(define-syntax define-my-struct
(syntax-rules (opt1 opt2 opt3 mandatory)
((_ name (opt1 oval1) (opt2 oval2) (opt3 oval3) (mandatory mval))
(make-my-struct oval1 oval2 oval3 mval))
((_ name (opt1 oval1) (opt2 oval2) (mandatory mval))
(make-my-struct oval1 oval2 30 mval))
((_ name (opt1 oval1) (mandatory mval))
(make-my-struct oval1 20 30 mval))
((_ name (opt1 oval1) (opt3 oval3) (mandatory mval))
(make-my-struct oval1 20 oval3 mval))
((_ name (opt2 oval2) (opt3 oval3) (mandatory mval))
(make-my-struct 10 oval2 oval3 mval))
((_ name (opt2 oval2) (mandatory mval))
(make-my-struct 10 oval2 30 mval))
((_ name (opt3 oval3) (mandatory mval))
(make-my-struct 10 20 oval3 mval))))
(define-syntax define-my-struct
(syntax-rules (mandatory)
((_ name ... (mandatory mval))
(make-my-struct name ... mval))))
P.S.
А может, тут и не нужен макрос вовсе? Проверять опциональные аргументы на этапе парсинга файлов и всё.