1 つの引数が渡されたときに機能するマクロがあり、... を使用して n 個の引数を受け入れるように拡張したいのですが、構文を理解するのに苦労しています。
マクロは、カスタム構文、つまり key:val key:val を受け入れるか、プロシージャを受け入れます。
例: (3 つの異なる使用法)
(schema-properties [(name:first-name type:string)])
(schema-properties [(name:age type:number required:#t)])
(schema-properties [(my-custom-fn arg1 arg2 arg3)])
意味:
(define-syntax (schema-properties stx)
(syntax-parse stx
[(_ [(prop:expr ...)])
(with-syntax ([prop0 (make-prop-hash #'(prop ...))])
#'(list prop0))]))
(define-for-syntax (make-prop-hash stx)
(with-syntax ([(props ...) stx])
(if (regexp-match #px":"
(symbol->string (car (syntax->datum #'(props ...)))))
#'(pairs->hash 'props ...)
#'(props ...))))
これは、":" の存在について prop:expr 構文をチェックし、存在する場合はそれを関数に渡し (pairs->hash 'props ...)、それ以外の場合はそれを呼び出す (props ...)。
今、私は渡すことができるようにしたいと思います:
(schema-properties [(name:first-name type:string)
(name:last-name type:string)
(my-fn arg1 arg2 arg3)])
同じように動作させます。しかし、私は現在、省略地獄に陥っており、私の脳はもはや正しく機能していません。
どんな洞察も高く評価されます。