Meta-programming - examples
Yauheni Akhotnikau
eao197 at intervale.ru
Sun Feb 11 03:12:54 PST 2007
On Sun, 11 Feb 2007 07:39:25 +0300, janderson <askme at me.com> wrote:
> Personally I see this new mixin format as giving us the power to extend
> D in whatever way meets our goals. As Walter adds more features some of
> them will be rarely used (law of demising returns) because they are
> special case. Mixin Expressions circumvent this because now the
> programmer has the power to create the language features they need.
Thaks for your examples.
This is one of my own. We use an agent-oriented framework in the
development of our SMS-routing software. In C++ description of agents,
their events, messages and states requires a lot of C++-macroses:
// C++
// Agent class description
SOL4_CLASS_START( aag_3::smsc_map::a_router_t )
// Messages ...
MBAPI3_ROUTER_SOL4_MSG( msg_configure,
aag_3::smsc_map::a_router_t::msg_configure )
MBAPI3_ROUTER_SOL4_MSG( msg_send,
aag_3::smsc_map::a_router_t::msg_send )
MBAPI3_ROUTER_SOL4_MSG( msg_send_result,
aag_3::smsc_map::a_router_t::msg_send_result )
MBAPI3_ROUTER_SOL4_MSG( msg_send_finish,
aag_3::smsc_map::a_router_t::msg_send_finish )
...
// Events...
SOL4_EVENT( evt_start )
SOL4_EVENT_STC(
evt_configure,
aag_3::smsc_map::a_router_t::msg_configure )
SOL4_EVENT_STC(
evt_send,
aag_3::smsc_map::a_router_t::msg_send )
SOL4_EVENT_STC(
evt_send_result,
aag_3::smsc_map::a_router_t::msg_send_result )
SOL4_EVENT_STC(
evt_send_finish,
aag_3::smsc_map::a_router_t::msg_send_finish )
...
// States...
SOL4_STATE_START( st_initial )
SOL4_STATE_EVENT( evt_start )
SOL4_STATE_EVENT( evt_configure )
SOL4_STATE_FINISH()
SOL4_STATE_START( st_configured )
SOL4_STATE_EVENT( evt_configure )
SOL4_STATE_EVENT( evt_send )
SOL4_STATE_EVENT( evt_send_result )
SOL4_STATE_EVENT( evt_send_finish )
...
SOL4_STATE_FINISH()
SOL4_STATE_START( st_not_configured )
SOL4_STATE_EVENT( evt_configure )
SOL4_STATE_FINISH()
SOL4_CLASS_FINISH()
Each C++-macros hides a lot of auxilary code for agent support.
In D, I hope, it may be expressed as something like:
mixin( AgentClass( Aag3.SmscMap.ARouter,
`
mbapi3_router_messages {
MsgConfigure => Aag3.SmscMap.ARouter.MsgConfigure
MsgSend => Aag3.SmscMap.ARouter.MsgSend
MsgSendResult => Aag.SmscMap.ARouter.MsgSendResult
MsgSendFinish => Aag.SmscMap.ARouter.MsgSendFinish
...
}
events {
evtStart
evtConfigure
evtSend
evtSendResult
evtSendFinish
...
}
state st_initial {
events {
evtStart
evtConfigure
}
}
state st_configured {
events {
evtConfigure
evtSend
evtSendResult
evtSendFinish
...
}
}
state st_not_configured {
events { evt_configure }
}
` ) );
--
Regards,
Yauheni Akhotnikau
More information about the Digitalmars-d
mailing list