Re[5]: AST-based solution
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 11:08
Оценка:
Здравствуйте, 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>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.