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