See our new RFC process for proposing changes to the language: https://github.com/rust-lang/rfcs/blob/master/active/0001-rfc-process.md
On Mon, Mar 31, 2014 at 10:01 AM, Vladimir Pouzanov <[email protected]> wrote: > I'd like to propose to extend the language with some concepts from nesC, > which is a nice but quite unknown C superset outside of TinyOS world. > > The concept would allow better static polymorphism and better code > optimisations and is loosely based on nesC modules/components. It might be > possible to implement the same in rust without extending the syntax and > compiler, please tell me if that's the case. > > unbound struct S { > reg: u32, > comp: ~T, > } > > defines a struct that has a u32 value and some trait. Those values could be > used in S impls as usual. > > It is impossible to create an instance of S, the only way to get it is to > bind it in compile time: > > let Binding: binding { > let SImpl: &S; > let TImpl: &T; > > bind SImpl.reg = 0x12345678; > bind SImpl.comp = TImpl; > } > > The result of this is that all references to reg and comp are replaced by > actual values (TImpl must obviously be an unbound struct as well), so that > the whole SImpl could be optimised away and don't use any storage bytes > other than required by constants. > > Why is it useful? Embedded systems are commonly represented as a tree of > components hooked up to one another. Also, resources on embedded are used to > be expensive. This code allows to define a "configuration" of a system which > is completely resolved in compile time, allowing better optimisation of the > code while maintaining readable code. > > Some close-to-real-life example: > > unbound struct Led; > impl Led { > pub fn set_enabled(&self, enabled: bool) { > // set the led state > } > } > > trait Callable { > fn callback(&self); > } > unbound struct Timer { > actor: ~Callable, > } > impl Timer { > pub fn start(&self) { > // init the timer, hardware will call fired() via ISR > } > fn fired(&self) { > actor.callback(); > } > } > > unbound struct Blinker { > mut state: bool, > led: &Led, > timer: &Timer, > } > impl Callable for Blinker { > fn callback(&self) { > self.state != self.state; > led.set_enabled(self.state); > } > } > impl Blinker { > pub fn main(&self) { > self.timer.start(); > } > } > > let Binding: binding { > let timer = &Timer; > let led = &Led; > let blinker = &Blinker { state: false }; // we can also set the mut > property here. This one is static mut by nature, but available only in > Blinker impl. > > bind timer.actor = blinker; > bind blinker.timer = timer; > bind blinker.led = led; > } > > pub fn main() { > Binding.blinker.start(); > } > > -- > Sincerely, > Vladimir "Farcaller" Pouzanov > http://farcaller.net/ > > _______________________________________________ > Rust-dev mailing list > [email protected] > https://mail.mozilla.org/listinfo/rust-dev > -- http://octayn.net/ _______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
