#default #parameters #named #named-arguments

macro duang

Use macro to provide default parameter and named parameter in Rust

3 releases

0.1.2 Jun 15, 2019
0.1.1 Jun 15, 2019
0.1.0 Jun 15, 2019

#17 in #named-arguments


Used in 2 crates (via demo-duang)

MIT license

38KB
968 lines

duang

Rust doesn't support default function arguments and named function arguments.

This crate generate an macro interface for a given function that can be invoked with named arguments and fill the default argument, meanwhile keep the old function intact.

Generating macro interface

In order to generate macro for a function, we just need to wrap the definition with duang!{...}.

use duang::duang;

duang!(
pub fn foo<T>(a: T,b: f64 = 13.0, c: T = a*a) -> (T,f64,T)
where
  T: std::ops::Mul<T, Output = T>,
  T: std::fmt::Display,
  T: Copy,
{
  (a,b,c)
}
);

Invoke

use demo_duang::foo;
// pass
assert_eq!(foo!(1, c = 30, b = -2.0), (1, -2.0, 30));
// pass
assert_eq!(foo!(a = 10), (10, 13.0, 100));
// fail
// foo!(1,c=30,c=2);

Features

  • Support generics, existensial type.
  • Friendly error message.

Common issues

Use local variable in default value.

In order to use the generated macro in other crate, users should add $crate and path of the variable used. Also, the variable should be visible(pub) for the scope where the macro is invoked.

mod bar {
  use duang::duang;
  pub static NUM: i32 = 42;
  duang!(
  pub fn foo(a: i32 = $crate::bar::NUM) -> i32 { a }
  );
}
fn main() {
  use bar::foo;
  assert_eq!(foo!(), 42);
}

Limitations

  • Don't support associated function.
  • Wildchar can not be used in pattern argument. For example fn foo((a,_): (i32, i32)) is illegal.

TODO

  • Generate document for function or macro.
  • After "Attributes in formal function parameter position"(#60406) stabilize, change function-like macros to attribute-like macros.

License: MIT

Dependencies

~2MB
~48K SLoC