Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, fionbio, Вы писали:
F>>F>>(namespace "MyNS"
F>> (object "Obj1"
F>> (property "prop1" "int")
F>> (property "prop2" "string")
F>> (property "dblprop" "double"))
F>> (object "Obj2"
F>> (property "someprop" "object[]")))
F>>
F>>Следует учесть, что символы namespace, object и property
F>>данным генератором не используются и добавлены здесь для
F>>читабельности.
AVK>Значит уже не годится — по причине того что эти символы должны проверяться, а любое отклонение детектироваться.
Елки-палки, да пожалуйста:
;;; Data class generation
(defun generate-csharp-class (object)
"Generate a C# class from DSL spec"
(destructuring-bind (obj class-name . properties) object
(assert (eq obj 'object) nil
"malformed data, expected object: ~s" object)
(loop for property in properties
for (prop prop-name prop-type) = property
for sharp-prop-name = (format nil "~:(~a~)" prop-name) ; C# property name
for field-name = (concatenate 'string "_" prop-name) ; C# field name
do (assert (eq prop 'property) nil
"malformed data, expected property: ~s" property)
collect `(:arg ,prop-type ,prop-name) into init-args
collect `(:setf (:id ,field-name) (:id ,prop-name)) into init
nconc `((:field ,prop-type ,field-name)
(:property ,prop-type ,sharp-prop-name
(:get (:return (:id ,field-name)))
(:set (:setf (:id ,field-name) (:id "value"))))) into props
finally (return
`(:class ,class-name
(:constructor ,class-name ()
(:comment "NOOP"))
(:constructor ,class-name ,init-args
,@init)
,@props)))))
(defun generate-csharp-classes (data)
"Generate C# classes from DSL spec"
(destructuring-bind (ns ns-name . classes) data
(assert (eq ns 'namespace) nil
"malformed data, expected namespace: ~s" data)
`(:namespace ,ns-name
,@(mapcar #'generate-csharp-class classes))))
Можно ещё типы проверить, что там строки, где надо.
Я больше идею AST хотел продемонстрировать.