次世代言語Part7[Go Rust Swift Kotlin TypeScript]

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2017/10/19(木) 17:51:38.66ID:EPSDvC75
文字数制限きついので改題
スレタイ以外の言語もok

前スレ
次世代言語議論スレ[Rust Kotlin Haskell]第6世代
http://mevius.5ch.net/test/read.cgi/tech/1503924817/
2017/10/24(火) 16:23:54.68ID:rmRTTRfd
>>112
単純にPlaygroundの質からして違うってだけの話だろ
その程度もみとめられないよかよ
115デフォルトの名無しさん
垢版 |
2017/10/24(火) 18:42:18.67ID:bbIPnu9e
なぜrustの対抗馬にTypeScriptが挙がるのかまるで理解できない
用途が全然違うだろ……
2017/10/24(火) 19:07:54.15ID:x0LH18ak
WebAssemblyが期待されてるから、あながち間違いでもない
2017/10/24(火) 21:40:46.56ID:eZrIsy4p
>>113
ほんとMSってそういう所は笑えるくらいすごいよな
Rust開発者たちも見習ってほしい

一応rustもコード補完にrlsとかいうヤツあるけどなんかまだいまいちなんだよな。
vscodeにrust(rls)っていうエクテンション入れて使ってるんだけど、
クロージャ書いてるときは補完が効かないのは俺だけ?
あとlint?(エラー・警告を赤・緑の下線で表示してくれるやつ)が
時々なんの前触れもなく急に無反応になるんだけどそれも俺だけ?
2017/10/24(火) 22:14:01.00ID:FaGN7Q1b
少人数のMS社員が片手間でVSCode作ってみたら一瞬で天下獲れちゃいましたというチート集団
MSがRust推せば余裕でGo潰してベターC++の定番を奪えるだろうな
2017/10/24(火) 22:51:21.66ID:z3aqO0G+
片手間ってことはないし、エディタ作成なんてのは人数増やせばいいものでもない。
まあチート軍団ってのは確かだけど。
しかし Rust とか c++ みたいに教条主義的な言語ってやっぱ信者が湧くね。
わかりやすくていいとは思うけど。
2017/10/24(火) 23:14:23.65ID:MOiTAdLh
片手間とか余裕とか、良い子は絶対に真似してはいけない情報ばっかり教えるんだよな
そんなところに信者を集めたら怠け者の集団ができそうだ
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);
}
}
(続く)
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;
}
(まだ続く)
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;
}
(続く)
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;
}
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;
}
肝心の関数まで遠いなほんと
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;
}
おしまい。 まじこんなクソコードに何レスもついやしてすまん。
2017/10/25(水) 00:56:55.22ID:KYsAJ7k0
改めて書いてみて思ったが、平衡木って平衡保つための操作がポインタのつけかえ多くて
確かにRustにはキツそうだなとか思ったり

