Re[4]: AST-based solution
От: fionbio  
Дата: 14.07.05 10:57
Оценка:
Здравствуйте, 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 хотел продемонстрировать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.