Здравствуйте, fionbio, Вы писали:
F>Елки-палки, да пожалуйста:
F>F>;;; Data class generation
F>(defun generate-csharp-class (object)
F> "Generate a C# class from DSL spec"
F> (destructuring-bind (obj class-name . properties) object
F> (assert (eq obj 'object) nil
F> "malformed data, expected object: ~s" object)
F> (loop for property in properties
F> for (prop prop-name prop-type) = property
F> for sharp-prop-name = (format nil "~:(~a~)" prop-name) ; C# property name
F> for field-name = (concatenate 'string "_" prop-name) ; C# field name
F> do (assert (eq prop 'property) nil
F> "malformed data, expected property: ~s" property)
F> collect `(:arg ,prop-type ,prop-name) into init-args
F> collect `(:setf (:id ,field-name) (:id ,prop-name)) into init
F> nconc `((:field ,prop-type ,field-name)
F> (:property ,prop-type ,sharp-prop-name
F> (:get (:return (:id ,field-name)))
F> (:set (:setf (:id ,field-name) (:id "value"))))) into props
F> finally (return
F> `(:class ,class-name
F> (:constructor ,class-name ()
F> (:comment "NOOP"))
F> (:constructor ,class-name ,init-args
F> ,@init)
F> ,@props)))))
F>(defun generate-csharp-classes (data)
F> "Generate C# classes from DSL spec"
F> (destructuring-bind (ns ns-name . classes) data
F> (assert (eq ns 'namespace) nil
F> "malformed data, expected namespace: ~s" data)
F> `(:namespace ,ns-name
F> ,@(mapcar #'generate-csharp-class classes))))
F>
F>Можно ещё типы проверить, что там строки, где надо.
Можно. Только вот одна засада — жутко неудобно. Привести пример xsd, или на слово поверишь, что будет на порядок лаконичнее?
... << RSDN@Home 1.2.0 alpha rev. 565>>