2014-07-15 18 views
11

Sto faticando a rendere disponibili i macro dalla mia libreria di ruggine ad altri progetti di ruggine.Come utilizzare una macro da una cassa in un'altra?

Ecco un esempio di come sto cercando di ottenere questo lavoro al momento.

lib.rs:

#![crate_name = "dsp"] 
#![feature(macro_rules, phase)] 
#![phase(syntax)] 

pub mod macros; 

macros.rs:

#![macro_escape] 

#[macro_export] 
macro_rules! macro(...) 

other_project.rs:

#![feature(phase, macro_rules)] 
#![phase(syntax, plugin, link)] extern crate dsp; 

macro!(...) // error: macro undefined: 'macro!' 

Sono sulla buona strada? Ho cercato di usare std :: macros come riferimento, ma non mi sembra che abbia molta fortuna. C'è qualcosa di ovvio che mi manchi?

+0

State guardando l'industria dell'elaborazione del segnale digitale o il DSP sta per qualcos'altro qui? – errordeveloper

+0

@errordeveloper Sì! Per l'audio in particolare. Sono ancora in una fase molto precoce e ossa abbastanza nude, ma ho un callback (usando portaudio) e la base di un framework di nodi 'DSP' pronto. Puoi [controllarlo qui] (https://github.com/PistonDevelopers/rust-dsp) come parte del progetto Piston. Attualmente lo sto usando in un motore di musica generativa - spero di contribuire con un po 'del lavoro di oscillatore/synth che ho realizzato molto presto. Inoltre, siamo sempre aperti ai contributi/aiuto :-) – mindTree

+0

Sembra fantastico! Verificherò :) Sentiti libero di inviarmi un messaggio @ gmail.com. Ero abbastanza interessato a come si può sfruttare NEON e VFP con Rust ... – errordeveloper

risposta

7

Gli attributi sono aggrovigliati.

#![…] riferisce alla esterna portata , mentre #[…] riferisce al successivo elemento.

Ecco alcune cose da notare:

  1. Nel lib.rs, il #![feature(phase)] è inutile, e il #![phase(syntax)] non ha senso.

  2. In other_project.rs, l'attributo phase viene applicato alla cassa , non al extern crate dsp; item-questo è il motivo per cui non carica le macro da esso. Rimuovere lo !.

+1

Solo perché ho passato molto tempo a capirlo, e potresti venire qui con lo stesso problema: inserisci entrambe le annotazioni in 'main.rs' o, quando definite la cassa, in' lib.rs', * not * nel file in cui volete effettivamente usare le macro. – skalee

+2

Per avere effetto, '#! [feature]' deve essere sul crate, che significa il file root della cassa, che per impostazione predefinita è 'lib.rs' o' main.rs', come appropriato. –