metaclass (metaclass) wrote,
metaclass
metaclass

Простые модели и кодогенераторы на clojure

https://github.com/csete/gqrx/blob/master/pulseaudio/pa_device_list.h (код не мой, просто я в нем сейчас разбираюсь)
По ссылке есть класс pa_device, единственное назначение которого - хранить три поля описания pulseaudio девайсов. Занимает это дело 23+8 - 31 строку.

Когда у меня возникает надобность на обычных языках делать такие классы, у меня не хватает терпения их писать вручную и я их генерирую или из t4-шаблонов или из описания на Clojure, например, этот класс я бы описал так, сделав макрос def-gen-class:
(def-gen-class pa_device 
  "комментарий к классу"
  index uint "комментарий к полю"
  name string "..."
  description string "...")

в итоге получится переменная pa_device, внутри которой лежит описание класса в удобном для кодогенерации виде. Можно map, можно список кортежей, без разницы, благо кложурь имеет развитый механизм разборки структур данных на составляющие.

Полученное описание можно при желании расширить генерацией, например, пользовательского интерфейса или сериализации-десериализации.
Для своей опердени я таким образом генерю классы документов, которые умеют загружать-сохранять себя в JSON. Из 90 строк кода на кложури создается 1226 строк на дельфи.
Tags: clojure, code generation, fp
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 58 comments