競え
※前スレ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
C vs C++ vs Rust Part.2
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2021/12/15(水) 12:35:50.91ID:biBE4xC02021/12/16(木) 20:34:01.51ID:V9bBAe8M
ゲロのようだ
46デフォルトの名無しさん
2021/12/16(木) 20:37:46.92ID:Y2CVy/MB さわやかな新宿の朝って感じですね。
ゲロの臭いでもらいゲロしそう。
ゲロの臭いでもらいゲロしそう。
2021/12/16(木) 20:54:48.37ID:iS9fah9V
>>44
違うと思います
まずunfold自体はループするものではなくこれだけです
struct Unfold<S, F> { s: S, f: F }
fn unfold<S, F, R>(s: S, f: F) -> Unfold<S, F> where F: FnMut(&mut S) -> Option<R> {
Unfold { s, f }
}
impl<S, F, R> Iterator for Unfold<S, F> where F: FnMut(&mut S) -> Option<R> {
type Item = R;
fn next(&mut self) -> Option<Self::Item> {
(self.f)(&mut self.s)
}
}
次に今回のコードで使われているunfoldについてですが
一番外側のunfoldは上述の構造体を返すだけになります
次のunfoldは素数でない数をスキップするだけで残り2つがO(n^2)となるでしょうか
どの言語で書いても足し算のみ使用だとこれは避けられないかと思います
あとコードが汚いとおっしゃる方は同条件で綺麗なコードを示してくださるとありがたいです
CでもC++でもRustでも構いません
違うと思います
まずunfold自体はループするものではなくこれだけです
struct Unfold<S, F> { s: S, f: F }
fn unfold<S, F, R>(s: S, f: F) -> Unfold<S, F> where F: FnMut(&mut S) -> Option<R> {
Unfold { s, f }
}
impl<S, F, R> Iterator for Unfold<S, F> where F: FnMut(&mut S) -> Option<R> {
type Item = R;
fn next(&mut self) -> Option<Self::Item> {
(self.f)(&mut self.s)
}
}
次に今回のコードで使われているunfoldについてですが
一番外側のunfoldは上述の構造体を返すだけになります
次のunfoldは素数でない数をスキップするだけで残り2つがO(n^2)となるでしょうか
どの言語で書いても足し算のみ使用だとこれは避けられないかと思います
あとコードが汚いとおっしゃる方は同条件で綺麗なコードを示してくださるとありがたいです
CでもC++でもRustでも構いません
48デフォルトの名無しさん
2021/12/16(木) 22:36:01.50ID:22XvzF/H そもそも
「ループを使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数」
というのはどこからでてきたもんなんだ?
この条件になにか意味があるの?
「ループを使わずに足し算と比較のみで素数をその型の上限まで返すイテレータ関数」
というのはどこからでてきたもんなんだ?
この条件になにか意味があるの?
2021/12/16(木) 23:05:37.82ID:iS9fah9V
>>48
まず素数なら列になるのでイテレータにするのはいいですよね
用いる型によって上限値が異なるから上限まで返すのも自然ですよね
足し算と比較は必要最低限として不可欠だと思います
どうしてもならばループは使ってもいいですよ
だから今回は可能ならばループを直接使わずに高階関数イテレータ使用でという話だけです
つまりそんな難しい話をしているわけではないと思います
他の言語のコードが出てこないのは難しいからなのでしょうか?
まず素数なら列になるのでイテレータにするのはいいですよね
用いる型によって上限値が異なるから上限まで返すのも自然ですよね
足し算と比較は必要最低限として不可欠だと思います
どうしてもならばループは使ってもいいですよ
だから今回は可能ならばループを直接使わずに高階関数イテレータ使用でという話だけです
つまりそんな難しい話をしているわけではないと思います
他の言語のコードが出てこないのは難しいからなのでしょうか?
2021/12/16(木) 23:20:42.17ID:22XvzF/H
Rustのことは知らんのだけどsome, any, map, findって実質ループじゃないの?
Rubyっぽい構文も見られるけどブロックを毎度呼び出してもらってるだけだからループじゃないとかいうわけ?
Rubyっぽい構文も見られるけどブロックを毎度呼び出してもらってるだけだからループじゃないとかいうわけ?
2021/12/16(木) 23:59:30.49ID:iS9fah9V
>>50
登場していたSomeは値付きenumなのでデータの型です
mapは変換するだけなのでそれ自体にループ要素はないです
一方でfindなどはループを内包している高階関数になりますね
だから>>49にて「今回は可能ならばループを直接使わずに高階関数イテレータ使用」と書いたのです
宿題となっていた類似部分を別関数へ切り出しが出来ました
これでわかりやすくなったでしょうか?
fn prime<T>() -> Unfold<T, impl FnMut(&mut T) -> Option<T>>
where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
unfold(T::one(), |a| {
inc(*a, T::one(), |x| x > T::zero()) // 無条件に+1していき次の素数を探す
.inspect(|b| *a = *b) // unfoldのため値更新
.find(|b| inc(T::one(), T::one(), |x| x < *b) // 自分より小さい数で+1していき約数を見つける
.all(|c| inc(T::zero(), c, |x| x <= *b) // その約数の候補を自分以下で足し算していく
.all(|d| d != *b)))}) // 自分が倍数になっていなければOK
}
fn inc<T>(s: T, a: T, f: impl Fn(T) -> bool) -> Unfold<T, impl FnMut(&mut T) -> Option<T>>
where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
unfold(s, move |x| { *x = x.checked_add(&a)?; f(*x).then(|| *x) })
}
登場していたSomeは値付きenumなのでデータの型です
mapは変換するだけなのでそれ自体にループ要素はないです
一方でfindなどはループを内包している高階関数になりますね
だから>>49にて「今回は可能ならばループを直接使わずに高階関数イテレータ使用」と書いたのです
宿題となっていた類似部分を別関数へ切り出しが出来ました
これでわかりやすくなったでしょうか?
fn prime<T>() -> Unfold<T, impl FnMut(&mut T) -> Option<T>>
where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
unfold(T::one(), |a| {
inc(*a, T::one(), |x| x > T::zero()) // 無条件に+1していき次の素数を探す
.inspect(|b| *a = *b) // unfoldのため値更新
.find(|b| inc(T::one(), T::one(), |x| x < *b) // 自分より小さい数で+1していき約数を見つける
.all(|c| inc(T::zero(), c, |x| x <= *b) // その約数の候補を自分以下で足し算していく
.all(|d| d != *b)))}) // 自分が倍数になっていなければOK
}
fn inc<T>(s: T, a: T, f: impl Fn(T) -> bool) -> Unfold<T, impl FnMut(&mut T) -> Option<T>>
where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
unfold(s, move |x| { *x = x.checked_add(&a)?; f(*x).then(|| *x) })
}
2021/12/17(金) 00:00:59.02ID:vT0QTAiv
2021/12/17(金) 00:18:54.26ID:IfdsKAW/
>>51
めっちゃ理解しやすくなったな
まるで宣言型論理プログラミングっぽい雰囲気だ
説明の日本語はこう書くとよい
//素数とは自分未満で次を満たす約数を見つけること
.find(|b| inc(T::one(), T::one(), |x| x < *b)
// 条件は約数の倍数すべて(自分以下)が
.all(|c| inc(T::zero(), c, |x| x <= *b)
// 自分と一致しないこと
.all(|d| d != *b)))})
めっちゃ理解しやすくなったな
まるで宣言型論理プログラミングっぽい雰囲気だ
説明の日本語はこう書くとよい
//素数とは自分未満で次を満たす約数を見つけること
.find(|b| inc(T::one(), T::one(), |x| x < *b)
// 条件は約数の倍数すべて(自分以下)が
.all(|c| inc(T::zero(), c, |x| x <= *b)
// 自分と一致しないこと
.all(|d| d != *b)))})
2021/12/17(金) 00:54:27.00ID:BYm5EDTZ
恥ずかしい自演
2021/12/17(金) 01:40:56.99ID:IfdsKAW/
ん?
あと変数名をわかりやすく変えたほうがいいぞ
あと変数名をわかりやすく変えたほうがいいぞ
2021/12/17(金) 02:46:20.43ID:/GCsHBLw
本スレでクソコード連投してた奴だな
素数列挙をジェネリックにしてうれしがるセンスが厨二病っぽい
素数列挙をジェネリックにしてうれしがるセンスが厨二病っぽい
2021/12/17(金) 05:16:05.83ID:Ph9FgRES
計算量悪くね?
58デフォルトの名無しさん
2021/12/17(金) 07:30:23.20ID:1kSORKuu2021/12/17(金) 07:58:24.35ID:iDAFjWCW
アセンブリ言語
2021/12/17(金) 08:05:48.36ID:Fp+PkeDU
>>58
Wikipediaにすら「当初はアセンブリ言語のみで開発されたが、1973年にほぼ全体をC言語で書き直した。」と書かれているんだけど。
Wikipediaにすら「当初はアセンブリ言語のみで開発されたが、1973年にほぼ全体をC言語で書き直した。」と書かれているんだけど。
2021/12/17(金) 12:07:05.98ID:XK6UjWpG
2021/12/17(金) 12:36:06.54ID:M1BnXuWN
>>55
ご指摘ありがとうございます
変数名を英語やローマ字にしてもわかりにくかったため日本語にしました
あとは無駄な部分を整理した結果シンプルになりました
fn 素数列<T>() -> impl Iterator<Item=T>
where T: Copy + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
range(T::one(), |_| true)
.filter(|&素数|
range(T::one(), |約数| 約数 < 素数)
.all(|約数|
range(約数, |約数倍数| 約数倍数 <= 素数)
.all(|約数倍数| 約数倍数 != 素数)))
}
fn range<T>(unit: T, cond: impl Fn(T) -> bool) -> impl Iterator<Item=T>
where T: Copy + num::CheckedAdd,
{
itertools::unfold(unit, move |x| {
*x = x.checked_add(&unit)?;
cond(*x).then(|| *x)
})
}
fn main() {
itertools::assert_equal(素数列::<i8>(),
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]);
assert_eq!(素数列::<u8>().last(), Some(251));
}
コードが汚いとご批判くださっていた皆さま方
これでいかがでしょうか?
ご指摘ありがとうございます
変数名を英語やローマ字にしてもわかりにくかったため日本語にしました
あとは無駄な部分を整理した結果シンプルになりました
fn 素数列<T>() -> impl Iterator<Item=T>
where T: Copy + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
range(T::one(), |_| true)
.filter(|&素数|
range(T::one(), |約数| 約数 < 素数)
.all(|約数|
range(約数, |約数倍数| 約数倍数 <= 素数)
.all(|約数倍数| 約数倍数 != 素数)))
}
fn range<T>(unit: T, cond: impl Fn(T) -> bool) -> impl Iterator<Item=T>
where T: Copy + num::CheckedAdd,
{
itertools::unfold(unit, move |x| {
*x = x.checked_add(&unit)?;
cond(*x).then(|| *x)
})
}
fn main() {
itertools::assert_equal(素数列::<i8>(),
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]);
assert_eq!(素数列::<u8>().last(), Some(251));
}
コードが汚いとご批判くださっていた皆さま方
これでいかがでしょうか?
2021/12/17(金) 14:02:48.80ID:1gPCJ7Gb
マジで何がしたいんだろこいつ
使えなさ加減は似たようなものだが
計算量を重視するだけ競プロ信者のほうがまだマシ
使えなさ加減は似たようなものだが
計算量を重視するだけ競プロ信者のほうがまだマシ
2021/12/17(金) 15:05:48.68ID:jilrKB7M
コードゴルフみたいなパズル感覚なんじゃね
知らんけど
知らんけど
65デフォルトの名無しさん
2021/12/17(金) 15:26:17.81ID:FYxSWdGJ rustの構文が本当に受け付けない
2021/12/17(金) 15:43:15.77ID:jilrKB7M
2021/12/17(金) 19:26:50.90ID:dBwqVSxt
rustが流行って、こういう素数なんて書く意識高い初心者が量産されて、汚ねぇコードを治すのかと思うと
今から頭痛がしてくる
今から頭痛がしてくる
68デフォルトの名無しさん
2021/12/17(金) 19:33:47.63ID:qRSiIGna2021/12/17(金) 19:45:38.64ID:IfdsKAW/
>>65
今どきは他のプログラミング言語も似たようなものだぜ
例えば配列 [4, 9, 3, 7, 1, 8, 5] から文字列 "9-8-7-5-4-3-1" への変換
【Ruby】
a.sort().reverse().map{|x| x.to_s}.join('-')
【JavaScript】
a.sort().reverse().map(x => x.toString()).join('-')
【Rust】
a.iter().sorted().rev().map(|n| n.to_string()).join("-")
このように些細な違いのみでほとんど一緒
逆に古典的な記述法は以下のようにコードが読みにくい
【Python】
'-'.join(map(lambda x: str(x), reversed(sorted(a))))
今どきは他のプログラミング言語も似たようなものだぜ
例えば配列 [4, 9, 3, 7, 1, 8, 5] から文字列 "9-8-7-5-4-3-1" への変換
【Ruby】
a.sort().reverse().map{|x| x.to_s}.join('-')
【JavaScript】
a.sort().reverse().map(x => x.toString()).join('-')
【Rust】
a.iter().sorted().rev().map(|n| n.to_string()).join("-")
このように些細な違いのみでほとんど一緒
逆に古典的な記述法は以下のようにコードが読みにくい
【Python】
'-'.join(map(lambda x: str(x), reversed(sorted(a))))
2021/12/17(金) 19:52:32.78ID:e4M9F+jO
>>69
FORTHの時代が来たな。
FORTHの時代が来たな。
71デフォルトの名無しさん
2021/12/17(金) 20:12:51.70ID:4mtvzkHU 【Rust】
a.iter().sorted().rev().map(|n| n.to_string()).join("-")
これはどんなアセンブリコード吐くの?
a.iter().sorted().rev().map(|n| n.to_string()).join("-")
これはどんなアセンブリコード吐くの?
2021/12/17(金) 20:32:50.39ID:jilrKB7M
2021/12/17(金) 20:41:41.40ID:IfdsKAW/
2021/12/17(金) 21:36:06.81ID:jaIRX2N3
2021/12/17(金) 23:16:23.03ID:M1BnXuWN
>>71
Rustの各イテレータメソッドは全て各々の固有の構造体(struct)を返すだけです
アセンブリコードはスタック上に確保された構造体の大きさの領域にその値が入ることになるでしょう
そしてその構造体に対してnext()という関数が実装されています
後続の別のイテレータが自分に対してそのnext()を呼び出すことになります
そして他からnext()を呼ばれた側は自分の構造体のデータを利用して値を返します
これらのアセンブリコードは普通の関数呼び出しと同じでしょう
具体例を見たほうが早いと思います
例えばもう少し簡単な以下の例を動かしましょう
fn main() {
let v = vec![5, 6, 7, 8, 9];
v.my_iter().my_print();
}
このベクタvに対してmy_iter()さらにmy_print()とチェーンになっている例で説明します
多くの場合はライブラリにあるイテレータを使うので自分で実装しなくていいのですが
アセンブリコードが気になる(=どう動作しているの?)とのことなのでゼロから実装します
このmy_iter()も構造体を返すだけの関数です
ここでは説明をわかりやすくするためジェネリックでなく
具体的な型『Vec<i32>』(符号付き32bit整数のベクタ)に対してmy_iter()を実装します
まずmy_iter()が返す構造体を定義します
struct MyIter {
vec: Vec<i32>,
index: usize,
}
ベクタの値を次々と返していけるようにベクタとそのインデックスを保有します
変数名と型の位置がC言語とRustでは逆なだけでわかると思います
インデックスのための型『usize』は符号なし整数です
Rustの各イテレータメソッドは全て各々の固有の構造体(struct)を返すだけです
アセンブリコードはスタック上に確保された構造体の大きさの領域にその値が入ることになるでしょう
そしてその構造体に対してnext()という関数が実装されています
後続の別のイテレータが自分に対してそのnext()を呼び出すことになります
そして他からnext()を呼ばれた側は自分の構造体のデータを利用して値を返します
これらのアセンブリコードは普通の関数呼び出しと同じでしょう
具体例を見たほうが早いと思います
例えばもう少し簡単な以下の例を動かしましょう
fn main() {
let v = vec![5, 6, 7, 8, 9];
v.my_iter().my_print();
}
このベクタvに対してmy_iter()さらにmy_print()とチェーンになっている例で説明します
多くの場合はライブラリにあるイテレータを使うので自分で実装しなくていいのですが
アセンブリコードが気になる(=どう動作しているの?)とのことなのでゼロから実装します
このmy_iter()も構造体を返すだけの関数です
ここでは説明をわかりやすくするためジェネリックでなく
具体的な型『Vec<i32>』(符号付き32bit整数のベクタ)に対してmy_iter()を実装します
まずmy_iter()が返す構造体を定義します
struct MyIter {
vec: Vec<i32>,
index: usize,
}
ベクタの値を次々と返していけるようにベクタとそのインデックスを保有します
変数名と型の位置がC言語とRustでは逆なだけでわかると思います
インデックスのための型『usize』は符号なし整数です
2021/12/17(金) 23:19:50.48ID:M1BnXuWN
そしてmy_iter()の関数をVec<i32>に対して実装します
まず以下のtraitの部分は今回おまじないとして無視していいです
trait MyIterTrait {
fn my_iter(self) -> MyIter;
}
次が関数my_iter()のVec<i32>に対する実装(impl)です
impl MyIterTrait for Vec<i32> {
fn my_iter(self) -> MyIter {
MyIter { vec: self, index: 0 }
}
}
このように関数my_iter()は>>75で定義した構造体MyIterを返しているだけです
アセンブリコードはC言語などと同じになるでしょう
ただしC言語では構造体はポインタ返しのみだったと思いますが
Rustでは構造体をそのまま返せてこれはスタック領域にデータが返ります
あとは冒頭に説明しましたイテレータとして機能するためのnext()が必要です
構造体MyIterに対してイテレータの実装(impl)をします
impl Iterator for MyIter {
type Item = i32;
fn next(&mut self) -> Option<i32> {
if self.index < self.vec.len() {
let ret = self.vec[self.index];
self.index += 1;
Some(ret)
} else {
None
}
}
}
ベクタの現在のインデックス値を Some(ret) と返しているだけです
インデックスがベクタの長さを超えたら None を返しています
まず以下のtraitの部分は今回おまじないとして無視していいです
trait MyIterTrait {
fn my_iter(self) -> MyIter;
}
次が関数my_iter()のVec<i32>に対する実装(impl)です
impl MyIterTrait for Vec<i32> {
fn my_iter(self) -> MyIter {
MyIter { vec: self, index: 0 }
}
}
このように関数my_iter()は>>75で定義した構造体MyIterを返しているだけです
アセンブリコードはC言語などと同じになるでしょう
ただしC言語では構造体はポインタ返しのみだったと思いますが
Rustでは構造体をそのまま返せてこれはスタック領域にデータが返ります
あとは冒頭に説明しましたイテレータとして機能するためのnext()が必要です
構造体MyIterに対してイテレータの実装(impl)をします
impl Iterator for MyIter {
type Item = i32;
fn next(&mut self) -> Option<i32> {
if self.index < self.vec.len() {
let ret = self.vec[self.index];
self.index += 1;
Some(ret)
} else {
None
}
}
}
ベクタの現在のインデックス値を Some(ret) と返しているだけです
インデックスがベクタの長さを超えたら None を返しています
2021/12/17(金) 23:24:42.83ID:M1BnXuWN
ではこの>>76の構造体MyIterのnext()は誰がいつ呼ぶのでしょう?
ここではメソッドチェーンになっているので後続のイテレータが呼びます
具体的には>>75で v.my_iter().my_print(); でしたからmy_print()が呼び出します
そこで関数my_print()の定義です
今回もtraitの部分はおまじないと思って無視していいです
trait MyPrint {
fn my_print(&mut self);
}
下記で任意のイテレータに対して関数my_print()を実装(impl)します
そのためこの部分だけはジェネリック指定『<I: Iterator>』のコードをご容赦ください
後ろのwhere以降の std::fmt::Display は表示を許可するためのおまじないと思ってください
impl<I: Iterator> MyPrint for I
where I::Item: std::fmt::Display
{
fn my_print(&mut self) {
while let Some(val) = self.next() {
println!("{}", val);
}
}
}
ここでmy_print()のselfというのはここでimpl対象=先行するイテレータすなわちMyIterになります
もちろんMyIter以外の別のイテレータに対してもこのmy_print()は機能します
今回の使い方ではselfは構造体MyIterになりますから
whileのところにあるself.next()も先程定義したMyIterのnext()になります
next()の返り値が Some である限りprintln!で表示して None になるとwhileを抜けて終了です
以上で冒頭の以下の例の全てコードが実装されましたので動きます
fn main() {
let v = vec![5, 6, 7, 8, 9];
v.my_iter().my_print();
}
ここではメソッドチェーンになっているので後続のイテレータが呼びます
具体的には>>75で v.my_iter().my_print(); でしたからmy_print()が呼び出します
そこで関数my_print()の定義です
今回もtraitの部分はおまじないと思って無視していいです
trait MyPrint {
fn my_print(&mut self);
}
下記で任意のイテレータに対して関数my_print()を実装(impl)します
そのためこの部分だけはジェネリック指定『<I: Iterator>』のコードをご容赦ください
後ろのwhere以降の std::fmt::Display は表示を許可するためのおまじないと思ってください
impl<I: Iterator> MyPrint for I
where I::Item: std::fmt::Display
{
fn my_print(&mut self) {
while let Some(val) = self.next() {
println!("{}", val);
}
}
}
ここでmy_print()のselfというのはここでimpl対象=先行するイテレータすなわちMyIterになります
もちろんMyIter以外の別のイテレータに対してもこのmy_print()は機能します
今回の使い方ではselfは構造体MyIterになりますから
whileのところにあるself.next()も先程定義したMyIterのnext()になります
next()の返り値が Some である限りprintln!で表示して None になるとwhileを抜けて終了です
以上で冒頭の以下の例の全てコードが実装されましたので動きます
fn main() {
let v = vec![5, 6, 7, 8, 9];
v.my_iter().my_print();
}
2021/12/17(金) 23:54:35.76ID:M1BnXuWN
今回>>77のmy_print()はメソッドチェーンの最後なので構造体を返していません
だから正確にはmy_print()はイテレータではなくイテレータに実装されたメソッド(の一つ)という立場だけです
逆に言えばメソッドチェーンの途中の全てのイテレータメソッドは各々の固有の構造体を返します
そして後続のイテレータ(など)からnext()の値を要求されたらそれを返す動作のみするのがイテレータです
長いメソッドチェーンで一番最後がnext()を要求して連鎖的に最初のnext()が呼ばれるパターンもよく有ります
なぜなら多くのケースで途中のイテレータは自分のnext()実装で先行するイテレータのnext()を呼び出すからです
そして連鎖的にnext()呼び出しが生じても動作原理は多段の関数呼び出しと同じです
したがって元の質問>>71「どんなアセンブリコード吐くの?」も
「イテレータとして機能するメソッド呼び出しは単なる関数であって構造体を返すだけ」と
「あとで後続からその構造体に実装されてるnext()関数が呼ばれる」だけなのです
特別な仕組みとか裏でインタプリタやランタイムや魔法が密かに動いている、ってことはないです
だから正確にはmy_print()はイテレータではなくイテレータに実装されたメソッド(の一つ)という立場だけです
逆に言えばメソッドチェーンの途中の全てのイテレータメソッドは各々の固有の構造体を返します
そして後続のイテレータ(など)からnext()の値を要求されたらそれを返す動作のみするのがイテレータです
長いメソッドチェーンで一番最後がnext()を要求して連鎖的に最初のnext()が呼ばれるパターンもよく有ります
なぜなら多くのケースで途中のイテレータは自分のnext()実装で先行するイテレータのnext()を呼び出すからです
そして連鎖的にnext()呼び出しが生じても動作原理は多段の関数呼び出しと同じです
したがって元の質問>>71「どんなアセンブリコード吐くの?」も
「イテレータとして機能するメソッド呼び出しは単なる関数であって構造体を返すだけ」と
「あとで後続からその構造体に実装されてるnext()関数が呼ばれる」だけなのです
特別な仕組みとか裏でインタプリタやランタイムや魔法が密かに動いている、ってことはないです
2021/12/17(金) 23:54:47.66ID:9qxPUMA0
文章を構造化できない人はコードを構造化することもできない
ひとりよがりが過ぎる
ひとりよがりが過ぎる
2021/12/17(金) 23:59:22.81ID:M1BnXuWN
>>79
では修正点や改善点などをお待ちしておりますw
では修正点や改善点などをお待ちしておりますw
81デフォルトの名無しさん
2021/12/18(土) 01:55:26.24ID:S/VVluSn ヒトに頼るな。
82デフォルトの名無しさん
2021/12/18(土) 02:17:36.05ID:Km8Qla7W ワロタ
2021/12/18(土) 02:17:43.63ID:793c4/xS
どんなアセンブリコード返すのという質問なんだから >>72 みたいにアセンブリ示せばよかろうに
2021/12/18(土) 02:43:52.24ID:8AnTZJX+
イテレータの作りを説明してくれた人ありがとう
それ自体は他の言語でもよくあるパターンだね
ただ聞きたかったのは効率を重視するはずの(と思っている)言語が
この書き方で効率のよいコードを吐けるかどうかってこと
>a.iter().sorted().rev().map(|n| n.to_string()).join("-")
Rustはimmutableが基本と言う話を聞いてるからもしかしたら
新しいオブジェクトを生成しまくってるんじゃないかと思ったんだよ
この書き方をしてC/C++と同レベルの効率のコードが吐けるのかなって
それ自体は他の言語でもよくあるパターンだね
ただ聞きたかったのは効率を重視するはずの(と思っている)言語が
この書き方で効率のよいコードを吐けるかどうかってこと
>a.iter().sorted().rev().map(|n| n.to_string()).join("-")
Rustはimmutableが基本と言う話を聞いてるからもしかしたら
新しいオブジェクトを生成しまくってるんじゃないかと思ったんだよ
この書き方をしてC/C++と同レベルの効率のコードが吐けるのかなって
2021/12/18(土) 02:56:00.48ID:793c4/xS
>>84
そのコードは to_string() を要素数だけ呼んで最後に join してるからヒープアロケーションの回数が気になる場合は使うべきでないコードだね
だだrustのイテレーターのメソッドチェーン自体は不要なヒープアロケーション行わないしメソッドはインライン展開できるので
ある程度複雑なメソッドチェーンでもfor文と同じようなアセンブリになると言われているよ
そのコードは to_string() を要素数だけ呼んで最後に join してるからヒープアロケーションの回数が気になる場合は使うべきでないコードだね
だだrustのイテレーターのメソッドチェーン自体は不要なヒープアロケーション行わないしメソッドはインライン展開できるので
ある程度複雑なメソッドチェーンでもfor文と同じようなアセンブリになると言われているよ
2021/12/18(土) 03:05:51.15ID:DtboORpD
>>84
例えばCのfor文などと比較すると、
その変化していく変数は構造体の中だが大元の関数のスタック上すなわちローカル変数と同じだからCと変わらん
あとinline展開指定されてるものなどで関数呼び出しオーバーヘッドも消えて前後のコードが繋がって最適化されるパターンもある
だから気にせずに使っても誤差範囲
例えばCのfor文などと比較すると、
その変化していく変数は構造体の中だが大元の関数のスタック上すなわちローカル変数と同じだからCと変わらん
あとinline展開指定されてるものなどで関数呼び出しオーバーヘッドも消えて前後のコードが繋がって最適化されるパターンもある
だから気にせずに使っても誤差範囲
2021/12/18(土) 03:17:03.48ID:NcZGWI1L
RustってC++に似てるな
ゲロみたいな構文だ
ゲロみたいな構文だ
2021/12/18(土) 03:38:45.07ID:DtboORpD
>>85
結局メソッドチェーンとは別問題として
一般的にVecやStringなどのヒープ使うものがループ内にあると注意やな
あとcollectでスタック使うArrayVecやArrayStringを指定する手もあるな
結局メソッドチェーンとは別問題として
一般的にVecやStringなどのヒープ使うものがループ内にあると注意やな
あとcollectでスタック使うArrayVecやArrayStringを指定する手もあるな
2021/12/18(土) 04:55:38.30ID:DtboORpD
>>69
> 配列 [4, 9, 3, 7, 1, 8, 5] から文字列 "9-8-7-5-4-3-1" への変換
> a.iter().sorted().rev().map(|n| n.to_string()).join("-")
このコード自体は他言語との類似比較のために冗長に書かれていて無駄がある
join("-")はDisplay実装あれば通るから事前のto_string()は不要
つまりa.iter().sorted().rev().join("-")でOK
さらにsorted()はヒープに結果Vecを確保する
もし元を書き換えていいならヒープ確保をjoin()でのString一つだけで済む
let mut a = [4, 9, 3, 7, 1, 8, 5];
a.sort();
assert_eq!("9-8-7-5-4-3-1", a.iter().rev().join("-"));
このrev()を無くすためにa.sort_by(|x, y| y.cmp(x))にするとcmp関数でやや不利
一方でrev()使用は配列やVec相手ならDoubleEndedIterator実装があるからコストかからない
現実にはこのコードが核心部分でなければそこまで気にしなくていいけどな
> 配列 [4, 9, 3, 7, 1, 8, 5] から文字列 "9-8-7-5-4-3-1" への変換
> a.iter().sorted().rev().map(|n| n.to_string()).join("-")
このコード自体は他言語との類似比較のために冗長に書かれていて無駄がある
join("-")はDisplay実装あれば通るから事前のto_string()は不要
つまりa.iter().sorted().rev().join("-")でOK
さらにsorted()はヒープに結果Vecを確保する
もし元を書き換えていいならヒープ確保をjoin()でのString一つだけで済む
let mut a = [4, 9, 3, 7, 1, 8, 5];
a.sort();
assert_eq!("9-8-7-5-4-3-1", a.iter().rev().join("-"));
このrev()を無くすためにa.sort_by(|x, y| y.cmp(x))にするとcmp関数でやや不利
一方でrev()使用は配列やVec相手ならDoubleEndedIterator実装があるからコストかからない
現実にはこのコードが核心部分でなければそこまで気にしなくていいけどな
90デフォルトの名無しさん
2021/12/18(土) 05:17:14.76ID:S/VVluSn 一つだけアドバイスしとくけど、ジェームス・ボンドが日本人だったら、大木・凡人だからね。
2021/12/18(土) 08:35:30.45ID:7eXg1jWI
>>74
Rustを使ってればカッコイイという錯覚で、何も分かってないのに汚物のようなコードと意味不明な長文をまき散らす…
あんなに単純な初期のJavaやC#でさえスパゲッティコードだらけなのに、日本語の説明さえも気持ち悪い
Rustを使ってればカッコイイという錯覚で、何も分かってないのに汚物のようなコードと意味不明な長文をまき散らす…
あんなに単純な初期のJavaやC#でさえスパゲッティコードだらけなのに、日本語の説明さえも気持ち悪い
2021/12/18(土) 10:28:10.29ID:ThzZjx8/
2021/12/18(土) 11:41:10.36ID:mvmw4Z8Y
長文二人は属性が似過ぎだろ
こんなのが二人もいればRustスレが気持ち悪くなるわな
こんなのが二人もいればRustスレが気持ち悪くなるわな
2021/12/18(土) 16:44:21.13ID:QlLdBEfz
顔真っ赤で根拠も反論もない「こじらせてんな」マンが永遠と長文や短文を書き、本Rustすれに代わりキチガイを集めるスレ
95デフォルトの名無しさん
2021/12/18(土) 17:42:36.78ID:SCKEmW4H 延々とな
ガイジそう
ガイジそう
2021/12/18(土) 18:08:14.57ID:BJvml2Bt
元々rustスレの隔離スレなんだから大成功でしょ
2021/12/18(土) 20:19:16.51ID:Yd1FvpqW
98デフォルトの名無しさん
2021/12/18(土) 21:02:25.05ID:S/VVluSn > この難しさを取り除くために、Rustは、C/C++の落とし穴を排除し、その過程で使いやすく役に立つ
> 洗練された一連のツールを提供します。 低レベルな制御に「下がる」必要があるプログラマは、
> C/C++のクラッシュやセキュリティホールのリスクを負わず、 気まぐれなツールチェーンのデリケートな
> 部分を学ぶ必要なくRustで同じことができます。さらにいいことに、 Rustは、スピードとメモリ使用の観点で
> 効率的な信頼性の高いコードへと自然に導くよう設計されています。
> 洗練された一連のツールを提供します。 低レベルな制御に「下がる」必要があるプログラマは、
> C/C++のクラッシュやセキュリティホールのリスクを負わず、 気まぐれなツールチェーンのデリケートな
> 部分を学ぶ必要なくRustで同じことができます。さらにいいことに、 Rustは、スピードとメモリ使用の観点で
> 効率的な信頼性の高いコードへと自然に導くよう設計されています。
2021/12/18(土) 21:05:46.31ID:xTzqLdo0
顔真っ赤Rustオジサンの「 >」、やっぱ同一人物だったかw
100デフォルトの名無しさん
2021/12/18(土) 21:56:16.22ID:SfwydFh9 >>84
その、新しいオブジェクトを生成しまくってるんじゃないか、の意味が曖昧なので
自動的にヒープ領域から動的に新たなメモリ確保をすると解釈すると、それはないです
Rustでもプログラムで明示的に指定しない限り勝手にそういうことが起きることはありません
もちろん例えばVec型(伸長可能な配列)やString型(伸長可能な文字列)を新たに返す関数を使えば
それはプログラムで明示的に指定したことになり、当然ヒープ領域が使われます
一般的にイテレータの長い連鎖があっても各イテレータが返す(=用いる)構造体は各1つで
それらはコンパイル時に静的に確定してスタック上にローカル変数と同様に領域が確保されます
したがってイテレータ連鎖で動的にヒープが使われうるのは例えば
(1) イテレータがクロージャを引数として取る場合にそのクロージャのコードがヒープを使うものである場合
(2) sorted()のように前イテレータから全要素を一旦受け取る必要がある途中のイテレータが一時格納場所としてヒープを用いる場合
(3) collect()のようにイテレータ連鎖の最後に全要素を収集してVecやStringなどを新たに生成する場合
いずれもそれらの関数やクロージャをプログラムで使用した時のみ、動的にヒープが使われます
その、新しいオブジェクトを生成しまくってるんじゃないか、の意味が曖昧なので
自動的にヒープ領域から動的に新たなメモリ確保をすると解釈すると、それはないです
Rustでもプログラムで明示的に指定しない限り勝手にそういうことが起きることはありません
もちろん例えばVec型(伸長可能な配列)やString型(伸長可能な文字列)を新たに返す関数を使えば
それはプログラムで明示的に指定したことになり、当然ヒープ領域が使われます
一般的にイテレータの長い連鎖があっても各イテレータが返す(=用いる)構造体は各1つで
それらはコンパイル時に静的に確定してスタック上にローカル変数と同様に領域が確保されます
したがってイテレータ連鎖で動的にヒープが使われうるのは例えば
(1) イテレータがクロージャを引数として取る場合にそのクロージャのコードがヒープを使うものである場合
(2) sorted()のように前イテレータから全要素を一旦受け取る必要がある途中のイテレータが一時格納場所としてヒープを用いる場合
(3) collect()のようにイテレータ連鎖の最後に全要素を収集してVecやStringなどを新たに生成する場合
いずれもそれらの関数やクロージャをプログラムで使用した時のみ、動的にヒープが使われます
101デフォルトの名無しさん
2021/12/18(土) 22:26:29.42ID:et4A8EY0 何が気持ち悪いかというと
自分も知らなかったことを調べてきてさも知ってたかのように上から目線でレスする精神
気持ち悪い
そしてその内容がいつも間違えてるからゲロ吐く気分になる
自分も知らなかったことを調べてきてさも知ってたかのように上から目線でレスする精神
気持ち悪い
そしてその内容がいつも間違えてるからゲロ吐く気分になる
102デフォルトの名無しさん
2021/12/19(日) 08:59:28.05ID:YgvfWs4x 多少の間違いがあっても要点をおさえて質問に正面から答えてるんならまだいいんだけどねー
困ったもんだ
困ったもんだ
103デフォルトの名無しさん
2021/12/19(日) 23:44:42.02ID:cDs+Q4pL 間違いがあれば俺が指摘修整してやるから安心しろ
おまえら雑魚はそれでいい
おまえら雑魚はそれでいい
104デフォルトの名無しさん
2021/12/20(月) 01:37:10.75ID:6C5yewwt おまえは間違ってるって主張だけだと数学100点の人と同じだぞ
せっかくだからどこが間違ってるか指摘してあげなよ
せっかくだからどこが間違ってるか指摘してあげなよ
105デフォルトの名無しさん
2021/12/20(月) 01:50:44.40ID:+mZvzmRI そいつらは前スレからそんな感じだから放置されてる
ガイジとかゲロとか汚などの言葉を好む
具体的なコードや具体的な指摘は出来ないダメな連中
ガイジとかゲロとか汚などの言葉を好む
具体的なコードや具体的な指摘は出来ないダメな連中
106デフォルトの名無しさん
2021/12/20(月) 13:09:41.04ID:Wae1ffBl プログラム勉強しはじめたんだけど、CとかC++よりもRUSTのほうがかっこよさげだからRUSTやってる
107デフォルトの名無しさん
2021/12/20(月) 17:47:27.57ID:WdsmvZWK 意識他界系かよ
108デフォルトの名無しさん
2021/12/20(月) 18:01:18.12ID:+DS1Ebvj CやLispからはじめるのが意識高い系
Rustからはじめるのはカッコつけたいだけの単なる無知
Rustからはじめるのはカッコつけたいだけの単なる無知
109デフォルトの名無しさん
2021/12/20(月) 18:21:17.98ID:k0WQlEJJ C++から始めるのは何系?
110デフォルトの名無しさん
2021/12/20(月) 18:34:34.79ID:LHZmynrD CがあるのにC++から始めるひとはガイジ系
111デフォルトの名無しさん
2021/12/20(月) 18:37:40.57ID:WdsmvZWK 10年早い系
112デフォルトの名無しさん
2021/12/20(月) 19:11:56.15ID:S0D0uK3y ウッホウッホホ、マウンテンゴリラです。得意なのはドラミングで毎日ドコドコやってます
113デフォルトの名無しさん
2021/12/20(月) 19:19:22.55ID:wggVCSJj >>108
なんでrustからだとあかんの?
なんでrustからだとあかんの?
114デフォルトの名無しさん
2021/12/20(月) 19:54:01.15ID:ceMzU2Ib マルチパラダイムだからでは。
115デフォルトの名無しさん
2021/12/20(月) 20:10:25.93ID:wggVCSJj >>114
よく知りもせんなら黙ってろや
よく知りもせんなら黙ってろや
116デフォルトの名無しさん
2021/12/20(月) 20:22:01.28ID:qir2xW7W 最近c++勉強始めたんだが、cとかmapも使えないじゃん
どうしてんの?
どうしてんの?
117デフォルトの名無しさん
2021/12/20(月) 20:29:53.40ID:ceMzU2Ib mapを作るための言語がCだから。
118デフォルトの名無しさん
2021/12/20(月) 21:00:54.00ID:MpI5dMic RustはコンパイラもライブラリもRustで書かれているね
119デフォルトの名無しさん
2021/12/20(月) 21:10:35.52ID:WdsmvZWK >>116
昔はアルゴリズムの教本を参考にして全部1からつくってた
昔はアルゴリズムの教本を参考にして全部1からつくってた
120デフォルトの名無しさん
2021/12/20(月) 21:56:05.64ID:MpI5dMic 今も必要があれば車輪の再発明をする能力を持つ人と持たない人にプログラマーは二分される
前者は新たな枠組みを作ることも可能な生産者
後者は既存の枠組みを使うだけの消費者
前者は新たな枠組みを作ることも可能な生産者
後者は既存の枠組みを使うだけの消費者
121デフォルトの名無しさん
2021/12/20(月) 23:37:11.43ID:qir2xW7W 俺には検討もつかんわ
所詮俺は消費者か…
所詮俺は消費者か…
122デフォルトの名無しさん
2021/12/20(月) 23:37:21.66ID:qir2xW7W 見当
123デフォルトの名無しさん
2021/12/20(月) 23:47:18.19ID:ceMzU2Ib コンシューマーって言えばカッコよくなるよ。
124デフォルトの名無しさん
2021/12/21(火) 02:18:43.99ID:ukVjEMSL プロデューサーとコンシューマーと呼ぶと両方存在して初めて意味を持ちそうな感じがするな
125デフォルトの名無しさん
2021/12/21(火) 02:38:28.55ID:XzF1jwer この場合の生産者は、制作者(プロデューサー)ではなくて創造者(クリエイター)の方が近い
126デフォルトの名無しさん
2021/12/21(火) 08:29:08.29ID:J9NEE3Tt もっともらしく言ってるけど
新たな枠組みを作ることができるかどうかに
車輪の再発明をする能力は関係ないよ
新たな枠組みを作ることができるかどうかに
車輪の再発明をする能力は関係ないよ
127デフォルトの名無しさん
2021/12/21(火) 08:37:17.38ID:91RXJaij プログラミングにおいて車輪の再発明すら出来ない人が
プログラミングにおいて新たな枠組みを作るのは無理
プログラミングにおいて新たな枠組みを作るのは無理
128デフォルトの名無しさん
2021/12/21(火) 08:59:49.41ID:1P8ZKx5y ザッカーバーグとかツールレベルでいえばあるもの使ってただけだがな。
129デフォルトの名無しさん
2021/12/21(火) 09:42:52.55ID:oIl64W+t クイックソートくらいは自作してみたほうがいい
最初混乱するだろうけど、ああなるほど!となった時に必ず経験値に加算される筈だ
最初混乱するだろうけど、ああなるほど!となった時に必ず経験値に加算される筈だ
130デフォルトの名無しさん
2021/12/21(火) 10:37:29.68ID:91RXJaij >>128
そりゃ彼はプログラミングにおいて新たな枠組みを作ったわけではないからな
そりゃ彼はプログラミングにおいて新たな枠組みを作ったわけではないからな
131デフォルトの名無しさん
2021/12/21(火) 12:47:53.03ID:ukVjEMSL 新たな枠組みって例えば何?
フレームワークのことではなさそうだけど
フレームワークのことではなさそうだけど
132デフォルトの名無しさん
2021/12/21(火) 13:12:13.10ID:fLSFmYOm 例えば画像データの取り扱いでbitmapをそのまま処理していたような時代にpngやjpgなどのアルゴリズムをはじめて考え出して
実装したようなプログラマが新たな枠組みを作ることが出来る人
既存のライブラリ使って画像処理や表示のアプリを実装しているようなプログラマが枠組みを使うだけの人
実装したようなプログラマが新たな枠組みを作ることが出来る人
既存のライブラリ使って画像処理や表示のアプリを実装しているようなプログラマが枠組みを使うだけの人
133デフォルトの名無しさん
2021/12/21(火) 13:13:16.14ID:91RXJaij もちろん例としてプログラミングのフレームワークでもいいんじゃね?
例えばそのザッカーバーグの例ならば
Facebook社はプログラミングにおいて新たな枠組みとして世間にも広まるほどのReactを作った
一方でザッカーバーグ自体はReactを今から車輪の再発明すらできないしプログラミングにおいて新たな枠組みを作れないだろう
例えばそのザッカーバーグの例ならば
Facebook社はプログラミングにおいて新たな枠組みとして世間にも広まるほどのReactを作った
一方でザッカーバーグ自体はReactを今から車輪の再発明すらできないしプログラミングにおいて新たな枠組みを作れないだろう
134デフォルトの名無しさん
2021/12/21(火) 14:51:21.09ID:SKVIwMRv 枠組みに限らず何か新しいもの自力で作るには
その対象レイヤーのものを作れる能力は必要
それは当たり前
ザッカーバーグだって掲示板システムを実装する能力があったからFacebookを作れたわけだが
それを「車輪の再発明する能力」と呼ぶのかどうか
「新しい枠組み」と「車輪の再発明をする能力」の定義が曖昧すぎて中身がない
その対象レイヤーのものを作れる能力は必要
それは当たり前
ザッカーバーグだって掲示板システムを実装する能力があったからFacebookを作れたわけだが
それを「車輪の再発明する能力」と呼ぶのかどうか
「新しい枠組み」と「車輪の再発明をする能力」の定義が曖昧すぎて中身がない
135デフォルトの名無しさん
2021/12/21(火) 14:53:33.71ID:SKVIwMRv 結局のところ
「低レイヤーの開発をするには低レイヤーの実装能力が必要」という主張でしかない
「低レイヤーの開発をするには低レイヤーの実装能力が必要」という主張でしかない
136デフォルトの名無しさん
2021/12/21(火) 15:02:25.60ID:91RXJaij そこは定義でもめるから深入りしない
例えば例に挙げたReactは自分の観点からは低レイヤーではなく高レイヤー
結局これでいいかね?
各分野のプログラミングにおいて車輪の再発明すら出来ない人が
その分野のプログラミングにおいて新たな枠組みを作るのは無理
例えば例に挙げたReactは自分の観点からは低レイヤーではなく高レイヤー
結局これでいいかね?
各分野のプログラミングにおいて車輪の再発明すら出来ない人が
その分野のプログラミングにおいて新たな枠組みを作るのは無理
137デフォルトの名無しさん
2021/12/21(火) 16:17:27.88ID:ukVjEMSL 車輪の再発明って何
自身で模倣できる程度には理解しているということ?
自身で模倣できる程度には理解しているということ?
138デフォルトの名無しさん
2021/12/21(火) 17:55:52.77ID:dNZ8oAHl レイヤーは相対的なものだよ
低レイヤーで通じないなら下位レイヤーとでも言おうか
Reactのユーザーから見ればReactそのものの開発は下位レイヤー
Reactを作るために下位レイヤーのJavaScriptエンジンやレンダリングエンジンを再発明できる能力が必要か?
低レイヤーで通じないなら下位レイヤーとでも言おうか
Reactのユーザーから見ればReactそのものの開発は下位レイヤー
Reactを作るために下位レイヤーのJavaScriptエンジンやレンダリングエンジンを再発明できる能力が必要か?
139デフォルトの名無しさん
2021/12/21(火) 19:16:57.14ID:91RXJaij 話はシンプル
それぞれの分野で見ればよい
Reactの分野だったら
『自分でウェブフロントフレームワークを簡易なものでよいから作ったことあるか?あるいは作れるか?』
これだけの話
つまりReactの開発者たちと同じような立ち位置に立てるプログラマーなのか、
それともReactの消費者としてユーザーの立場のプログラマーなのか、の違い
それぞれの分野で見ればよい
Reactの分野だったら
『自分でウェブフロントフレームワークを簡易なものでよいから作ったことあるか?あるいは作れるか?』
これだけの話
つまりReactの開発者たちと同じような立ち位置に立てるプログラマーなのか、
それともReactの消費者としてユーザーの立場のプログラマーなのか、の違い
140デフォルトの名無しさん
2021/12/21(火) 21:33:34.81ID:FgftkvCZ まとめると
「新しいウェブフロントフレームワークを作るには
ウェブフロントフレームワークを作る能力が必要」
そりゃそうだ
話はシンプルシンプル
「新しいウェブフロントフレームワークを作るには
ウェブフロントフレームワークを作る能力が必要」
そりゃそうだ
話はシンプルシンプル
141デフォルトの名無しさん
2021/12/21(火) 22:16:57.85ID:B7hTDXPV なんだよこれ遅っせーなー
意味分かんねーんだよこの挙動
俺のほうがもっとうまく作れる
意味分かんねーんだよこの挙動
俺のほうがもっとうまく作れる
142デフォルトの名無しさん
2021/12/21(火) 23:02:50.37ID:BV9oeByN 消費者プログラマーは色んな仕組みをわかっていなかったり理解できなかったりする人が多いね
そうなると車輪の再発明すらできないし車輪の改良もできない
もちろん車輪に代わる新たな仕組みを作り出すこともできない
そうなると車輪の再発明すらできないし車輪の改良もできない
もちろん車輪に代わる新たな仕組みを作り出すこともできない
143デフォルトの名無しさん
2021/12/21(火) 23:19:52.13ID:aVQrTCZW >>138
これ本気で言ってるのか
これ本気で言ってるのか
144デフォルトの名無しさん
2021/12/21(火) 23:37:27.40ID:BV9oeByN 元の話はmapの実装方法がわからない、だから、もっと深刻な状況なのか
プログラミングする上での基本的なことは
車輪の再発明であろうと自分でやってみて体験していくべき
プログラミングする上での基本的なことは
車輪の再発明であろうと自分でやってみて体験していくべき
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 自民・麻生太郎副総裁 石破政権の1年は「どよーん」 高市政権発足で「何となく明るくなった」「世の中のことが決まり動いている」★2 [Hitzeschleier★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- 【山形】クマ駆除で誤射した猟友会隊員に町が1663万円請求へ...弾当たり男性大けが2023年 小国町 [nita★]
- 中国人、ガチ超正論。「日本人がアイヌに対してやったことを『問題ない』とするなら、中国が日本人に同じことをしても文句ないだろう?」 [314039747]
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- 木曜日のんなっしょい❗(・o・🍬)仕放題スレ🏡
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
- 官僚「台湾有事についての質問か、『政府として逐一答えない』と…(カタカタカタ)」高市「私1人で答弁できるわよ!」 [972432215]
- 【悲報】麻生太郎さん、オムツをしていた。晋さん…ここにいたんだね… [731544683]