データコピーなし縛りで実装するのはRust歴1週間の自分には無理そうだ
2017/10/25(水) 01:27:50.62ID:egHPItlD
Rust 的にはそんなに派手に持ち主変えるな、もしくはコピーを使えって感覚なんだろう。
そういうのは上のレイヤーだったら正しいと思うけど、アルゴリズムなコードの場合は
ちと厳しいかもしれん。
付け替えが頻繁に発生する構造の場合は
int parent[]; int right[]; int left[];
みたいな配列実装しろてな記事は見た事なるな。
直感的ではないけど速度は出るし、まあ慣れてる奴からすればどっちも一緒といえば一緒かな。
2017/10/25(水) 01:53:05.61ID:KYsAJ7k0
そういう、どうしても生ポインタごそごそつけかえる必要がある基幹アルゴリズムは、unsafeでくるんでやれって感じなのかね
実際この平衡木の実体が複数スレッドから独立に操作されるとか考えると割と困る
2017/10/25(水) 06:54:35.09ID:2hh4Hzpf
gitみたいに、古いデータを消去することなく
しかも変更のない部分はいちいちコピーしないアルゴリズムを考えるんだ
そうすれば古い方のデータに別スレッドから安全にアクセスできるよ
2017/10/25(水) 10:38:32.59ID:1aquIA8S
結局たかが赤黒木すらRustでは書けないって認識でいいの?
ほんとプログラミング言語名乗るなよ
2017/10/25(水) 10:59:08.02ID:2hh4Hzpf
>>131
その認識は間違いだけど正解を無料で教えてくれるボランティアが足りないね
GNUみたいなボランティアがいっぱいいないとプログラミング言語を名乗れないのが現実
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が入り込むの?
2017/10/25(水) 11:47:25.56ID:2hh4Hzpf
そもそもC++があまり成功してないから改善するためにRustがある
C/C++と合計して考えるとJavaより上だけど合計しなければC++は成功してないよ
2017/10/25(水) 12:31:23.13ID:L5aebztM
C++が成功してないwwwwwwwwwww
どこの平行宇宙ですかwwwwwwwwwwwwwwwww
2017/10/25(水) 13:46:26.44ID:egHPItlD
まあ c++ がうまくいってればこんなに言語がたくさんできることはなかっただろうね。
c++ の存在意義は今や高級な機能をどれだけランタイム速度落とさずに入れられるのかの
実験場って位置づけかな。
2017/10/25(水) 13:55:53.69ID:L5aebztM
C++は完璧な言語だとか口が割けても言えないのは間違いないが、Rustなんて言語ですらない汚物使うくらいならC++使うわなあ
2017/10/25(水) 15:45:07.57ID:+h/lSeC6
ID:KYsAJ7k0のコードのRust版まだー?
2017/10/25(水) 16:40:52.54ID:GfXNw50M
>>133
rlsあるし十分やん
140
垢版 |
2017/10/25(水) 18:10:38.69ID:Wj9s3Y5p
TSは手段と目的がたまに入れ替わるのが見てるとちょっもモヤモヤするな。
C#が最近もう一度好きになってきた。
2017/10/25(水) 19:10:42.88ID:ajBcpsg9
>>138
まあまあ今ごろコンパイラに怒られてる頃だしもうちょっと待ってやろうぜwwwwww
2017/10/25(水) 20:35:19.01ID:rCcyDoqV
rustスレよりもりあがっとるやんここ
143デフォルトの名無しさん
垢版 |
2017/10/25(水) 20:59:03.30ID:EAW9qNH5
cに名前空間とラムダとattribute((cleanup))が入るだけでもだいぶ助かるのに。
なんでcの規格のバージョンアップは遅いんだ?
c++みたく3年毎にしてくれたらいいのに。
2017/10/25(水) 21:12:25.50ID:7dSKsD7g
>>142
あそこモジラの工作員しかいねえし

Rustが言語ですらないただの汚物って正しい認識を共有できる人がちゃんといるのは素晴らしいと思う
2017/10/25(水) 22:58:44.78ID:egHPItlD
>>143
C++みたく闇鍋状態にしたくないからだろ。
2017/10/25(水) 23:13:35.98ID:GfXNw50M
モジラが2ch見てるわけねーだろ
糖質かよ
2017/10/25(水) 23:16:03.33ID:j3LwAfcI
rustをそこまで毛嫌いする必要もないと思うけどな
rustのメモリオーナーシップモデルとかコードの改善に貢献するという話もあるし
ちょっと気にはなってる。
2017/10/26(木) 00:20:17.07ID:9syp6YaG
rustアンチって同一人物だろ
コンパイル通らなくてイライラしてるんだね^^
コテ付けて、どうぞ
2017/10/26(木) 00:21:04.60ID:T1ShqX6y
rustは何がそんなに駄目なんだろ
そこ迄言われると学びたくなってくる
2017/10/26(木) 00:26:09.28ID:9syp6YaG
>>149
他の言語にはない所有権システムが原因で学習コストが高い
使いこなせば強力だけどとても難しい機能
それで使いこなせてない人が「コンパイル通らない」って発狂してる

例えると、初めてHaskell言語触る人が「変数に代入出来ないから何も出来ない!Haskellは欠陥言語!」って言ってるような物
2017/10/26(木) 00:31:32.93ID:zsf3GtyN
rustのコンパイルを通せない低級汚グラマーが
嫉妬で腐してるだけだろ

腐ってるのはテメーの言語センスだろってね
2017/10/26(木) 00:32:53.75ID:9syp6YaG
Haskell言語って何だ
夜は誤字増えるから寝よう
2017/10/26(木) 00:50:43.34ID:T1ShqX6y
>>150
なるほど、でも面白そうだな

パフォーマンスは良いって聞くし
haskellも好きだし一通り触ってみるかな
2017/10/26(木) 03:24:21.96ID:EtDTWIur
まあ御託はいいからデータコピーなしの平衡二分木をRustで書いてからにしてくれよ
Cのコードは出たぞ
2017/10/26(木) 05:10:18.37ID:IaYxMsud
Haskellなら副作用だらけのコードは断固拒否するだけだが
Rustで副作用を拒否すると延々と粘着されそう

