次世代言語25 TypeScript Swift Go Kotlin Rust Nim
■ このスレッドは過去ログ倉庫に格納されています
スレタイ(順番はRedMonk準拠)以外の言語もok 前スレ 次世代言語24 Go Nim Rust Swift Kotlin TypeScript https://mevius.5ch.net/test/read.cgi/tech/1647887021/ どうしてDって今のgoやrustみたいにならなかったの? DのUFCSもメンバ関数やネスト関数などには適用できない制限がある UFCSなんかなくても最初の引数の型に対してメソッド定義するだけで目的達成可能 グローバル名関数を増やして名前空間を汚さずともその型のメソッド定義がベター >>225 GoやRustはclassなんか無くても各型に対してメソッドを定義できるのでそういうことを招かずに済むのよ UFCSのメリットはメソッドチェーン記法が可能になることだから最初からメソッドを定義すればいいものね >>229 structかenumは定義する必要あるじゃん tsのtypeがどういうものか分かったうえでレスしてる? >>230 structやenumは単なるtypeだよ C言語でもstructと(enumの代わりにタグ無しの)unionがあるよね(ただしメソッド定義はできないけど) Nim言語にもUFCSがあって関数だけじゃなくtemplateやmacroも関数と同じ文法で呼び出せるのでUFCSが使える。ただし第一引数がuntypedだとmethod call syntaxが使えない。 UFCSのメリットは標準ライブラリとか他人の書いたコードにある型とプロシージャの組に対してもmethod call syntaxが使えることだと思う。 第一引数が組み込み型のプロシージャを定義すれば組み込み型に対してmethod call syntaxが使える。 ライブラリAで定義されている型Xのオブジェクトに対してまったく別に書かれたライブラリBで定義されているgenericsなプロシージャをmethod call syntaxで呼ぶ出すことができる。 >>230 structやenum以外でもOK 任意の型にメソッドを定義可能 >>228 オーバーロードがある言語なら引数が一つ以上あるグローバル関数を追加しても引数さえ異なれば同名の関数をグローバルに追加できる。 UFCSとオーバーロードがある言語では第一引数がFoo型の関数を定義するのはFoo型にメソッドを定義することとほぼ同じとみなせる。 つまりUFCSは汚染でありリスク要因 定義していないメソッドが使えることになってしまう UFCSがなくとも明確にその型に対して定義されたメソッドのみ対象で実用上困ることはない モジュールがあるなら関数のimport有無でどの関数が呼び出されるか制御できたりしないの? Rustのtraitのuseみたいに >>235 UFCSのあるNim言語をよく使っているけど特に問題無く使えてるよ。 ライブラリAで定義された型を第一引数に持つ関数をライブラリAの外で定義してもgenerics/template/macroなど使わない限りライブラリAから呼び出せないし、ライブラリA内で使われている関数を外から勝手に上書きできない。 メソッド呼び出ししているように見えてもライブラリA内のプライベートな変数/関数はライブラリの外からアクセスできない。 method call syntaxってa.fooMethod(b)って書いてあるのを コンパイラがfooMethod(a, b)という関数呼び出しとして解釈しているだけでなんのリスクもないよ。 第一引数にFoo型のオブジェクトをとる関数を定義してもオーバーロードがあるのでFoo型を使わない人には何の影響も与えない D言語のプロジェクト見て半笑いになるのやめてさしあげろ >>236 Nim言語だとimportするときにfrom std/strutils import `%`みたいに特定の型/関数だけをインポートすることができるよ。 もし同じ名前で同じ引数の関数が複数定義されている場合は関数名の前に"モジュルー名."をつけないとコンパイルエラーになる。 結局UFCSは不要だよな メソッド的に使いたいならば最初からその型にメソッドを生やせばよいだけ 必要ならばジェネリックに定義すれば複数の型に同時にメソッドを生やせる わざわざグローバル関数にしておいてからメソッド的に使えます!とかメリットを一切感じない >>240 標準ライブラリにある型とか他人のgithubリポジトリにあるライブラリにも自由にメソッド追加できるの? ジェネリックにする必要が無いときでもジェネリックにしないとメソッドはやせないの? Nim言語にはそもそもC++のメンバ関数みたいなのが無くて、第一引数がFoo型の関数がFoo型のメソッドの代わりみたいになっている。 >>241 ジェネリックである必要なし もちろん同じ機能を複数の型に適用ならジェネリックで1回で済むのが普通 >>241 うん 標準ライブラリや第三者ライブラリにある型にもメソッドを増やすことができるよ だからUFCSが無くても困らないよ UFCSがあれば引数が一個以上持つ関数であればa.f(b)ともf(a, b)とも書ける。 a.f(b)とf(a, b)の両方で書きたい場合があったらどうするの? UFCSがなければa.f(b)で呼べるメソッドがあるときジェネリックな関数の中でf(a, b)の形式で呼ばれていたら、わざわざ新しくa.f(b)を中で呼ぶf(a, b)を定義しないといけない。 逆にf(a, b)な関数があったときに新しくメソッドを定義しなくてもa.f(b)と書ける。 それとNimだとcommand invocation syntaxがってf a, bという文法でも関数を呼べる。括弧がないので引数が複雑な式にならなければ書きやすくて読みやすいよ。 >>244 Rustでも可能 例えばu64型のxに対して xのn乗はu64::pow(x, n)という関数が標準であるけど これはx.pow(n)と呼び出すことができる >>225 js/tsなら言語仕様拡張せんでも関数合成だろう。 >>241 既存の型にもメソッド追加できるよ 例えばJavaScriptならこんな感じ // 文字列にhello()を追加 String.prototype.hello = function() { console.log(`Hello ${this}!`); }; // 数値にhello()を追加 Number.prototype.hello = function() { console.log(`Hello ${this}!`); }; "abc".hello(); // 123.hello(); // 文法エラー let num = 123; num.hello(); Rustではジェネリックにメソッド追加することも可能 // メソッドhello()を持つトレイトHelloを宣言 trait Hello { fn hello(&self); } use std::fmt::Display; // 表示可能トレイトDisplayを満たす全ての型に対してhello()を実装 impl<T: Display> Hello for T { fn hello(&self) { println!("Hello {self}!"); } } fn main() { "abc".hello(); 123.hello(); } 既存の型へのメソッド追加はプロトタイプ汚染とか言われて忌避されてるよね 他モジュールへの影響の出ない形でメソッド追加する手法が望ましい >>250 JavaScriptはプロトタイプがグローバルに書き換わり全てのモジュールに適用されるためだな 一方でRustはメソッドを追加するにはトレイトを用意することが必要、そしてトレイトが宣言/useされている空間のみ有効、なので汚染が生じず安全 >>251 型を定義した以外のcrateでメソッドを追加するためにはtraitが必要、が正しいかな メソッドを追加するためにはtraitなしのimplを書く方法もあるが、これをできるのは型を定義したcrateだけに制限されているので他crateで定義を追加して汚染することはない とまあRustの事情は知ってるんだけど、他の言語ではどうなってるのかが知りたかった JavaScriptで脆弱性を生みまくってさんざん問題視されたんだから、いまどきそんな汚染が起こる新しい言語は一つもないよ 他の言語でもメソッド追加方法を教えて 今のところ JavaScript >>248 Rust >>249 発端になったD言語のUFCSハブられてるのなんで? >>256 UFCSはメリット無いからでしょ メソッド追加できるなら関数よりメソッドの方が名前空間を汚さないし UFCSはメソッド名空間の汚染 だから採用しないのが正解 結局メソッド生やしたいんじゃなくてプライベートメンバにアクセスしたいだけなんだよな >>259 汚染言うならRustのtrailと同レベルじゃない? 関数をincludeしなければ影響無いんだし、言語次第だけど名前空間に閉じ込めることもできるだろ。 >>261 Rustは一切汚染しません 何を誤解しているのですか? いやトレイトで似たようなメソッドがたくさんぶら下がって汚染されてますよね?それが更にハードルが上がる一因になってる >>263 Rustでは明示的にuse Traitしない限り そのトレイトのメソッドが有効になることはないよ 汚染は起きず安全に設計されている >>264 当然、D言語でもnimでも、importしたシンボルは、importされたスコープでしか有効にならないし、メソッド形式の呼び出しもできない Rustと何が違うんだよ UFCSは強制汚染 関数として必要なだけなのにメソッド名空間を汚染 メソッドとして必要なだけなのに関数名空間を汚染 だから採用する言語がほとんどない >>264 イヤイヤ、そんなのほとんどの言語でimportやincludeと同じで更に言えば、use std::io::prelude::*;みたいにRustでもPythonでも 誤ったやり方とされてるワイルドカードだって使えるんだから一緒でしょ。明確に言うなら”汚染は起きず”ではなく、汚染は当然ながら useするのだから起きている。無意味にuseしない*を使わないというのは言語仕様や特性じゃなく規約だよ スコープやシンボルが限定されてるのに汚染と呼ぶのはおかしい >>267 Rustでは追加メソッドを使う場合 必要な機能のTraitだけを use TraitName as _; する そのため汚染は起きない >>264 ほんとRustニワカ嫌いだわ、「明示的にuse Traitしない限り」なんて良くそんな詭弁が言えるわ。どう考えても一緒でしょう だからPythonだってas構文使えますし、D言語だってimport std.stdio : writeln, writefln;で選択的インポートできるでしょw Rust聖戦士がワラワラ 他の言語のスタイルはすべてアンチパターン >>269 Underscore importなんてRustがトレイトのシンボルが別のシンボルと競合する可能性がある場合、つまりRustが破綻しないように 特別にあるだけで、汚染の低下のための機能ではないぜ。ここで汚染といってるのは無暗にメソッドが追加される事。 (回避策が仮に無ければ)衝突することはもはや、言語的な欠陥だ 使われる空間に名前が載ることを汚染とは言わない 使わない空間に名前が載ることを汚染と言う UFCSが汚染と言われる理由は 関数として使いメソッドとして使わなくてもメソッド名空間に載り メソッドとして使い関数として使わなくても関数名空間に載るためだと考えられる >>273 Rustだって、fn中にuse出来るわけでそれはほかの言語でも同じ。そう言う事はあまりしないけども、多くの言語で同じように”使われる空間”だけに載る RustがUFCSを採用しないのは単に、パーサーをオブジェクトを先して作り直すと(C言語にわざと似せてる)見た目が変わってしまうし パーサーに手を入れるということは苦労してきたコンパイル速度が低下してしまう恐れがあるという事だけ >>273 その程度で汚染とか言うの聞いたことねえよ ESModuleとかが導入される前のJSのグローバル汚染なんかと比較してみ? Rust上げしたいがためだけのただのイチャモンだよお前の主張は >>272 Rustでは汚染は起きないですよ >>274 そうです だからRustでは>>273 の汚染という状況は発生しないですね そもそもUFCSは汚染だなんてここ以外で聞いたことがないんだけど >>273 UFCSとやらはムダに汚染しまくるクソな機能だな Rustの宣伝はこんな匿名掲示板じゃなくQiitaとかに書いてほしいな その反応で実際に正論なのか暴論なのか明らかになるだろう UFCSという汚染機能をサポートしているプログラミング言語はDとNim 埋もれた言語となったのも当然の結果 ほとんど全ての言語がUFCSを採用していない理由はメリットが無いからだと思う そして無条件に二つの名前空間に登録されてしまうことを汚染と呼ぶかどうかは置いておくとしても本末転倒の方法かなとは感じる >>275 さらにRustは実装としてUFCSを別の意味で誤って使っていた過去がある、::パス構文で混乱を引き起こして曖昧性が起きた。2017年頃でそんなに優れた開発者がおらずなんとなく実装していた時期だな、いつもはRustは論文がしっかりしてると嘯くのに >>286 Rustは関係ないんじゃね? むしろRustのアンチ側がなぜかRust叩きしていて巻き込まれ被害側にみえる どっちでもいいよ 信者だろうがアンチだろうがあらゆる話題がRustとの比較になって宗教戦争化するのが馬鹿馬鹿しすぎる Rustの話題はスレ違いなのでRust叩きもスレ違いとする、問題解決 ほぼ全ての言語がUFCSを採用していない しかしUFCSが叩かれるとなぜか必死にRustを攻撃してくれる 一石二鳥と言えるだろう C++委員会での議論でもメンバ関数と非メンバ関数で衝突したときにどう解決するかで割れて否決されたみたいだし、なかなか難しそうだね 考えてみたがUFCSは完全に不要っぽい まずメソッドとして使いたいものは最初からメソッドとして書けばよい 次に外部の関数をどうしてもメソッドとして使いたいならばその外部関数を呼び出すメソッドを追加すればよい 衝突が問題ならUFCSの使用は記号などを使って明示したらいいんじゃないかな? 「Rustを攻撃」ってどっちも同じでしょって言ってるだけなのに、このように攻撃を受けたと勘違いするんだから、正常な議論なんて出来ない。 UFCSについて難癖付けてるだけじゃん、個人的には別に必要ないと思うし、仮にあったら便利だとも思うが。コンパイル時間が増えるのは許容できない 「Rustのアンチ側」なんて言い出すクズどもとまともな話なんて出来るわけない。 こんな奴らばっかり増やしてもRustの普及を妨げてると思うんだけど? スレ読んだけど 汚染でも何でもなくRust特有の問題でもないことをRustは汚染だと延々と叩いてるのは異常に感じた 今のところUFCSがある言語と外部のデータ型に対してメソッドを追加できない言語、メソッドを追加できる言語とできない言語のそれぞれは前者が勝手で勝るけど、前者同士では好みとか実現手法の違い程度の話のように感じてる UFCSも結局モジュール単位で環境が分離されている事が殆どのようだし、どちらかじゃないとできない事も、どちらかだと発生する致命的な不都合も見えてこない 一見機能が不要に見えても、その採用理由が他の要素に起因してたりもするだろうし、その辺私はUFCS採用言語のことを詳しく知らないのでなんとも言えないな >>292 C++での議論では当然そういう案含めていろいろ提案されたけど、結局どれも一長一短で委員会での合意には至らなかったみたい 一人で作ってる言語なら作者の好みでサクッと入れられちゃうんだろうけどね 汚染と言わなくても、Rustがuseで似たようなメソッドがたくさん出てくるのは本当でしょ、UFCSにしてもそれはイコールで何ら変わらんわ なんでこいつらマトモに話すら出来ないの?コーディング能力を持ってるんだろうけど、コミュニケーション能力はゼロに近い メソッドが動詞ならUFCSでは関係が逆になるんだよね 英語圏の人はどう思ってるんだろ >>298 OSV言語の自然言語に近くなるから、オブジェクトが先に来るのは利点として受け止められてる。でも所詮はシンタックスシュガーの何者でもない >>297 > 似たようなメソッドがたくさん出てくる そこ意味がわからない 似たようなメソッドがたくさんとは何? C#にも拡張メソッドと言う名前でほぼ同じ機能が使えるけどそっちは拡張メソッドオンリーで使う前提で作られてる >>299 英語はOSVじゃなくSVOな?OSVになることもあるけど、そして世界の自然言語の主流は日本語と同じくSOVが40% 参考としてスター・ウォーズのジェダイ・マスター:ヨーダは、このOSV語順で話す。 var s=copy(section); paste(s); みたいなのがあって これを paste(copy(section)): とするより section.copy().paste(); のほうが受け入れ易いってことだよね? Methods! You will be written first, but many are not. >>305 ところがどっこい var sのsはメソッドを生やせないstring型だ 常にメソッドを生やせるとは限らないし、元のクラスに必要以上の仕事を増やさないためにから拡張メソッドという概念があるんだよ スコープでuse出来て局所ごとにsection.print()の意味が変わる場合も便利だと感じる? メソッドじゃなくて関数や変数でも、スコープごとに意味が変わりうるのは当然のこと 拡張メソッドが欲しいのはまぁ分かるんだけど UFCSまでいくと普通の関数のつもりが意図せずメソッド呼び出しできてしまう、みたいなデメリットの方が大きくなる気がするなぁ なぜRustが叩かれていたのかようやく理解できた Rustでは基本の型にも外部の型にもメソッドを追加できるわけか そのためメソッドを自由に追加できない言語の人が逆恨みで叩いていたと "test".print();が局所ごとに意味が変わると気持ち悪い >>266 Nimだと「メソッド名空間」自体が無いから、そんな議論をするのは無駄だね。 >>312 え?logging.rsに"test".print();と書いてあるのと、printer.rsに"test".print();で意味が変わるのはなんも関係無くねえ? つーか普通に関数でprint("test")だのsaveだの、getだの散々やってるじゃん。気持ち(悪い)の問題なんだろうけどさ >>311 それはNimも同様。 むしろNimの方がメソッドと関数を統一しているから(記法が違うだけ)、より自然に拡張できる。 >ぜRustが叩かれていたのかようやく理解できた >逆恨みで叩いていたと こういうアホなことを言う狂信者ばかりだからだよ。 RustのメソッドとかC++のメンバ関数のような特定の型だったりトレイトに束縛された関数のようなものがNimにはなくて、自由関数だけがある。 だからNimからUFCSをとったらC言語のように全ての関数をfoo(x, y, z)って書かないといけなくなっちゃう。 UFCSがあるおかげでどんな関数もx.f(y,z)だったりf(x, y, z)とか自由に書ける。 UFCSで関数がメソッドになるとプライベート変数/メソッドにアクセスできちゃうって勘違いしている人がいるかもしれないけどNimではそれは起きない。 C++のメンバ変数に相当するものや関数のアクセス権はモジュール外にそれを公開するかしないかのどちらかしかない。 >>315 Nimでも自由にメソッドを追加できるならばUFCS必要なくね?? >>314 逆にprint_to_printer()とか print_to_consoleとか書いてあったら発狂するかもしれんわ 一番使うdebug_assert_eqとかヤメテほしい・・・、あと帰ってくる正式な型名が異様に長くなるのもC++の悪いところを引き継い出るような感じがする >>316 自由関数しかないNimは関数名空間が常に汚染されてしまうのね 普通のプログラミング言語ならばメソッド名として名前空間が分離されるのよ std::iter::emptyは名前空間を汚染するので使ってはいけません アホか >>319 1つも調べもせんのな、自由関数だけじゃなくmethodもある。つーかおまえRust使うの止めてJavaやってろ、まじ迷惑 >>317 >>316 にまとまっているよ。 メソッドが無くて、ただの記法の違いでしか無いからこそUFCSのメリットを最大限享受できる。 >>319 メソッド名を関数名から「常に」分離するメリットは? 関数自体をモジュールとかで分離して管理できればいいんじゃないのかね。 やはり逆恨みで無関係なRust叩きやってる説が正しいかもしれん Rustが無関係な状況でも>>321 のように唐突にRustを出してくる 逆恨みだの、攻撃だの、ずーーとこんな事言ってる奴いるけど完全なびょーきだと思う。名前空間が汚染されないという言語はお前の中で具体的に何? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる