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日 |
#21 in #linguistics
21 每月下载量
40KB
799 行
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 的 英语发音算法 的重实现。
依赖项
~165KB