ついでにPythonは静的型を拒否するだけだが
Goはジェネリクスがない件で永久にいじめられるんだろう
2017/10/26(木) 07:04:11.52ID:hnEjL22C
Haskellは速さは捨てて副作用を無くすことに全振りしてるけど、Rustはそうではないからな
2017/10/26(木) 09:12:10.17ID:ZXFAdbhr
Rustはunsafeつかえば(ffiしたほうがはやいだろうが)できないことはないと思ってるんだが違うのかな?
2017/10/26(木) 09:59:20.18ID:tFGGFqQC
Goはいつものgoogleのフカしで持ち上げられてる感がプンプンするぜ。
単なる昔ながらのVM使ってない静的型付け言語を
システムプログラミングとかいうバズワードを作って
スクリプトしか描いたことない奴らにいかにも新しいものであるかのように錯覚させてる。
2017/10/26(木) 10:42:13.95ID:1t2EMvpb
>>157
初めからプログラム全体をunsafeで囲ってある状態を仕様にすればいいのにな

>>158
バズワードだろうがなんだろうが、速くて書きやすけりゃ正義よ
2017/10/26(木) 10:47:47.28ID:Y5WhyQQy
最近は新しいOSSもGoで書かれてるの多くてうんざりする
再来年辺りには「Goは終わった」とか言われだしてScalaと同じ道を辿るのわかりきってるのにWeb系の馬鹿共は何度同じ間違いを繰り返すのか
161デフォルトの名無しさん
垢版 |
2017/10/26(木) 11:10:35.34ID:8qIiNs+I
個人的にはDが一番純粋なc++ 後継って感じで頑張って欲しいんだけどなぁ
まったく流行る兆しがない……
別に新しい言語を求めてるんじゃないんだ。c++ からc互換を取り除いて標準ライブラリと文法見直してくれるだけでいいんだ
2017/10/26(木) 11:45:28.73ID:xVKEuI/f
>>160
「新しいOSSもGoで書かれてるのが多」いのに
「再来年辺りには『Goは終わった』とか言われだ」すのか。すげえな

まあGo2.0の漏れ聞く噂によると可能性なくもないんだが
2017/10/26(木) 11:47:37.13ID:xVKEuI/f
>>161
GC言語な時点でそりゃねえわ
全く同じ理由でGoもC++の完全な後継ではないと思ってるけど
2017/10/26(木) 11:54:33.47ID:Y5WhyQQy
>>162
Scalaという前例があるからね
特にビッグデータ系はScalaのOSSが多くて悲惨だよ
壮大な糞の山が残されてしまった
2017/10/26(木) 12:17:09.48ID:xVKEuI/f
>>164
Scalaが廃れた理由は、言語のバージョンアップ戦略がクソofクソだったってのと
コンパイル回りの性能が悪いっていう言語自体の特徴、
それから置き換えを狙っていたはずのJavaの進化に取り残されたことっていう色々と複合的な原因がある

Goがその後追いをするかって言われると、
少なくとも書きやすさの面でC++がGoに勝てる目は向こう5年はないだろうし、
バージョン戦略は少なくとも1系の間は下位互換性崩さんだろうしな
2017/10/26(木) 12:19:58.53ID:xVKEuI/f
不安があるとするなら、なんか1系と完全に互換性なくすとか言われてるGo2.0なんだよな
この辺の方針次第では、おっしゃる通り再来年にはゴミの山になってる可能性が無視できない

Swiftがクソバージョンアップでもなんとか成功してるのはプラットフォーム囲い込んでるのがでかい
167デフォルトの名無しさん
垢版 |
2017/10/26(木) 12:27:59.75ID:P+s05bng
AA木のRust版の移植を練習がてらやったぞ。
みんな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)
}
}
(続く)
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
}
(まだ続く)
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
}
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
}
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
}
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レスに収まらんかった)
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使ってる。
あとは、裏でも使ってないと思う。
2017/10/26(木) 12:39:25.88ID:xVKEuI/f
Rustトーシロの初見だけどこんなにunwrap必要なの怖いって気分になるな……
CのポインタをOption<Box<>>で表現してるからしゃーないとはいえ
176デフォルトの名無しさん
垢版 |
2017/10/26(木) 12:39:26.85ID:P+s05bng
ここまでやったらもう飽きた。
誰かメソッド構文とかコンビネータとかをきちんと使ったRustyなコードに書き換えて。
177
垢版 |
2017/10/26(木) 12:42:49.23ID:+cEqlMCT
Rust嫌いな奴はCをすぐ引き合いに出すが、misraの案件やったら死ぬんじゃねえかなって思う。

