7个版本
使用旧的Rust 2015
0.0.8 | 2015年3月3日 |
---|---|
0.0.7 | 2015年2月21日 |
0.0.5 | 2015年1月7日 |
0.0.1 | 2014年12月9日 |
#1717 在 算法
20KB
337 行
Rust-soundchange
实现音变算法的工具。
这是严格基于Mark Rosenfelder的Sound Change Applier的,并对Rust的宏系统进行了必要的调整。
典型用法与原始SCA规则的比较
#[macro_use] extern crate soundchange;
#[macro_use] extern crate log;
use soundchange::{CharOf, StrTo};
fn main() {
// custom conditions
let is_boundary = |c: Option<char>| c.is_none();
let is_vowel = |c: Option<char>| c.map_or(false, |c| "aeiou".contains_char(c));
let boundary = CharOf(&is_boundary);
let vowel = CharOf(&is_vowel);
// custom transformers
let make_reverse = |s: &str, out: &mut String| out.extend(s.chars().rev());
let reverse = StrTo(&make_reverse);
let s = "fihs".to_string();
let s = subst_rules! { s => // V=aeiou
"f" [boundary] => "gh"; // f/gh/_#
"f" => "ph"; // f/ph/_
["w"] vowel ["m" vowel "n"] => "o"; // V/o/w_mVn
"sh" ["o"] => "ti"; // sh/ti/_o
[vowel] "hs" => reverse; // sh/\\/V_
"" [boundary] => "ing"; // /ing/_#
};
assert_eq!(s, "phishing");
}
注意:您可以使用RUST_LOG=4
来跟踪字符串和触发该变化的规则上的任何变化。另外,大量的规则可能会触发rustc的递归限制;在这种情况下,您必须将它们拆分。
左侧的任何表达式都被视为“搜索条件”,可以是char
、&str
或从Option<char>
到bool
的函数。函数参数是Option
,因为它可以查看字符串边界。[]
表示上下文,在字符串转换时不考虑。(条件的行为也可以通过实现IntoCond
特性和/或Search
特性来自定义。&str
和函数都实现了这两个特性。)
右侧的任何表达式都被视为“转换器”,可以是char
、&str
或从char
到char
的函数。当匹配多个字符时,将为每个字符调用一个函数。(转换器的行为也可以通过实现Transform
特性来自定义。)
实际的处理是通过subst
函数驱动的,它被方便地封装在subst_rules!
宏中。语法应该是自解释的,除了它返回一个CowString
。
案例研究:英语发音
src/english
提供了Mark Rosenfelder的发音算法的重新实现。