文字数制限きついので改題
スレタイ以外の言語もok
前スレ
次世代言語議論スレ[Rust Kotlin Haskell]第6世代
http://mevius.5ch.net/test/read.cgi/tech/1503924817/
探検
次世代言語Part7[Go Rust Swift Kotlin TypeScript]
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2017/10/19(木) 17:51:38.66ID:EPSDvC75114デフォルトの名無しさん
2017/10/24(火) 16:23:54.68ID:rmRTTRfd115デフォルトの名無しさん
2017/10/24(火) 18:42:18.67ID:bbIPnu9e なぜrustの対抗馬にTypeScriptが挙がるのかまるで理解できない
用途が全然違うだろ……
用途が全然違うだろ……
116デフォルトの名無しさん
2017/10/24(火) 19:07:54.15ID:x0LH18ak WebAssemblyが期待されてるから、あながち間違いでもない
117デフォルトの名無しさん
2017/10/24(火) 21:40:46.56ID:eZrIsy4p >>113
ほんとMSってそういう所は笑えるくらいすごいよな
Rust開発者たちも見習ってほしい
一応rustもコード補完にrlsとかいうヤツあるけどなんかまだいまいちなんだよな。
vscodeにrust(rls)っていうエクテンション入れて使ってるんだけど、
クロージャ書いてるときは補完が効かないのは俺だけ?
あとlint?(エラー・警告を赤・緑の下線で表示してくれるやつ)が
時々なんの前触れもなく急に無反応になるんだけどそれも俺だけ?
ほんとMSってそういう所は笑えるくらいすごいよな
Rust開発者たちも見習ってほしい
一応rustもコード補完にrlsとかいうヤツあるけどなんかまだいまいちなんだよな。
vscodeにrust(rls)っていうエクテンション入れて使ってるんだけど、
クロージャ書いてるときは補完が効かないのは俺だけ?
あとlint?(エラー・警告を赤・緑の下線で表示してくれるやつ)が
時々なんの前触れもなく急に無反応になるんだけどそれも俺だけ?
118デフォルトの名無しさん
2017/10/24(火) 22:14:01.00ID:FaGN7Q1b 少人数のMS社員が片手間でVSCode作ってみたら一瞬で天下獲れちゃいましたというチート集団
MSがRust推せば余裕でGo潰してベターC++の定番を奪えるだろうな
MSがRust推せば余裕でGo潰してベターC++の定番を奪えるだろうな
119デフォルトの名無しさん
2017/10/24(火) 22:51:21.66ID:z3aqO0G+ 片手間ってことはないし、エディタ作成なんてのは人数増やせばいいものでもない。
まあチート軍団ってのは確かだけど。
しかし Rust とか c++ みたいに教条主義的な言語ってやっぱ信者が湧くね。
わかりやすくていいとは思うけど。
まあチート軍団ってのは確かだけど。
しかし Rust とか c++ みたいに教条主義的な言語ってやっぱ信者が湧くね。
わかりやすくていいとは思うけど。
120デフォルトの名無しさん
2017/10/24(火) 23:14:23.65ID:MOiTAdLh 片手間とか余裕とか、良い子は絶対に真似してはいけない情報ばっかり教えるんだよな
そんなところに信者を集めたら怠け者の集団ができそうだ
そんなところに信者を集めたら怠け者の集団ができそうだ
121デフォルトの名無しさん
2017/10/25(水) 00:51:09.03ID:KYsAJ7k0 >>36じゃないけど、雑に平衡木(AA木)Cで実装してみた。
つってもWikipediaのまるコピだが。
#include <stdio.h>
#include <stdlib.h>
typedef struct tree {
int value;
struct tree* left;
struct tree* right;
int level;
} tree_t;
int level(tree_t* t) {
if (t == NULL) {
return 0;
}
return t->level;
}
tree_t* leftEnd(tree_t* t) {
if (t == NULL) {
return t;
} else if (t->left == NULL) {
return t;
} else {
return leftEnd(t->left);
}
}
(続く)
つってもWikipediaのまるコピだが。
#include <stdio.h>
#include <stdlib.h>
typedef struct tree {
int value;
struct tree* left;
struct tree* right;
int level;
} tree_t;
int level(tree_t* t) {
if (t == NULL) {
return 0;
}
return t->level;
}
tree_t* leftEnd(tree_t* t) {
if (t == NULL) {
return t;
} else if (t->left == NULL) {
return t;
} else {
return leftEnd(t->left);
}
}
(続く)
122デフォルトの名無しさん
2017/10/25(水) 00:51:31.44ID:KYsAJ7k0 tree_t* rightEnd(tree_t* t) {
if (t == NULL) {
return t;
} else if (t->right == NULL) {
return t;
} else {
return rightEnd(t->right);
}
}
tree_t* skew(tree_t* t) {
if (t == NULL) {
return t;
} else if (t->left == NULL) {
return t;
} else if (t->left->level != t->level) {
return t;
}
tree_t* l = t->left;
t->left = l->right;
l->right = t;
return l;
}
(まだ続く)
if (t == NULL) {
return t;
} else if (t->right == NULL) {
return t;
} else {
return rightEnd(t->right);
}
}
tree_t* skew(tree_t* t) {
if (t == NULL) {
return t;
} else if (t->left == NULL) {
return t;
} else if (t->left->level != t->level) {
return t;
}
tree_t* l = t->left;
t->left = l->right;
l->right = t;
return l;
}
(まだ続く)
123デフォルトの名無しさん
2017/10/25(水) 00:52:33.16ID:KYsAJ7k0 tree_t* split(tree_t* t) {
if (t == NULL) {
return t;
} else if (t->right == NULL) {
return t;
} else if (t->right->right == NULL) {
return t;
} else if (t->level != t->right->right->level) {
return t;
}
tree_t* r = t->right;
t->right = r->left;
r->left = t;
r->level += 1;
return r;
}
(続く)
if (t == NULL) {
return t;
} else if (t->right == NULL) {
return t;
} else if (t->right->right == NULL) {
return t;
} else if (t->level != t->right->right->level) {
return t;
}
tree_t* r = t->right;
t->right = r->left;
r->left = t;
r->level += 1;
return r;
}
(続く)
124デフォルトの名無しさん
2017/10/25(水) 00:52:56.15ID:KYsAJ7k0 tree_t* decreaseLevel(tree_t* t) {
if (t == NULL) {
return t;
}
int ll = level(t->left);
int rl = level(t->right);
int expectedLv;
if (ll < rl) {
expectedLv = ll + 1;
} else {
expectedLv = rl + 1;
}
if (expectedLv < t->level) {
t->level = expectedLv;
if (t->right != NULL) {
if (expectedLv < t->right->level) {
t->right->level = expectedLv;
}
}
}
return t;
}
if (t == NULL) {
return t;
}
int ll = level(t->left);
int rl = level(t->right);
int expectedLv;
if (ll < rl) {
expectedLv = ll + 1;
} else {
expectedLv = rl + 1;
}
if (expectedLv < t->level) {
t->level = expectedLv;
if (t->right != NULL) {
if (expectedLv < t->right->level) {
t->right->level = expectedLv;
}
}
}
return t;
}
125デフォルトの名無しさん
2017/10/25(水) 00:53:17.67ID:KYsAJ7k0 tree_t* insertTree(tree_t* t, int v) {
if (t == NULL) {
t = malloc(sizeof(tree_t));
t->value = v;
t->left = NULL;
t->right = NULL;
t->level = 1;
} else if (v > t->value) {
t->right = insertTree(t->right, v);
} else {
t->left = insertTree(t->left, v);
}
t = skew(t);
t = split(t);
return t;
}
肝心の関数まで遠いなほんと
if (t == NULL) {
t = malloc(sizeof(tree_t));
t->value = v;
t->left = NULL;
t->right = NULL;
t->level = 1;
} else if (v > t->value) {
t->right = insertTree(t->right, v);
} else {
t->left = insertTree(t->left, v);
}
t = skew(t);
t = split(t);
return t;
}
肝心の関数まで遠いなほんと
126デフォルトの名無しさん
2017/10/25(水) 00:55:17.25ID:KYsAJ7k0 tree_t* removeTree(tree_t* t, int v) {
if (t == NULL) { return t; }
else if (v == t->value) {
if (t->left == NULL && t->right == NULL) {
free(t);
return NULL;
} else if (t->left == NULL) {
tree_t* e = leftEnd(t->right);
int succ = e->value;
t->right = removeTree(t->right, succ);
t->value = succ;
} else {
tree_t* e = rightEnd(t->left);
int pred = e->value;
t->left = removeTree(t->left, pred);
t->value = pred;
}
} else if (v > t->value) { t->right = removeTree(t->right, v); }
else { t->left = removeTree(t->left, v); }
t = decreaseLevel(t);
t = skew(t);
t->right = skew(t->right);
if (t->right != NULL) {
t->right->right = skew(t->right->right);
}
t = split(t);
t->right = split(t->right);
return t;
}
おしまい。 まじこんなクソコードに何レスもついやしてすまん。
if (t == NULL) { return t; }
else if (v == t->value) {
if (t->left == NULL && t->right == NULL) {
free(t);
return NULL;
} else if (t->left == NULL) {
tree_t* e = leftEnd(t->right);
int succ = e->value;
t->right = removeTree(t->right, succ);
t->value = succ;
} else {
tree_t* e = rightEnd(t->left);
int pred = e->value;
t->left = removeTree(t->left, pred);
t->value = pred;
}
} else if (v > t->value) { t->right = removeTree(t->right, v); }
else { t->left = removeTree(t->left, v); }
t = decreaseLevel(t);
t = skew(t);
t->right = skew(t->right);
if (t->right != NULL) {
t->right->right = skew(t->right->right);
}
t = split(t);
t->right = split(t->right);
return t;
}
おしまい。 まじこんなクソコードに何レスもついやしてすまん。
127デフォルトの名無しさん
2017/10/25(水) 00:56:55.22ID:KYsAJ7k0 改めて書いてみて思ったが、平衡木って平衡保つための操作がポインタのつけかえ多くて
確かにRustにはキツそうだなとか思ったり
データコピーなし縛りで実装するのはRust歴1週間の自分には無理そうだ
確かにRustにはキツそうだなとか思ったり
データコピーなし縛りで実装するのはRust歴1週間の自分には無理そうだ
128デフォルトの名無しさん
2017/10/25(水) 01:27:50.62ID:egHPItlD Rust 的にはそんなに派手に持ち主変えるな、もしくはコピーを使えって感覚なんだろう。
そういうのは上のレイヤーだったら正しいと思うけど、アルゴリズムなコードの場合は
ちと厳しいかもしれん。
付け替えが頻繁に発生する構造の場合は
int parent[]; int right[]; int left[];
みたいな配列実装しろてな記事は見た事なるな。
直感的ではないけど速度は出るし、まあ慣れてる奴からすればどっちも一緒といえば一緒かな。
そういうのは上のレイヤーだったら正しいと思うけど、アルゴリズムなコードの場合は
ちと厳しいかもしれん。
付け替えが頻繁に発生する構造の場合は
int parent[]; int right[]; int left[];
みたいな配列実装しろてな記事は見た事なるな。
直感的ではないけど速度は出るし、まあ慣れてる奴からすればどっちも一緒といえば一緒かな。
129デフォルトの名無しさん
2017/10/25(水) 01:53:05.61ID:KYsAJ7k0 そういう、どうしても生ポインタごそごそつけかえる必要がある基幹アルゴリズムは、unsafeでくるんでやれって感じなのかね
実際この平衡木の実体が複数スレッドから独立に操作されるとか考えると割と困る
実際この平衡木の実体が複数スレッドから独立に操作されるとか考えると割と困る
130デフォルトの名無しさん
2017/10/25(水) 06:54:35.09ID:2hh4Hzpf gitみたいに、古いデータを消去することなく
しかも変更のない部分はいちいちコピーしないアルゴリズムを考えるんだ
そうすれば古い方のデータに別スレッドから安全にアクセスできるよ
しかも変更のない部分はいちいちコピーしないアルゴリズムを考えるんだ
そうすれば古い方のデータに別スレッドから安全にアクセスできるよ
131デフォルトの名無しさん
2017/10/25(水) 10:38:32.59ID:1aquIA8S 結局たかが赤黒木すらRustでは書けないって認識でいいの?
ほんとプログラミング言語名乗るなよ
ほんとプログラミング言語名乗るなよ
132デフォルトの名無しさん
2017/10/25(水) 10:59:08.02ID:2hh4Hzpf133デフォルトの名無しさん
2017/10/25(水) 11:14:21.26ID:j3LwAfcI Rustの問題は後発のくせにIDE連携が弱すぎる。
KotlinとかSwiftとか後発の言語は大概IDEと一緒に提供してるから
最初から補完がきっちり効く。
Goも昔はイマイチだったけど改善してるから許せる。
TypeScriptは言語そのものにIDE連携のための機能をたっぷり盛り込んでいるから
見習ってほしいって話。
初学者程IDE連携が必要だからな。言語仕様が優れてていても
ツールとして使い勝手が良くなきゃ使わんよ。
それにRustの立ち位置って
OS開発とブラウザ開発くらいしかメリットが思い浮かばんのだけども
CLIならGoだし
WebならPHPとかRubyとかGoとか乱立状態だし
WEBのクライアントサイドならTypeScriptだし
スマホならKotlinかSwiftかObjC
このどこにRustが入り込むの?
KotlinとかSwiftとか後発の言語は大概IDEと一緒に提供してるから
最初から補完がきっちり効く。
Goも昔はイマイチだったけど改善してるから許せる。
TypeScriptは言語そのものにIDE連携のための機能をたっぷり盛り込んでいるから
見習ってほしいって話。
初学者程IDE連携が必要だからな。言語仕様が優れてていても
ツールとして使い勝手が良くなきゃ使わんよ。
それにRustの立ち位置って
OS開発とブラウザ開発くらいしかメリットが思い浮かばんのだけども
CLIならGoだし
WebならPHPとかRubyとかGoとか乱立状態だし
WEBのクライアントサイドならTypeScriptだし
スマホならKotlinかSwiftかObjC
このどこにRustが入り込むの?
134デフォルトの名無しさん
2017/10/25(水) 11:47:25.56ID:2hh4Hzpf そもそもC++があまり成功してないから改善するためにRustがある
C/C++と合計して考えるとJavaより上だけど合計しなければC++は成功してないよ
C/C++と合計して考えるとJavaより上だけど合計しなければC++は成功してないよ
135デフォルトの名無しさん
2017/10/25(水) 12:31:23.13ID:L5aebztM C++が成功してないwwwwwwwwwww
どこの平行宇宙ですかwwwwwwwwwwwwwwwww
どこの平行宇宙ですかwwwwwwwwwwwwwwwww
136デフォルトの名無しさん
2017/10/25(水) 13:46:26.44ID:egHPItlD まあ c++ がうまくいってればこんなに言語がたくさんできることはなかっただろうね。
c++ の存在意義は今や高級な機能をどれだけランタイム速度落とさずに入れられるのかの
実験場って位置づけかな。
c++ の存在意義は今や高級な機能をどれだけランタイム速度落とさずに入れられるのかの
実験場って位置づけかな。
137デフォルトの名無しさん
2017/10/25(水) 13:55:53.69ID:L5aebztM C++は完璧な言語だとか口が割けても言えないのは間違いないが、Rustなんて言語ですらない汚物使うくらいならC++使うわなあ
138デフォルトの名無しさん
2017/10/25(水) 15:45:07.57ID:+h/lSeC6 ID:KYsAJ7k0のコードのRust版まだー?
139デフォルトの名無しさん
2017/10/25(水) 16:40:52.54ID:GfXNw50M >>133
rlsあるし十分やん
rlsあるし十分やん
140あ
2017/10/25(水) 18:10:38.69ID:Wj9s3Y5p TSは手段と目的がたまに入れ替わるのが見てるとちょっもモヤモヤするな。
C#が最近もう一度好きになってきた。
C#が最近もう一度好きになってきた。
141デフォルトの名無しさん
2017/10/25(水) 19:10:42.88ID:ajBcpsg9 >>138
まあまあ今ごろコンパイラに怒られてる頃だしもうちょっと待ってやろうぜwwwwww
まあまあ今ごろコンパイラに怒られてる頃だしもうちょっと待ってやろうぜwwwwww
142デフォルトの名無しさん
2017/10/25(水) 20:35:19.01ID:rCcyDoqV rustスレよりもりあがっとるやんここ
143デフォルトの名無しさん
2017/10/25(水) 20:59:03.30ID:EAW9qNH5 cに名前空間とラムダとattribute((cleanup))が入るだけでもだいぶ助かるのに。
なんでcの規格のバージョンアップは遅いんだ?
c++みたく3年毎にしてくれたらいいのに。
なんでcの規格のバージョンアップは遅いんだ?
c++みたく3年毎にしてくれたらいいのに。
144デフォルトの名無しさん
2017/10/25(水) 21:12:25.50ID:7dSKsD7g145デフォルトの名無しさん
2017/10/25(水) 22:58:44.78ID:egHPItlD >>143
C++みたく闇鍋状態にしたくないからだろ。
C++みたく闇鍋状態にしたくないからだろ。
146デフォルトの名無しさん
2017/10/25(水) 23:13:35.98ID:GfXNw50M モジラが2ch見てるわけねーだろ
糖質かよ
糖質かよ
147デフォルトの名無しさん
2017/10/25(水) 23:16:03.33ID:j3LwAfcI rustをそこまで毛嫌いする必要もないと思うけどな
rustのメモリオーナーシップモデルとかコードの改善に貢献するという話もあるし
ちょっと気にはなってる。
rustのメモリオーナーシップモデルとかコードの改善に貢献するという話もあるし
ちょっと気にはなってる。
148デフォルトの名無しさん
2017/10/26(木) 00:20:17.07ID:9syp6YaG rustアンチって同一人物だろ
コンパイル通らなくてイライラしてるんだね^^
コテ付けて、どうぞ
コンパイル通らなくてイライラしてるんだね^^
コテ付けて、どうぞ
149デフォルトの名無しさん
2017/10/26(木) 00:21:04.60ID:T1ShqX6y rustは何がそんなに駄目なんだろ
そこ迄言われると学びたくなってくる
そこ迄言われると学びたくなってくる
150デフォルトの名無しさん
2017/10/26(木) 00:26:09.28ID:9syp6YaG >>149
他の言語にはない所有権システムが原因で学習コストが高い
使いこなせば強力だけどとても難しい機能
それで使いこなせてない人が「コンパイル通らない」って発狂してる
例えると、初めてHaskell言語触る人が「変数に代入出来ないから何も出来ない!Haskellは欠陥言語!」って言ってるような物
他の言語にはない所有権システムが原因で学習コストが高い
使いこなせば強力だけどとても難しい機能
それで使いこなせてない人が「コンパイル通らない」って発狂してる
例えると、初めてHaskell言語触る人が「変数に代入出来ないから何も出来ない!Haskellは欠陥言語!」って言ってるような物
151デフォルトの名無しさん
2017/10/26(木) 00:31:32.93ID:zsf3GtyN rustのコンパイルを通せない低級汚グラマーが
嫉妬で腐してるだけだろ
腐ってるのはテメーの言語センスだろってね
嫉妬で腐してるだけだろ
腐ってるのはテメーの言語センスだろってね
152デフォルトの名無しさん
2017/10/26(木) 00:32:53.75ID:9syp6YaG Haskell言語って何だ
夜は誤字増えるから寝よう
夜は誤字増えるから寝よう
153デフォルトの名無しさん
2017/10/26(木) 00:50:43.34ID:T1ShqX6y154デフォルトの名無しさん
2017/10/26(木) 03:24:21.96ID:EtDTWIur まあ御託はいいからデータコピーなしの平衡二分木をRustで書いてからにしてくれよ
Cのコードは出たぞ
Cのコードは出たぞ
155デフォルトの名無しさん
2017/10/26(木) 05:10:18.37ID:IaYxMsud Haskellなら副作用だらけのコードは断固拒否するだけだが
Rustで副作用を拒否すると延々と粘着されそう
ついでにPythonは静的型を拒否するだけだが
Goはジェネリクスがない件で永久にいじめられるんだろう
Rustで副作用を拒否すると延々と粘着されそう
ついでにPythonは静的型を拒否するだけだが
Goはジェネリクスがない件で永久にいじめられるんだろう
156デフォルトの名無しさん
2017/10/26(木) 07:04:11.52ID:hnEjL22C Haskellは速さは捨てて副作用を無くすことに全振りしてるけど、Rustはそうではないからな
157デフォルトの名無しさん
2017/10/26(木) 09:12:10.17ID:ZXFAdbhr Rustはunsafeつかえば(ffiしたほうがはやいだろうが)できないことはないと思ってるんだが違うのかな?
158デフォルトの名無しさん
2017/10/26(木) 09:59:20.18ID:tFGGFqQC Goはいつものgoogleのフカしで持ち上げられてる感がプンプンするぜ。
単なる昔ながらのVM使ってない静的型付け言語を
システムプログラミングとかいうバズワードを作って
スクリプトしか描いたことない奴らにいかにも新しいものであるかのように錯覚させてる。
単なる昔ながらのVM使ってない静的型付け言語を
システムプログラミングとかいうバズワードを作って
スクリプトしか描いたことない奴らにいかにも新しいものであるかのように錯覚させてる。
159デフォルトの名無しさん
2017/10/26(木) 10:42:13.95ID:1t2EMvpb160デフォルトの名無しさん
2017/10/26(木) 10:47:47.28ID:Y5WhyQQy 最近は新しいOSSもGoで書かれてるの多くてうんざりする
再来年辺りには「Goは終わった」とか言われだしてScalaと同じ道を辿るのわかりきってるのにWeb系の馬鹿共は何度同じ間違いを繰り返すのか
再来年辺りには「Goは終わった」とか言われだしてScalaと同じ道を辿るのわかりきってるのにWeb系の馬鹿共は何度同じ間違いを繰り返すのか
161デフォルトの名無しさん
2017/10/26(木) 11:10:35.34ID:8qIiNs+I 個人的にはDが一番純粋なc++ 後継って感じで頑張って欲しいんだけどなぁ
まったく流行る兆しがない……
別に新しい言語を求めてるんじゃないんだ。c++ からc互換を取り除いて標準ライブラリと文法見直してくれるだけでいいんだ
まったく流行る兆しがない……
別に新しい言語を求めてるんじゃないんだ。c++ からc互換を取り除いて標準ライブラリと文法見直してくれるだけでいいんだ
162デフォルトの名無しさん
2017/10/26(木) 11:45:28.73ID:xVKEuI/f163デフォルトの名無しさん
2017/10/26(木) 11:47:37.13ID:xVKEuI/f164デフォルトの名無しさん
2017/10/26(木) 11:54:33.47ID:Y5WhyQQy165デフォルトの名無しさん
2017/10/26(木) 12:17:09.48ID:xVKEuI/f >>164
Scalaが廃れた理由は、言語のバージョンアップ戦略がクソofクソだったってのと
コンパイル回りの性能が悪いっていう言語自体の特徴、
それから置き換えを狙っていたはずのJavaの進化に取り残されたことっていう色々と複合的な原因がある
Goがその後追いをするかって言われると、
少なくとも書きやすさの面でC++がGoに勝てる目は向こう5年はないだろうし、
バージョン戦略は少なくとも1系の間は下位互換性崩さんだろうしな
Scalaが廃れた理由は、言語のバージョンアップ戦略がクソofクソだったってのと
コンパイル回りの性能が悪いっていう言語自体の特徴、
それから置き換えを狙っていたはずのJavaの進化に取り残されたことっていう色々と複合的な原因がある
Goがその後追いをするかって言われると、
少なくとも書きやすさの面でC++がGoに勝てる目は向こう5年はないだろうし、
バージョン戦略は少なくとも1系の間は下位互換性崩さんだろうしな
166デフォルトの名無しさん
2017/10/26(木) 12:19:58.53ID:xVKEuI/f 不安があるとするなら、なんか1系と完全に互換性なくすとか言われてるGo2.0なんだよな
この辺の方針次第では、おっしゃる通り再来年にはゴミの山になってる可能性が無視できない
Swiftがクソバージョンアップでもなんとか成功してるのはプラットフォーム囲い込んでるのがでかい
この辺の方針次第では、おっしゃる通り再来年にはゴミの山になってる可能性が無視できない
Swiftがクソバージョンアップでもなんとか成功してるのはプラットフォーム囲い込んでるのがでかい
167デフォルトの名無しさん
2017/10/26(木) 12:27:59.75ID:P+s05bng AA木のRust版の移植を練習がてらやったぞ。
みんなunsafeが必要とか言ってるが、別に必要なくない?
ポインタ演算もサイズの違う型の変換もしてるわけじゃないから生ポインタ扱う必要ないと思うんだけど。
だた、マジで愚直に移植したから全くRustっぽくはないし、
俺がバカなだけで無駄なオーバーヘッドが気づかんうちにいっぱい発生してるかもだから指摘よろしく。
一応何回か適当にinsertとremoveして正しく動いてるとこまでは確認してる。
みんなunsafe使わないとダメ的なこと言ってるから正直これでいいのか全然自信がない。
みんなunsafeが必要とか言ってるが、別に必要なくない?
ポインタ演算もサイズの違う型の変換もしてるわけじゃないから生ポインタ扱う必要ないと思うんだけど。
だた、マジで愚直に移植したから全くRustっぽくはないし、
俺がバカなだけで無駄なオーバーヘッドが気づかんうちにいっぱい発生してるかもだから指摘よろしく。
一応何回か適当にinsertとremoveして正しく動いてるとこまでは確認してる。
みんなunsafe使わないとダメ的なこと言ってるから正直これでいいのか全然自信がない。
168デフォルトの名無しさん
2017/10/26(木) 12:28:38.79ID:P+s05bng #[derive(Debug)]
struct Tree {
value: i32,
left: Option<Box<Tree>>,
right: Option<Box<Tree>>,
level: isize,
}
fn level(root: &Option<Box<Tree>>) -> isize {
if root.is_none() {
return 0;
}
root.as_ref().unwrap().level
}
fn left_end(root: &Option<Box<Tree>>) -> &Option<Box<Tree>> {
if root.is_none() {
root
} else if root.as_ref().unwrap().left.is_none() {
root
} else {
left_end(&root.as_ref().unwrap().left)
}
}
(続く)
struct Tree {
value: i32,
left: Option<Box<Tree>>,
right: Option<Box<Tree>>,
level: isize,
}
fn level(root: &Option<Box<Tree>>) -> isize {
if root.is_none() {
return 0;
}
root.as_ref().unwrap().level
}
fn left_end(root: &Option<Box<Tree>>) -> &Option<Box<Tree>> {
if root.is_none() {
root
} else if root.as_ref().unwrap().left.is_none() {
root
} else {
left_end(&root.as_ref().unwrap().left)
}
}
(続く)
169デフォルトの名無しさん
2017/10/26(木) 12:29:34.82ID:P+s05bng fn right_end(root: &Option<Box<Tree>>) -> &Option<Box<Tree>> {
if root.is_none() {
root
} else if root.as_ref().unwrap().right.is_none() {
root
} else {
right_end(&root.as_ref().unwrap().right)
}
}
fn skew(mut root: Option<Box<Tree>>) -> Option<Box<Tree>> {
if root.is_none() {
return root;
} else if root.as_ref().unwrap().left.is_none() {
return root;
} else if root.as_ref().unwrap().left.as_ref().unwrap().level != root.as_ref().unwrap().level {
return root;
}
let mut left = root.as_mut().unwrap().left.take();
root.as_mut().unwrap().left = left.as_mut().unwrap().right.take();
left.as_mut().unwrap().right = root;
left
}
(まだ続く)
if root.is_none() {
root
} else if root.as_ref().unwrap().right.is_none() {
root
} else {
right_end(&root.as_ref().unwrap().right)
}
}
fn skew(mut root: Option<Box<Tree>>) -> Option<Box<Tree>> {
if root.is_none() {
return root;
} else if root.as_ref().unwrap().left.is_none() {
return root;
} else if root.as_ref().unwrap().left.as_ref().unwrap().level != root.as_ref().unwrap().level {
return root;
}
let mut left = root.as_mut().unwrap().left.take();
root.as_mut().unwrap().left = left.as_mut().unwrap().right.take();
left.as_mut().unwrap().right = root;
left
}
(まだ続く)
170デフォルトの名無しさん
2017/10/26(木) 12:30:37.02ID:P+s05bng fn split(mut root: Option<Box<Tree>>) -> Option<Box<Tree>> {
if root.is_none() {
return root;
} else if root.as_ref().unwrap().right.is_none() {
return root;
} else if root.as_ref().unwrap().right.as_ref().unwrap().right.is_none() {
return root;
} else if root.as_ref().unwrap().right.as_ref().unwrap().right.as_ref().unwrap().level != root.as_ref().unwrap().level {
return root;
}
let mut right = root.as_mut().unwrap().right.take();
root.as_mut().unwrap().right = right.as_mut().unwrap().left.take();
right.as_mut().unwrap().left = root;
right.as_mut().unwrap().level += 1;
right
}
if root.is_none() {
return root;
} else if root.as_ref().unwrap().right.is_none() {
return root;
} else if root.as_ref().unwrap().right.as_ref().unwrap().right.is_none() {
return root;
} else if root.as_ref().unwrap().right.as_ref().unwrap().right.as_ref().unwrap().level != root.as_ref().unwrap().level {
return root;
}
let mut right = root.as_mut().unwrap().right.take();
root.as_mut().unwrap().right = right.as_mut().unwrap().left.take();
right.as_mut().unwrap().left = root;
right.as_mut().unwrap().level += 1;
right
}
171デフォルトの名無しさん
2017/10/26(木) 12:31:04.94ID:P+s05bng fn decrease_level(mut root: Option<Box<Tree>>) -> Option<Box<Tree>> {
if root.is_none() {
return root;
}
let left_level = level(&root.as_ref().unwrap().left);
let right_level = level(&root.as_ref().unwrap().right);
let mut expected_level = 0;
if left_level < right_level {
expected_level = left_level + 1
} else {
expected_level = right_level + 1
}
if expected_level < root.as_ref().unwrap().level {
root.as_mut().unwrap().level = expected_level;
if root.as_ref().unwrap().right.is_some() {
if expected_level < root.as_ref().unwrap().right.as_ref().unwrap().level {
root.as_mut().unwrap().right.as_mut().unwrap().level = expected_level;
}
}
}
root
}
if root.is_none() {
return root;
}
let left_level = level(&root.as_ref().unwrap().left);
let right_level = level(&root.as_ref().unwrap().right);
let mut expected_level = 0;
if left_level < right_level {
expected_level = left_level + 1
} else {
expected_level = right_level + 1
}
if expected_level < root.as_ref().unwrap().level {
root.as_mut().unwrap().level = expected_level;
if root.as_ref().unwrap().right.is_some() {
if expected_level < root.as_ref().unwrap().right.as_ref().unwrap().level {
root.as_mut().unwrap().right.as_mut().unwrap().level = expected_level;
}
}
}
root
}
172デフォルトの名無しさん
2017/10/26(木) 12:31:51.05ID:P+s05bng fn insert_tree(mut root: Option<Box<Tree>>, value: i32) -> Option<Box<Tree>> {
if root.is_none() {
root = Some(Box::new(Tree {
value: value,
left: None,
right: None,
level: 1, }));
} else if value > root.as_ref().unwrap().value {
root.as_mut().unwrap().right = insert_tree(root.as_mut().unwrap().right.take(), value);
} else {
root.as_mut().unwrap().left = insert_tree(root.as_mut().unwrap().left.take(), value);
}
root = skew(root);
root = split(root);
root
}
if root.is_none() {
root = Some(Box::new(Tree {
value: value,
left: None,
right: None,
level: 1, }));
} else if value > root.as_ref().unwrap().value {
root.as_mut().unwrap().right = insert_tree(root.as_mut().unwrap().right.take(), value);
} else {
root.as_mut().unwrap().left = insert_tree(root.as_mut().unwrap().left.take(), value);
}
root = skew(root);
root = split(root);
root
}
173デフォルトの名無しさん
2017/10/26(木) 12:34:16.58ID:P+s05bng fn remove_tree(mut root: Option<Box<Tree>>, value: i32) -> Option<Box<Tree>> {
if root.is_none() { return root; }
else if value == root.as_ref().unwrap().value {
if root.as_ref().unwrap().left.is_none() && root.as_ref().unwrap().right.is_none() {
return None;
} else if root.as_ref().unwrap().left.is_none() {
let succ = {
let end = left_end(&root.as_ref().unwrap().right);
end.as_ref().unwrap().value
};
root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value);
root.as_mut().unwrap().value = succ;
} else {
let pred = {
let end = right_end(&root.as_ref().unwrap().left);
end.as_ref().unwrap().value
};
root.as_mut().unwrap().left = remove_tree(root.as_mut().unwrap().left.take(), value);
root.as_mut().unwrap().value = pred;
}
} else if value > root.as_ref().unwrap().value { root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value); }
else { root.as_mut().unwrap().left = remove_tree(root.as_mut().unwrap().left.take(), value); }
関数途中です(1レスに収まらんかった)
if root.is_none() { return root; }
else if value == root.as_ref().unwrap().value {
if root.as_ref().unwrap().left.is_none() && root.as_ref().unwrap().right.is_none() {
return None;
} else if root.as_ref().unwrap().left.is_none() {
let succ = {
let end = left_end(&root.as_ref().unwrap().right);
end.as_ref().unwrap().value
};
root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value);
root.as_mut().unwrap().value = succ;
} else {
let pred = {
let end = right_end(&root.as_ref().unwrap().left);
end.as_ref().unwrap().value
};
root.as_mut().unwrap().left = remove_tree(root.as_mut().unwrap().left.take(), value);
root.as_mut().unwrap().value = pred;
}
} else if value > root.as_ref().unwrap().value { root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value); }
else { root.as_mut().unwrap().left = remove_tree(root.as_mut().unwrap().left.take(), value); }
関数途中です(1レスに収まらんかった)
174デフォルトの名無しさん
2017/10/26(木) 12:37:30.92ID:P+s05bng root = decrease_level(root.take());
root = skew(root.take());
root.as_mut().unwrap().right = skew(root.as_mut().unwrap().right.take());
if root.as_ref().unwrap().right.is_some() {
root.as_mut().unwrap().right.as_mut().unwrap().right = skew(root.as_mut().unwrap().right.as_mut().unwrap().right.take());
}
root = split(root.take());
root.as_mut().unwrap().right = split(root.as_mut().unwrap().right.take());
root
}
終わり。
クソコードの上に長くてほんとすんません。
あと、おもてのコードでは一度もunsafeは使ってはないけど
Option型のtakeメソッドが所有権を誤魔化すために裏でunsafe使ってる。
あとは、裏でも使ってないと思う。
root = skew(root.take());
root.as_mut().unwrap().right = skew(root.as_mut().unwrap().right.take());
if root.as_ref().unwrap().right.is_some() {
root.as_mut().unwrap().right.as_mut().unwrap().right = skew(root.as_mut().unwrap().right.as_mut().unwrap().right.take());
}
root = split(root.take());
root.as_mut().unwrap().right = split(root.as_mut().unwrap().right.take());
root
}
終わり。
クソコードの上に長くてほんとすんません。
あと、おもてのコードでは一度もunsafeは使ってはないけど
Option型のtakeメソッドが所有権を誤魔化すために裏でunsafe使ってる。
あとは、裏でも使ってないと思う。
175デフォルトの名無しさん
2017/10/26(木) 12:39:25.88ID:xVKEuI/f Rustトーシロの初見だけどこんなにunwrap必要なの怖いって気分になるな……
CのポインタをOption<Box<>>で表現してるからしゃーないとはいえ
CのポインタをOption<Box<>>で表現してるからしゃーないとはいえ
176デフォルトの名無しさん
2017/10/26(木) 12:39:26.85ID:P+s05bng ここまでやったらもう飽きた。
誰かメソッド構文とかコンビネータとかをきちんと使ったRustyなコードに書き換えて。
誰かメソッド構文とかコンビネータとかをきちんと使ったRustyなコードに書き換えて。
177あ
2017/10/26(木) 12:42:49.23ID:+cEqlMCT Rust嫌いな奴はCをすぐ引き合いに出すが、misraの案件やったら死ぬんじゃねえかなって思う。
GC言語も悪くはないぞ。ちゃんとGCの動き考えれば、正しく開放「されてない」理由もわかるだろ。
最初からデカイ配列を握って離さない、それを切り貼りして使う、みたいなJavaのプロジェクトあるしな。
GC言語も悪くはないぞ。ちゃんとGCの動き考えれば、正しく開放「されてない」理由もわかるだろ。
最初からデカイ配列を握って離さない、それを切り貼りして使う、みたいなJavaのプロジェクトあるしな。
178デフォルトの名無しさん
2017/10/26(木) 12:50:10.86ID:P+s05bng179デフォルトの名無しさん
2017/10/26(木) 16:47:19.95ID:hnEjL22C rustのコード<>だらけで読みにくい
これはlispの括弧みたいに慣れたら読みやすいものなのか?
これはlispの括弧みたいに慣れたら読みやすいものなのか?
180デフォルトの名無しさん
2017/10/26(木) 17:58:11.26ID:9syp6YaG >>153
難しいとは言ってもOOP→関数型のパラダイムシフトに比べれば簡単だけどね
難しいとは言ってもOOP→関数型のパラダイムシフトに比べれば簡単だけどね
181デフォルトの名無しさん
2017/10/26(木) 20:01:45.08ID:mFTohykf >>154
おい、お前でてこいよ
おい、お前でてこいよ
182デフォルトの名無しさん
2017/10/26(木) 21:09:45.15ID:LcYnzbeR rust も haskell も理解できても面倒だし無駄に言語に気使ってるだけじゃねーかって
思うんだが、信者はききやしない。。
「お前らは理解できないものを理解できる俺偉い」で思考停止しちゃってんだよ。
思うんだが、信者はききやしない。。
「お前らは理解できないものを理解できる俺偉い」で思考停止しちゃってんだよ。
183デフォルトの名無しさん
2017/10/26(木) 21:15:34.16ID:hnEjL22C 一番言語に気を遣わないといけないのはC++だがなw
184デフォルトの名無しさん
2017/10/26(木) 21:19:35.59ID:+/fzZ2Vi 型っていうシステムが
そもそも良くないっていうのは無いの?
そもそも良くないっていうのは無いの?
185デフォルトの名無しさん
2017/10/26(木) 21:46:13.96ID:OTLFFL6d186デフォルトの名無しさん
2017/10/26(木) 21:54:28.12ID:PekP06rX187デフォルトの名無しさん
2017/10/26(木) 21:55:02.68ID:mFTohykf >>185
てめえがしね
てめえがしね
188デフォルトの名無しさん
2017/10/26(木) 22:34:09.13ID:P+s05bng >>182
「俺偉い」はさすがにないわ。笑かすな。
Rustに移植してみての感想だけど、確かにコンパイルを通すのには苦労したけど、
通ってしまえばメモリーリークはないって安心感がある。これが重要。
特に今回はunsafe一度も使ってないからなおさら安心できる。
Cのほうのコード一通り眺めてメモリーリーク無いって確信できる?
それができる超人君なら確かにRustは全く必要ないが。
Rustは君の嫌う面倒さと引き換えに安心を得ることができる言語。
むしろCで書いたコードにメモリーリークがあるのかないのか
自分の書いたコードに自信が持てないやつのためにこそRustがあると思ってる。
面倒だけが理由で思考停止しているのはどっちだ。
>>185
確かにこのコードは汚いよな。そこは自覚してる。
マジで誰かRust風に書き換えてくれない?
動いたところまで確認したところで集中が切れてしまってもうやる気が出ない。
Rustはオブジェクト指向も関数型のパラダイムを両方とも持っているし、
きちんと書けばかなり綺麗で整ったコードに書き直せるはずなんだよ。
あと、Rustアンチに1つ聞きたいことがある。
Rustが嫌いってことはわかったけど、じゃあアンチ君の好きな(愛用してる)言語は何なの?
その言語のメリット・デメリット含めて詳しく解説してくんない?
「俺偉い」はさすがにないわ。笑かすな。
Rustに移植してみての感想だけど、確かにコンパイルを通すのには苦労したけど、
通ってしまえばメモリーリークはないって安心感がある。これが重要。
特に今回はunsafe一度も使ってないからなおさら安心できる。
Cのほうのコード一通り眺めてメモリーリーク無いって確信できる?
それができる超人君なら確かにRustは全く必要ないが。
Rustは君の嫌う面倒さと引き換えに安心を得ることができる言語。
むしろCで書いたコードにメモリーリークがあるのかないのか
自分の書いたコードに自信が持てないやつのためにこそRustがあると思ってる。
面倒だけが理由で思考停止しているのはどっちだ。
>>185
確かにこのコードは汚いよな。そこは自覚してる。
マジで誰かRust風に書き換えてくれない?
動いたところまで確認したところで集中が切れてしまってもうやる気が出ない。
Rustはオブジェクト指向も関数型のパラダイムを両方とも持っているし、
きちんと書けばかなり綺麗で整ったコードに書き直せるはずなんだよ。
あと、Rustアンチに1つ聞きたいことがある。
Rustが嫌いってことはわかったけど、じゃあアンチ君の好きな(愛用してる)言語は何なの?
その言語のメリット・デメリット含めて詳しく解説してくんない?
189デフォルトの名無しさん
2017/10/26(木) 23:26:00.76ID:LcYnzbeR はっきり言わせてもらうけれど、
この規模のコードで書くのにそれだけ苦労する価値があると思えんが。
メモリリークについてもこの規模なら一通り見て、あるかないかくらい判断できるよ。
まあ主観といえば主観だけれど
本当に本心からこの程度のコードについてメモリリークを心配しちゃってるの?
言語を持ち上げるために無理に納得しようとしてない?
この規模のコードで書くのにそれだけ苦労する価値があると思えんが。
メモリリークについてもこの規模なら一通り見て、あるかないかくらい判断できるよ。
まあ主観といえば主観だけれど
本当に本心からこの程度のコードについてメモリリークを心配しちゃってるの?
言語を持ち上げるために無理に納得しようとしてない?
190デフォルトの名無しさん
2017/10/26(木) 23:35:06.69ID:9syp6YaG そりゃこの程度の規模じゃRust使うメリット皆無だよ
で、実際のプロジェクトがこの程度の規模なの?
で、実際のプロジェクトがこの程度の規模なの?
191デフォルトの名無しさん
2017/10/26(木) 23:35:07.35ID:51LPFkSD なんでこの規模に限定した話をされているの?
192デフォルトの名無しさん
2017/10/26(木) 23:37:41.83ID:9syp6YaG193デフォルトの名無しさん
2017/10/26(木) 23:40:05.21ID:JSzFTz38 ブラウザの性能が圧倒的にchromeより上になったらrustの優位性が証明されるけど。
それをまとうかな。
それをまとうかな。
194デフォルトの名無しさん
2017/10/27(金) 00:07:16.82ID:xwp9Pca0 性能の差で優位性を証明したことなんて今まであったっけ
オブジェクト指向も関数型もiPhoneもみんな性能と関係ない価値観だったような
オブジェクト指向も関数型もiPhoneもみんな性能と関係ない価値観だったような
195デフォルトの名無しさん
2017/10/27(金) 00:42:45.70ID:5+s2yfDd196デフォルトの名無しさん
2017/10/27(金) 00:47:50.32ID:/3yfU/y8 見苦しくなってきたな
197デフォルトの名無しさん
2017/10/27(金) 03:40:11.56ID:LQlgBzJd 流石に自演かすぎる…
198デフォルトの名無しさん
2017/10/27(金) 06:31:17.46ID:2A0a9mBA199デフォルトの名無しさん
2017/10/27(金) 06:34:38.22ID:2A0a9mBA200デフォルトの名無しさん
2017/10/27(金) 09:50:28.38ID:T+eCoUsJ201デフォルトの名無しさん
2017/10/27(金) 10:02:50.33ID:LQlgBzJd Rustが面倒そうなのは伝わったが
C側の奴がコピペ野郎のくせに暴れてるクズすぎてなんとも
C側の奴がコピペ野郎のくせに暴れてるクズすぎてなんとも
202デフォルトの名無しさん
2017/10/27(金) 10:35:02.10ID:aniL1VIL203デフォルトの名無しさん
2017/10/27(金) 11:13:40.46ID:T+eCoUsJ というかさ、Rustのコードバグってるんだけどwwwww
バwグwっwてwるwんwだwけwどwwwww
remove_treeで要素Removeできてないwwwww
Rustはコンパイル通れば安心できる(ドヤァ)とかいってバwグwっwてwるwwwww
バwグwっwてwるwんwだwけwどwwwww
remove_treeで要素Removeできてないwwwww
Rustはコンパイル通れば安心できる(ドヤァ)とかいってバwグwっwてwるwwwww
204デフォルトの名無しさん
2017/10/27(金) 11:26:28.21ID:T+eCoUsJ ここにRustは、安全性を高めると言いつつまともにアルゴリズムを書こうとすると制約回避のためにとてつもなく汚いコードになり、
バグもCより出やすくなることが公になりましたとさ
ちゃんちゃん
バグもCより出やすくなることが公になりましたとさ
ちゃんちゃん
205デフォルトの名無しさん
2017/10/27(金) 11:40:28.33ID:AXKOuk3Y >>198
言語に気を遣わないとすぐ自分の足元を撃ち抜く言語であるということに同意しないということ?
具体例っていざ言われると困るなあ。ふと思い出した阿呆な失敗談を一つ挙げると、クラスの値型配列を作れちゃうところとか、クラスは絶対ポインタで持たないといけないDとは対照的に感じたな
常識的に考えたらクラスの値型配列なんてやったらダメなのはわかるんだけど、なぜかやってしまって、コンパイル通ってんのに思ってたのと違う挙動して困ったわ。こういう常識的に考えたらわかるけど、考えないといけない部分があるから言語に気を遣わないとやっていけん。
これは全然大したことない例だけど、なんか他にもあったような気もするし思い出したら書き込むわ
言語に気を遣わないとすぐ自分の足元を撃ち抜く言語であるということに同意しないということ?
具体例っていざ言われると困るなあ。ふと思い出した阿呆な失敗談を一つ挙げると、クラスの値型配列を作れちゃうところとか、クラスは絶対ポインタで持たないといけないDとは対照的に感じたな
常識的に考えたらクラスの値型配列なんてやったらダメなのはわかるんだけど、なぜかやってしまって、コンパイル通ってんのに思ってたのと違う挙動して困ったわ。こういう常識的に考えたらわかるけど、考えないといけない部分があるから言語に気を遣わないとやっていけん。
これは全然大したことない例だけど、なんか他にもあったような気もするし思い出したら書き込むわ
206デフォルトの名無しさん
2017/10/27(金) 12:04:57.19ID:aniL1VIL 代入がなければ値型でもポインタでも同じ挙動だ
だから、代入しようとしたらコンパイルが通らない言語が現れた
だから、代入しようとしたらコンパイルが通らない言語が現れた
207デフォルトの名無しさん
2017/10/27(金) 12:27:06.09ID:Luz9kSs/ haskell追い出したら次はrustですか?
208デフォルトの名無しさん
2017/10/27(金) 12:49:17.54ID:aniL1VIL 追い出す権利はないね
あると思ってるやつは権利に甘えすぎ
あると思ってるやつは権利に甘えすぎ
209デフォルトの名無しさん
2017/10/27(金) 12:53:49.35ID:BmYygdVN https://cpplover.blogspot.jp/2017/10/range-based-for.html
まあこう言う馬鹿がいなくなるまでは
実際のコードについて議論したほうがいいとは思うよ。
別にrustとかhaskellが悪いとは思わんけれど、コードなんて実際に現場で機能するかどうかが
一番重要なわけだから。原理に走ると都合の悪いことを無視し始めるのは気に入らん。
まあこう言う馬鹿がいなくなるまでは
実際のコードについて議論したほうがいいとは思うよ。
別にrustとかhaskellが悪いとは思わんけれど、コードなんて実際に現場で機能するかどうかが
一番重要なわけだから。原理に走ると都合の悪いことを無視し始めるのは気に入らん。
210デフォルトの名無しさん
2017/10/27(金) 13:27:23.45ID:OeXtCDV4 >>203
すまぬ。すまぬ。完全なうっかりミスだったわ。
訂正した。
fn remove_tree(mut root: Option<Box<Tree>>, value: i32) -> Option<Box<Tree>> {
if root.is_none() { return root; }
else if value == root.as_ref().unwrap().value {
if root.as_ref().unwrap().left.is_none() && root.as_ref().unwrap().right.is_none() {
return None;
} else if root.as_ref().unwrap().left.is_none() {
let succ = {
let end = left_end(&root.as_ref().unwrap().right);
end.as_ref().unwrap().value
};
>> 訂正前 root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value);
>> 訂正後 root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), succ);
root.as_mut().unwrap().value = succ;
} else {
let pred = {
let end = right_end(&root.as_ref().unwrap().left);
end.as_ref().unwrap().value
};
>> 訂正前 root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value);
>> 訂正後 root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), pred);
root.as_mut().unwrap().value = pred;
}
} else if value > root.as_ref().unwrap().value { root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value); }
else { root.as_mut().unwrap().left = remove_tree(root.as_mut().unwrap().left.take(), value); }
...
すまぬ。すまぬ。完全なうっかりミスだったわ。
訂正した。
fn remove_tree(mut root: Option<Box<Tree>>, value: i32) -> Option<Box<Tree>> {
if root.is_none() { return root; }
else if value == root.as_ref().unwrap().value {
if root.as_ref().unwrap().left.is_none() && root.as_ref().unwrap().right.is_none() {
return None;
} else if root.as_ref().unwrap().left.is_none() {
let succ = {
let end = left_end(&root.as_ref().unwrap().right);
end.as_ref().unwrap().value
};
>> 訂正前 root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value);
>> 訂正後 root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), succ);
root.as_mut().unwrap().value = succ;
} else {
let pred = {
let end = right_end(&root.as_ref().unwrap().left);
end.as_ref().unwrap().value
};
>> 訂正前 root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value);
>> 訂正後 root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), pred);
root.as_mut().unwrap().value = pred;
}
} else if value > root.as_ref().unwrap().value { root.as_mut().unwrap().right = remove_tree(root.as_mut().unwrap().right.take(), value); }
else { root.as_mut().unwrap().left = remove_tree(root.as_mut().unwrap().left.take(), value); }
...
211デフォルトの名無しさん
2017/10/27(金) 14:02:45.56ID:OeXtCDV4 >>204
何度も言ってるがこのコードが汚いのは制約回避のためじゃなくて、Cのコードを愚直に移植してるからだぞ。
CのNULLを表現するためにOption型を使用してるから、コンビネータとかを
きちんと使わない限りはunwrapだらけになってコードが汚くなる。
Rustのコードが汚いんじゃなくてRustyに書いてないから汚いだけ。
同じことを何度も言わせないでくれ。
確かに、Rustはコンパイル通すために苦労するから、
執行錯誤してるうちにうっかりミスしやすくなるという考えはあるのかもな。
まあ、この程度のミスを犯す俺が単純にバカすぐるのか、これもRustの課題のひとつだと考えるかは
人によって意見が分かれてくるところじゃないか?みんなどう思う?
何度も言ってるがこのコードが汚いのは制約回避のためじゃなくて、Cのコードを愚直に移植してるからだぞ。
CのNULLを表現するためにOption型を使用してるから、コンビネータとかを
きちんと使わない限りはunwrapだらけになってコードが汚くなる。
Rustのコードが汚いんじゃなくてRustyに書いてないから汚いだけ。
同じことを何度も言わせないでくれ。
確かに、Rustはコンパイル通すために苦労するから、
執行錯誤してるうちにうっかりミスしやすくなるという考えはあるのかもな。
まあ、この程度のミスを犯す俺が単純にバカすぐるのか、これもRustの課題のひとつだと考えるかは
人によって意見が分かれてくるところじゃないか?みんなどう思う?
212デフォルトの名無しさん
2017/10/27(金) 15:02:03.76ID:aniL1VIL カネもないし時間のゆとりもないからコードが汚くなった
言語よりもカネと時間の使い方が間違っている
言語よりもカネと時間の使い方が間違っている
213デフォルトの名無しさん
2017/10/27(金) 17:07:21.98ID:2A0a9mBA >>205
クラスの値型配列はごく基本的で有用なデータ構造なんだけど…
クラスの値型配列はごく基本的で有用なデータ構造なんだけど…
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 自民・麻生太郎 副総裁 石破政権の1年は「どよーん」 高市政権の発足で「何となく明るくなった」「世の中のことが決まり動いている」 [Hitzeschleier★]
- 東京都「都民の税金1.5兆円が国に奪われている」「全国に分配されている」に地方民ブチギレ [Hitzeschleier★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 【27歳会社員】「自慰行為に使うために」コインランドリーの乾燥機から24歳女性の下着など計11点(時価8万2080円相当)盗んだ疑い [nita★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★3
- ジャップ「カントの純粋理性批判読むお!!!」⇒全員上巻で挫折 俺恥ずかしいよ…😭 [731544683]
- トランプ、G7に代わるcore 5を発表 [805596214]
- 麻生太郎が石破政権の1年を酷評「どよーんとして何も動かない感じだったな。それに引き換え高市政権は物事が動いている」 [597533159]
- 【速報】室井佑月、米山隆一との離婚を決意wwwwwwwwwwwwwwwwwwww [802034645]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★4