GC言語も悪くはないぞ。ちゃんとGCの動き考えれば、正しく開放「されてない」理由もわかるだろ。
最初からデカイ配列を握って離さない、それを切り貼りして使う、みたいなJavaのプロジェクトあるしな。
178デフォルトの名無しさん
垢版 |
2017/10/26(木) 12:50:10.86ID:P+s05bng
>>175
あくまでも愚直に書いてるからこんなにunwrapとas_refとas_mutだらけになる。
if letとかコンビネータとかをきちんと使えばこんなひどいコードにはならないよ。
2017/10/26(木) 16:47:19.95ID:hnEjL22C
rustのコード<>だらけで読みにくい
これはlispの括弧みたいに慣れたら読みやすいものなのか?
2017/10/26(木) 17:58:11.26ID:9syp6YaG
>>153
難しいとは言ってもOOP→関数型のパラダイムシフトに比べれば簡単だけどね
2017/10/26(木) 20:01:45.08ID:mFTohykf
>>154
おい、お前でてこいよ
2017/10/26(木) 21:09:45.15ID:LcYnzbeR
rust も haskell も理解できても面倒だし無駄に言語に気使ってるだけじゃねーかって
思うんだが、信者はききやしない。。
「お前らは理解できないものを理解できる俺偉い」で思考停止しちゃってんだよ。
2017/10/26(木) 21:15:34.16ID:hnEjL22C
一番言語に気を遣わないといけないのはC++だがなw
2017/10/26(木) 21:19:35.59ID:+/fzZ2Vi
型っていうシステムが
そもそも良くないっていうのは無いの?
2017/10/26(木) 21:46:13.96ID:OTLFFL6d
>>181
出てきたが、お前まさかこんな汚いコード未満とCのコード比較させる気か?勝負にならん。解散

>>182
それならマシで、Rust信者の工作員はモジラブランドのためなら使えないものを世界中の企業に絶賛させるための工作をに熱心すぎてもうね
2017/10/26(木) 21:54:28.12ID:PekP06rX
>>185
おめー流石に一から書いてもいない奴が言うセリフじゃねえよ
Cライク信者からしても何様だてめえは
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が嫌いってことはわかったけど、じゃあアンチ君の好きな(愛用してる)言語は何なの?
その言語のメリット・デメリット含めて詳しく解説してくんない?
2017/10/26(木) 23:26:00.76ID:LcYnzbeR
はっきり言わせてもらうけれど、
この規模のコードで書くのにそれだけ苦労する価値があると思えんが。
メモリリークについてもこの規模なら一通り見て、あるかないかくらい判断できるよ。

まあ主観といえば主観だけれど
本当に本心からこの程度のコードについてメモリリークを心配しちゃってるの?
言語を持ち上げるために無理に納得しようとしてない?
2017/10/26(木) 23:35:06.69ID:9syp6YaG
そりゃこの程度の規模じゃRust使うメリット皆無だよ
で、実際のプロジェクトがこの程度の規模なの?
2017/10/26(木) 23:35:07.35ID:51LPFkSD
なんでこの規模に限定した話をされているの?
2017/10/26(木) 23:37:41.83ID:9syp6YaG
Rustアンチスレ
https://mevius.5ch.net/test/read.cgi/tech/1509028624/
2017/10/26(木) 23:40:05.21ID:JSzFTz38
ブラウザの性能が圧倒的にchromeより上になったらrustの優位性が証明されるけど。
それをまとうかな。
2017/10/27(金) 00:07:16.82ID:xwp9Pca0
性能の差で優位性を証明したことなんて今まであったっけ
オブジェクト指向も関数型もiPhoneもみんな性能と関係ない価値観だったような
2017/10/27(金) 00:42:45.70ID:5+s2yfDd
>>185
さすがにコード一行も書いてない奴が言っていいセリフじゃねえわ……

>>189
さすがに後出し条件がひどい。そもそも発端は「Rustでは(unsafe使わずに)木構造すら書けねえだろ」って煽りが発端で
「さすがに木構造くらい(unsafeなし)Rustででも書けるわ」ってのの話がこれだろ

