Releases: niuez/Niu
Releases · niuez/Niu
v0.8.3
v0.8.2
v0.8.1
v0.8.0
- Features
- trait
Clone
clone
関数で定義Clone
を定義するとコピーコンストラクタと代入演算子が定義されるClone
をC++側ではstd::is_copy_assignable
で判定する #87
- move #74
- Rustのようにデフォルトで
std::move
が入るようになった - moveした変数やメンバ変数は使えないように
- 再代入したときに生き返る
Copy
トレイトを実装した型はmoveせずそのままコピー
- Rustのようにデフォルトで
- foreach statement #74
for v in vec
vec
の中身を順番にmovestd::begin
とstd::make_move_iterator
を利用
for v in &vec
vec
の中身をconst T&
で取得std::cbegin
を利用
for v in &mut vec
vec
の中身をT&
で取得
-std::begin
を利用
- elseなしif #79
if
のブロックがvoid
を返す場合,else
なしでも書けるように
- tuple #82 #86
- (i64, u64, bool)のように書く
- unpack let (a, b, (c, d)) = (1, 2, (3, 4));
- indexing let t = (0, 1, 2); t0 = t.0
std/tuple.niu
によってtupleの中の型それぞれがClone
,Copy
,Eq
,Ord
を持っていれば, そのトレイトが実装される #88
- trait
v0.7.0
- Features
- ユニットテストの追加
- library-checker-problems形式の問題でverifyできるようになった.
- ユニットテストを参照
- 上記に伴い, 従来のトランスパイルのコマンドを変更
trans <FILE>
: 従来の単一ファイルのトランスパイルをする
&
をトランスパイルする際の意味を, ポインタから参照に変更 #67Eq
やOrd
などに対応するoperatorの実装に必要になった- 競技プログラミングのライブラリという観点からも, 使用者側は参照の方が書きやすい
- 今のところ参照を2つ以上つけることは禁止してある
trait Eq
#48fn eq(self: &Self, right: &Self) -> bool
を実装!=
は!(self == right)
で定義される
trait Ord: Eq
#48fn le(self: &Self, right: &Self) -> bool
を実装operator<
に対応operator> operator<= operator>=
はoperator<
を用いて実装される.
- ユニットテストの追加
v0.6.1
v0.6.0
- Features
- 浮動小数点数 #51
nom::number::complete::recognize_float
を用いてパース(https://docs.rs/nom/7.0.0/nom/number/complete/fn.recognize_float.html).
を含むかどうかでu64
と区別することにしている
- char型 #53
- https://doc.rust-lang.org/reference/tokens.html#ascii-escapesを参考に実装
\
ではない文字\n \r \t \0 \" \' \\
\x7f
7bitの数字
- forの構文の追加 #56
for i = 0; i < arr.len(); i = i + 1
- 括弧があるのが違和感があったので新しく追加
let mut
をなくした
- とりあえず前の構文
for(let mut i = 0; ...)
も残してある
- if forの後のセミコロンが不要に #56 #58
if ... {} else {} let x = ....
と書けるようになりました.
- 単項演算子 Neg
-
Not!
の追加 #59
- 浮動小数点数 #51
- BugFix
- #55
std::uint_fast64_t
→unsigned long long
std::int_fast64_t
→long long
- #55
v0.5.0
v0.4.1
v0.4.0
- Features
- Bug Fix
- SFINAEの変換が壊れていた部分を修正
Self
の変換が壊れていたのを修正
trait Add<Arg> {
type Output;
fn add(a: Self, b: Arg) -> Self#Add<Arg>::Output;
}
impl Add<u64> for u64 {
type Output = u64;
fn add(a: Self, b: u64) -> u64 $${a + b}$$
}
struct Hoge<S> {
s: S,
} {}
impl<S> Add<Hoge<S>> for Hoge<S> where S: Add<S> {
type Output = S#Add<S>::Output;
fn add(self: Self, right: Self) -> S#Add<S>::Output {
self.s + right.s
}
}
fn try_add<S, T>(s: S, t: T) -> S#Add<T>::Output where S: Add<T> {
let ans = s + t;
ans
}
fn main() -> void {
let a = Hoge { s: 9u64 };
let b = Hoge { s: 1u64 };
let c = a + b;
}