そりゃコンセプトが「安全性」なんだからCで書くより面倒なのは確かだし、この程度ならCの方がいいってのも当然だが、
そこを比較するために書いたもんじゃねえだろ
2017/10/27(金) 00:47:50.32ID:/3yfU/y8
見苦しくなってきたな
2017/10/27(金) 03:40:11.56ID:LQlgBzJd
流石に自演かすぎる…
2017/10/27(金) 06:31:17.46ID:2A0a9mBA
>>183
そんなことはないと思うが
何か具体例ある?
2017/10/27(金) 06:34:38.22ID:2A0a9mBA
>>195
言いたいことはわかるが
その「この程度」のも全部快適に書けるのが理想なわけだよね

この程度のをいっぱい書かなきゃいけなくなったときにこの調子じゃ萎える人も出てくるだろう
2017/10/27(金) 09:50:28.38ID:T+eCoUsJ
>>195
安全性のためとか言って結局まともにかけないアルゴリズムがあることを見て見ぬふりの信者

健康のためなら死んでもいいを地で行ってるな
これが宗教ってやつか
2017/10/27(金) 10:02:50.33ID:LQlgBzJd
Rustが面倒そうなのは伝わったが
C側の奴がコピペ野郎のくせに暴れてるクズすぎてなんとも
2017/10/27(金) 10:35:02.10ID:aniL1VIL
>>200
まともに書けるけど無料で教えてくれる人が少ないだけだってそろそろ気付けよ
普通は健康のためではなくカネのためにやってるから
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
2017/10/27(金) 11:26:28.21ID:T+eCoUsJ
ここにRustは、安全性を高めると言いつつまともにアルゴリズムを書こうとすると制約回避のためにとてつもなく汚いコードになり、
バグもCより出やすくなることが公になりましたとさ

ちゃんちゃん
2017/10/27(金) 11:40:28.33ID:AXKOuk3Y
>>198
言語に気を遣わないとすぐ自分の足元を撃ち抜く言語であるということに同意しないということ?

具体例っていざ言われると困るなあ。ふと思い出した阿呆な失敗談を一つ挙げると、クラスの値型配列を作れちゃうところとか、クラスは絶対ポインタで持たないといけないDとは対照的に感じたな

常識的に考えたらクラスの値型配列なんてやったらダメなのはわかるんだけど、なぜかやってしまって、コンパイル通ってんのに思ってたのと違う挙動して困ったわ。こういう常識的に考えたらわかるけど、考えないといけない部分があるから言語に気を遣わないとやっていけん。

これは全然大したことない例だけど、なんか他にもあったような気もするし思い出したら書き込むわ
2017/10/27(金) 12:04:57.19ID:aniL1VIL
代入がなければ値型でもポインタでも同じ挙動だ
だから、代入しようとしたらコンパイルが通らない言語が現れた
2017/10/27(金) 12:27:06.09ID:Luz9kSs/
haskell追い出したら次はrustですか?
2017/10/27(金) 12:49:17.54ID:aniL1VIL
追い出す権利はないね
あると思ってるやつは権利に甘えすぎ
2017/10/27(金) 12:53:49.35ID:BmYygdVN
https://cpplover.blogspot.jp/2017/10/range-based-for.html

まあこう言う馬鹿がいなくなるまでは
実際のコードについて議論したほうがいいとは思うよ。

別に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); }
...
211デフォルトの名無しさん
垢版 |
2017/10/27(金) 14:02:45.56ID:OeXtCDV4
>>204
何度も言ってるがこのコードが汚いのは制約回避のためじゃなくて、Cのコードを愚直に移植してるからだぞ。
CのNULLを表現するためにOption型を使用してるから、コンビネータとかを
きちんと使わない限りはunwrapだらけになってコードが汚くなる。
Rustのコードが汚いんじゃなくてRustyに書いてないから汚いだけ。
同じことを何度も言わせないでくれ。

確かに、Rustはコンパイル通すために苦労するから、
執行錯誤してるうちにうっかりミスしやすくなるという考えはあるのかもな。
まあ、この程度のミスを犯す俺が単純にバカすぐるのか、これもRustの課題のひとつだと考えるかは
人によって意見が分かれてくるところじゃないか?みんなどう思う?
2017/10/27(金) 15:02:03.76ID:aniL1VIL
カネもないし時間のゆとりもないからコードが汚くなった
言語よりもカネと時間の使い方が間違っている
2017/10/27(金) 17:07:21.98ID:2A0a9mBA
>>205
クラスの値型配列はごく基本的で有用なデータ構造なんだけど…
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況