スレタイ以外の言語もok
前スレ
次世代言語21 Go Nim Rust Swift Kotlin TypeScript
https://mevius.5ch.net/test/read.cgi/tech/1587276362/
探検
次世代言語22 Go Nim Rust Swift Kotlin TypeScript
■ このスレッドは過去ログ倉庫に格納されています
2021/08/22(日) 08:59:03.31ID:QorwbXcj
329デフォルトの名無しさん
2021/10/30(土) 14:03:03.78ID:U9OTRLVf330デフォルトの名無しさん
2021/10/30(土) 22:25:15.35ID:G/S2+R78 >>324
公式は3つ挙げてる。macro記述と言語そのもの差異がほとんど無いことを挙げている。$aとか別言語になったり
してない。もう1つはpython風の構文がエレガントだと言っている(これはpython風の構文を多くの人が嫌うの
で賛否が分かれると思う)もう1つは多くの言語が該当するので書かない。個人的にはvar/letじゃなくlet mutや
いちいち打つ::や、マクロで!とかの方がエレガントだと思わんけど、goでいえばpanicがあるのにtry/catchが無い
(多値戻りの2番目にerrorを入れてif判定させる)、genericsがまだ無いのもエレガントとは思えない
公式は3つ挙げてる。macro記述と言語そのもの差異がほとんど無いことを挙げている。$aとか別言語になったり
してない。もう1つはpython風の構文がエレガントだと言っている(これはpython風の構文を多くの人が嫌うの
で賛否が分かれると思う)もう1つは多くの言語が該当するので書かない。個人的にはvar/letじゃなくlet mutや
いちいち打つ::や、マクロで!とかの方がエレガントだと思わんけど、goでいえばpanicがあるのにtry/catchが無い
(多値戻りの2番目にerrorを入れてif判定させる)、genericsがまだ無いのもエレガントとは思えない
331デフォルトの名無しさん
2021/10/30(土) 22:27:20.82ID:G/S2+R78 >>327
Juliaでは、標準ライブラリの一つとして提供されているDistributedモジュールで分散メモリ並列計算を実装して
いる。Juliaのベースインストール状態では、2種類のクラスタがサポートされる。(1つはローカル)
・複数のマシンからなるクラスタ。--machine-fileオプションで指定する。パスワードが不要なSSHを
用いてJuliaのワーカプロセスを指定した計算機で分散される
@distributed for i = 1:100000
a[i] + b[i]
end
こういうのが1つの実行環境で複数のコンピュータでクラスタ実行される
--machine-fileで
3 164.67.165.21 # 3process
5 164.67.165.22 # 5process
Juliaでは、標準ライブラリの一つとして提供されているDistributedモジュールで分散メモリ並列計算を実装して
いる。Juliaのベースインストール状態では、2種類のクラスタがサポートされる。(1つはローカル)
・複数のマシンからなるクラスタ。--machine-fileオプションで指定する。パスワードが不要なSSHを
用いてJuliaのワーカプロセスを指定した計算機で分散される
@distributed for i = 1:100000
a[i] + b[i]
end
こういうのが1つの実行環境で複数のコンピュータでクラスタ実行される
--machine-fileで
3 164.67.165.21 # 3process
5 164.67.165.22 # 5process
332デフォルトの名無しさん
2021/10/30(土) 22:36:16.21ID:G/S2+R78 まあmacro記述を簡単にインライン展開するために別言語風になるのも分かるけど、、名前衝突が起きないように
デフォルトで別名に自動で名前を付けて展開してインライン展開する場合は特殊タグを付けるほうが
デフォルトで別名に自動で名前を付けて展開してインライン展開する場合は特殊タグを付けるほうが
333デフォルトの名無しさん
2021/10/30(土) 23:31:55.44ID:U9OTRLVf >>331
そんなの言語レベルのサポートいらんやん
分散も並列化も勝手にやってくれ
プロセスもマシンも意識したくない
意識してもいいけど必須じゃなく、自動で可能な限り適切にリソースが配分されてほしい
プロセスとかそんなざっくりした単位でもなくね
それが実現可能な言語を用意せよと言っている
そんなの言語レベルのサポートいらんやん
分散も並列化も勝手にやってくれ
プロセスもマシンも意識したくない
意識してもいいけど必須じゃなく、自動で可能な限り適切にリソースが配分されてほしい
プロセスとかそんなざっくりした単位でもなくね
それが実現可能な言語を用意せよと言っている
334デフォルトの名無しさん
2021/10/31(日) 00:40:29.24ID:Qz/5KmYR それって言語じゃなくてOSとか別のレイヤーが果たす役割じゃね?
335デフォルトの名無しさん
2021/10/31(日) 00:43:34.15ID:e5ZzvOAs 言語レベルサポートが無いということは、分散も並列化も勝手にやったら不可分解の通常のforループも
分解されてしまうので、そんなことは不可能。繰り返し順次実行と、(表現上は繰り返しだが)並列実行
では意味も結果も異なる。
要らないというコンピューター言語学での証明は無い。思想的には集合要素に対するmap/reduceなどが
並列の操作ができるからと言って、forだけで表現できる語彙ではない。言語の標準ライブラリにreduce
などのAPIがある事は、それそのものが(並列に実行していないのに)並列性の表現と同じ意味。
CPU側でそれが並行操作可能か、何らしらのマーカーは必要というのは素人以外はすぐ分かる事
>”言語を用意せよと言っている”おまえ何様やねんw
分解されてしまうので、そんなことは不可能。繰り返し順次実行と、(表現上は繰り返しだが)並列実行
では意味も結果も異なる。
要らないというコンピューター言語学での証明は無い。思想的には集合要素に対するmap/reduceなどが
並列の操作ができるからと言って、forだけで表現できる語彙ではない。言語の標準ライブラリにreduce
などのAPIがある事は、それそのものが(並列に実行していないのに)並列性の表現と同じ意味。
CPU側でそれが並行操作可能か、何らしらのマーカーは必要というのは素人以外はすぐ分かる事
>”言語を用意せよと言っている”おまえ何様やねんw
336デフォルトの名無しさん
2021/10/31(日) 00:44:58.68ID:LjLsZLEJ プログラミング言語という概念すら理解してないのがこのスレの住人のレベル
337デフォルトの名無しさん
2021/10/31(日) 01:28:26.60ID:e5ZzvOAs >>334
その通り。分散コンピューティング/グリッド・コンピューティングなどではミドルウェアが利用される。
Erlangなどでも、分散処理できるがspawn(node, ...)などノードを意識しなくてはならない。また
CPU処理が分散できたからと言って、ファイルシステムなどローカルしかないため、大規模分散には
分散ファイルシステムが必要になり、Googleのようにbigtableができ、その上で耐故障性を備えるように
仮想化して、スケールアウトやオーケストレーションのためにkubernetesなどなど、別レイヤーが
果たす役割が多い
その通り。分散コンピューティング/グリッド・コンピューティングなどではミドルウェアが利用される。
Erlangなどでも、分散処理できるがspawn(node, ...)などノードを意識しなくてはならない。また
CPU処理が分散できたからと言って、ファイルシステムなどローカルしかないため、大規模分散には
分散ファイルシステムが必要になり、Googleのようにbigtableができ、その上で耐故障性を備えるように
仮想化して、スケールアウトやオーケストレーションのためにkubernetesなどなど、別レイヤーが
果たす役割が多い
338デフォルトの名無しさん
2021/10/31(日) 01:35:34.83ID:sAwtPlvj そういうことじゃないw
俺様が言ってるのはマシン/アプリ/ライブラリ/OS/デバイスの垣根を超えて
言語とそれらの複合環境がカバーしうる汎用な表現が可能な言語やw
作れw
俺様が言ってるのはマシン/アプリ/ライブラリ/OS/デバイスの垣根を超えて
言語とそれらの複合環境がカバーしうる汎用な表現が可能な言語やw
作れw
339デフォルトの名無しさん
2021/10/31(日) 01:43:15.98ID:e5ZzvOAs 基地外かあ…、この業界こういうの大杉壮大な能無し基地外のかまってちゃん
340デフォルトの名無しさん
2021/10/31(日) 01:47:23.36ID:sAwtPlvj 例えば組み込み制御系で使えばCの配列を作るのと同じ記述でスケールしたら分散KVSもどきやらが出来上がるような言語
並列実行可能かどうかはあるロジックの入力が別のロジックの出力を使ってるかどうかだけ
並列実行可能かどうかはあるロジックの入力が別のロジックの出力を使ってるかどうかだけ
341デフォルトの名無しさん
2021/10/31(日) 01:58:47.24ID:sAwtPlvj できそうにないだろ?
既存のアーキテクチャにどっぷりなら
高速にぶん回したかったらrustでもC++でもgolangでも使えばいいし
スケールするだけで十分な速度が出るなら誰でも使える言語を使ってスケールすればいいし
僅かに違う新しめの言語の差分をネタに趣味・嗜好を語るよりは夢を語った方が有意義でないかい?w
既存のアーキテクチャにどっぷりなら
高速にぶん回したかったらrustでもC++でもgolangでも使えばいいし
スケールするだけで十分な速度が出るなら誰でも使える言語を使ってスケールすればいいし
僅かに違う新しめの言語の差分をネタに趣味・嗜好を語るよりは夢を語った方が有意義でないかい?w
342デフォルトの名無しさん
2021/10/31(日) 02:01:52.96ID:dE1SXutD Common Lisp
343デフォルトの名無しさん
2021/10/31(日) 02:08:26.79ID:e5ZzvOAs おまえのチンポコの穴から並列でションベン出来るか考えてロンパーロンパーしてろwくそ基地外w
344デフォルトの名無しさん
2021/10/31(日) 02:12:58.45ID:e5ZzvOAs おまえがいるだけで世の中迷惑、人の足引っ張りまくり、親に迷惑かけまくり、誰もがお前を見ると顔をしかめる。
クズの癖に1つも優れた能力も、努力もなく、相手を貶し、悦に入る
問題の原因の根本たるおまえが消えて無くなれば、よほど有意義
クズの癖に1つも優れた能力も、努力もなく、相手を貶し、悦に入る
問題の原因の根本たるおまえが消えて無くなれば、よほど有意義
345デフォルトの名無しさん
2021/10/31(日) 10:57:39.56ID:dKAtRzTx LISP専用CPUとRISC-CPUを聴き間違えたけど同じもの?
346デフォルトの名無しさん
2021/10/31(日) 11:13:06.97ID:gOKmIPxI347デフォルトの名無しさん
2021/10/31(日) 12:55:57.25ID:o3yW9Bfn >>346
公式はgoと比べてる訳じゃないよ?
公式はgoと比べてる訳じゃないよ?
348デフォルトの名無しさん
2021/10/31(日) 13:41:46.14ID:nF8ypkXG Goは断捨離の観点でエレガント
try throw catchなんか無くても関数は返り値をエラー値とタプルで返せばいいし
classなんかなくても構造体と関数でいいし
イテレータなんか使わずともfor回せばいい
try throw catchなんか無くても関数は返り値をエラー値とタプルで返せばいいし
classなんかなくても構造体と関数でいいし
イテレータなんか使わずともfor回せばいい
349デフォルトの名無しさん
2021/10/31(日) 13:50:44.46ID:5SuYQG0J 落ち着いていて品のよいさま。上品。優雅。エレガン。
(考え方や手法などが)簡潔で要を得たさま。手際のよいさま。明快なさま。
抽象度は高めたほうが優雅なのでは?
(考え方や手法などが)簡潔で要を得たさま。手際のよいさま。明快なさま。
抽象度は高めたほうが優雅なのでは?
350デフォルトの名無しさん
2021/10/31(日) 13:56:01.91ID:sAwtPlvj 昔のperlみたいにならないよう糖衣構文やそれに類するモノはどちらかに振った方がいい(エレガントな)こともある
結局は好みだけどなw
結局は好みだけどなw
351デフォルトの名無しさん
2021/10/31(日) 14:23:30.67ID:512CMESs 中置記法をユーザー定義する構文糖を否定したやつは失敗
PythonとC++は少なくともその失敗をしなかった
PythonとC++は少なくともその失敗をしなかった
352デフォルトの名無しさん
2021/10/31(日) 15:04:58.04ID:OVPW0Dsp Nim言語では最近特定のunicode文字を2項演算子としてオーバーロードできるようになりました。
unicodeにある文字を演算子として使うのは文字を入力し辛いとか∪∨がアルファベットのUVと似ていて紛らわしいとかで反対派もいるようですが。
https://nim-lang.org/docs/manual.html#lexical-analysis-unicode-operators
proc `*` (x: Dollar, y: int): Dollar =
result = Dollar(int(x) * y)
みたいな感じで'*'演算子を定義できます。
https://nim-lang.org/docs/manual.html#procedures
unicodeにある文字を演算子として使うのは文字を入力し辛いとか∪∨がアルファベットのUVと似ていて紛らわしいとかで反対派もいるようですが。
https://nim-lang.org/docs/manual.html#lexical-analysis-unicode-operators
proc `*` (x: Dollar, y: int): Dollar =
result = Dollar(int(x) * y)
みたいな感じで'*'演算子を定義できます。
https://nim-lang.org/docs/manual.html#procedures
353デフォルトの名無しさん
2021/10/31(日) 15:42:26.32ID:OVPW0Dsp Nim言語にはtype classというのがあって、これを使うと特定の種類の型のみに限定されたgeneric procedureを簡単にかけます。
詳しくは
https://nim-lang.org/docs/manual.html#generics-type-classes
Nim言語ではprocedure/template/macroを呼び出す方法が複数あって、
foo(arg1, arg2)という普通の書き方に加えarg1.foo(arg2)というオブジェクト指向のメソッドぽく呼ぶMethod call syntaxと括弧を省略してコマンドラインぽくfoo arg1, arg2と書くcommand invocation syntaxがあります。
https://nim-lang.org/docs/manual.html#procedures-method-call-syntax
https://nim-lang.org/docs/manual.html#procedures-command-invocation-syntax
詳しくは
https://nim-lang.org/docs/manual.html#generics-type-classes
Nim言語ではprocedure/template/macroを呼び出す方法が複数あって、
foo(arg1, arg2)という普通の書き方に加えarg1.foo(arg2)というオブジェクト指向のメソッドぽく呼ぶMethod call syntaxと括弧を省略してコマンドラインぽくfoo arg1, arg2と書くcommand invocation syntaxがあります。
https://nim-lang.org/docs/manual.html#procedures-method-call-syntax
https://nim-lang.org/docs/manual.html#procedures-command-invocation-syntax
354デフォルトの名無しさん
2021/10/31(日) 15:50:59.21ID:15Fr5KXV 実に表現豊かでエレガントですねぇ…☺
355デフォルトの名無しさん
2021/10/31(日) 16:18:17.43ID:nF8ypkXG >>353
type classは関数型言語Haskell発祥
そのNimのページを見る限りその貧弱なおもちゃ版に見える
例えばNimと同じ手続き型言語のRustのtraitも用語は違えどtype classなので比較するとわかりやすいが機能面でも型付け面でも強力
type classは関数型言語Haskell発祥
そのNimのページを見る限りその貧弱なおもちゃ版に見える
例えばNimと同じ手続き型言語のRustのtraitも用語は違えどtype classなので比較するとわかりやすいが機能面でも型付け面でも強力
356デフォルトの名無しさん
2021/10/31(日) 17:04:32.64ID:r7nTmIjE >>348
言ってる事はその通り。goで構文上、覚える事の少なさは”非常に良い”が、上の簡潔で要を得たさまを借りて
言えば、finallyに相当するdeferはあるのに、?演算子が無いだけでerrが2番目というルールでifを多発させる。
これはRust/Swift/HaskellのResult/Option/Either標準伴うルールとほぼ同じだが、?演算子が無いだけで
if err != nil { return nil, err }を書かなくてはならない。あるいは(panicではなく)exceptionに対する
try/catch/finallyとも言い換えることが出来る
言ってる事はその通り。goで構文上、覚える事の少なさは”非常に良い”が、上の簡潔で要を得たさまを借りて
言えば、finallyに相当するdeferはあるのに、?演算子が無いだけでerrが2番目というルールでifを多発させる。
これはRust/Swift/HaskellのResult/Option/Either標準伴うルールとほぼ同じだが、?演算子が無いだけで
if err != nil { return nil, err }を書かなくてはならない。あるいは(panicではなく)exceptionに対する
try/catch/finallyとも言い換えることが出来る
357デフォルトの名無しさん
2021/10/31(日) 17:32:36.81ID:Qz/5KmYR https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling-overview.md
このドラフトでもRustの?演算子とかが言及されてるけど、そういうのはやっぱ欲しいわ
このドラフトでもRustの?演算子とかが言及されてるけど、そういうのはやっぱ欲しいわ
358デフォルトの名無しさん
2021/10/31(日) 18:15:22.28ID:4KbMhR6u 演算子なら
∩∪⊕
あたりは欲しい
∩∪⊕
あたりは欲しい
359デフォルトの名無しさん
2021/10/31(日) 18:21:20.58ID:d0afoHzs >>355
最初に実装されたのはHaskellだがコンピュータサイエンスではもっと早く提唱されていた。NimはAdaから影響で
Haskellからも影響は当然あるが、範囲型の実装などはAdaから来ていると一般的には言われる。逆に、Rustは
機能面でHaskellのType classはフルセットでサポートしていない。traitは別の概念でType classを一部限定して
サポートしているに過ぎない。範囲型すら無いし、type c = a or cなんて出来ない、それとコンパイラ言語で
型付け面が強力では無い言語なんていまどきの言語なら珍しい、ランタイムが無くnative-compileなら尚更。
最初に実装されたのはHaskellだがコンピュータサイエンスではもっと早く提唱されていた。NimはAdaから影響で
Haskellからも影響は当然あるが、範囲型の実装などはAdaから来ていると一般的には言われる。逆に、Rustは
機能面でHaskellのType classはフルセットでサポートしていない。traitは別の概念でType classを一部限定して
サポートしているに過ぎない。範囲型すら無いし、type c = a or cなんて出来ない、それとコンパイラ言語で
型付け面が強力では無い言語なんていまどきの言語なら珍しい、ランタイムが無くnative-compileなら尚更。
360デフォルトの名無しさん
2021/10/31(日) 18:42:57.86ID:d0afoHzs Goに関して言えばユーザー定義のiteratorは何度もproposalされて撥ねられてるがいずれ入るちゃうかな?
演算子に関して言うならinや->,=== ,<>,instanceofなんていうものが世の中あるので、UTF-8/16で
関数名が書ける言語なら、uniform-func-callが出来る言語ならなおさら出来ないのはおかしかった
演算子に関して言うならinや->,=== ,<>,instanceofなんていうものが世の中あるので、UTF-8/16で
関数名が書ける言語なら、uniform-func-callが出来る言語ならなおさら出来ないのはおかしかった
361デフォルトの名無しさん
2021/10/31(日) 20:07:49.45ID:yTUS2Zye >>359
typeのorならばRustでも色んな複数の方法で様々なアレンジ付けて出来るよ
例えばi32と&strのorをそのtraitを用いてするのも可能で
trait I32OrStr {}
impl I32OrStr for i32 {}
impl I32OrStr for &str {}
fn print<T: I32OrStr + std::fmt::Display>(x: T) {
println!("{}", x);
}
fn main() {
print(100);
print("abc");
}
これでi32と&str以外の型は受け付けないprint()関数の出来上がり
あとtraitとimplの中身が{}で空なところにアレンジを書いたり
typeのorならばRustでも色んな複数の方法で様々なアレンジ付けて出来るよ
例えばi32と&strのorをそのtraitを用いてするのも可能で
trait I32OrStr {}
impl I32OrStr for i32 {}
impl I32OrStr for &str {}
fn print<T: I32OrStr + std::fmt::Display>(x: T) {
println!("{}", x);
}
fn main() {
print(100);
print("abc");
}
これでi32と&str以外の型は受け付けないprint()関数の出来上がり
あとtraitとimplの中身が{}で空なところにアレンジを書いたり
362デフォルトの名無しさん
2021/10/31(日) 20:24:12.66ID:yTUS2Zye 例えば素朴な例だけどこんな感じ?
trait I32OrStr {
fn info(&self) -> String;
}
impl I32OrStr for i32 {
fn info(&self) -> String {
format!("{} <-- i32", self)
}
}
impl I32OrStr for &str {
fn info(&self) -> String {
format!("{} <-- &str", self)
}
}
fn print<T: I32OrStr>(x: T) {
println!("{}", x.info());
}
fn main() {
print(100);
print("abc");
}
これで>>361と同じくprint()関数はi32と&strしか受け付けないけど
実行結果は>>361と異なり型毎に別表示
100 <-- i32
abc <-- &str
trait I32OrStr {
fn info(&self) -> String;
}
impl I32OrStr for i32 {
fn info(&self) -> String {
format!("{} <-- i32", self)
}
}
impl I32OrStr for &str {
fn info(&self) -> String {
format!("{} <-- &str", self)
}
}
fn print<T: I32OrStr>(x: T) {
println!("{}", x.info());
}
fn main() {
print(100);
print("abc");
}
これで>>361と同じくprint()関数はi32と&strしか受け付けないけど
実行結果は>>361と異なり型毎に別表示
100 <-- i32
abc <-- &str
363デフォルトの名無しさん
2021/10/31(日) 20:38:03.38ID:yTUS2Zye trait利用でなくもちろんenum利用で型のorも可能ですね
使い勝手が異なるのでRustでは両者を使い分け用いることが出来ます
enum I32OrStr<'a> {
I32(i32),
Str(&'a str),
}
fn print(x: I32OrStr) {
match x {
I32OrStr::I32(n) => println!("i32: {}", n),
I32OrStr::Str(s) => println!("&str: {}", s),
}
}
fn main() {
let n = I32OrStr::I32(100);
print(n);
let s = I32OrStr::Str("abc");
print(s);
}
使い勝手が異なるのでRustでは両者を使い分け用いることが出来ます
enum I32OrStr<'a> {
I32(i32),
Str(&'a str),
}
fn print(x: I32OrStr) {
match x {
I32OrStr::I32(n) => println!("i32: {}", n),
I32OrStr::Str(s) => println!("&str: {}", s),
}
}
fn main() {
let n = I32OrStr::I32(100);
print(n);
let s = I32OrStr::Str("abc");
print(s);
}
364デフォルトの名無しさん
2021/10/31(日) 22:21:09.61ID:rLjO7mCc365デフォルトの名無しさん
2021/10/31(日) 23:58:11.44ID:sAwtPlvj rustってデフォルトだと共用体みたいな形になるんだっけ?
366デフォルトの名無しさん
2021/11/01(月) 08:07:15.03ID:cuJVsFXJ だからそれはtraitでありtype classじゃないでしょ。どっちが”貧弱なおもちゃ”やねん。こんな単純な事を
表現するためにクダラナイ事を何度も何行も貼り付けるなよ。もう一つについてはTagged Unionだが、Adaも
Swift/Nim/Pythonも出来るし、”両者を使い分け用いる”なんて必要ない。そもそも単純に書こうとしたら
or表現や、Typescriptのようにtype C = A | B;部分型だし、このように表現するのが限りなく一般的で
一行でシンプルです。Rust唯一教徒の話は回りくどい上にキモ過ぎる、別にRustそのものを否定している訳じゃ
無いし、traitは他にあまり無い十分に柔軟性がある特性なんだから、奇妙な信仰的な推し方をすんな
表現するためにクダラナイ事を何度も何行も貼り付けるなよ。もう一つについてはTagged Unionだが、Adaも
Swift/Nim/Pythonも出来るし、”両者を使い分け用いる”なんて必要ない。そもそも単純に書こうとしたら
or表現や、Typescriptのようにtype C = A | B;部分型だし、このように表現するのが限りなく一般的で
一行でシンプルです。Rust唯一教徒の話は回りくどい上にキモ過ぎる、別にRustそのものを否定している訳じゃ
無いし、traitは他にあまり無い十分に柔軟性がある特性なんだから、奇妙な信仰的な推し方をすんな
367デフォルトの名無しさん
2021/11/01(月) 08:14:17.55ID:cuJVsFXJ go2もgenericsと関連して、Tagged union的なType set/Type list/Sum typeが入るはず
368デフォルトの名無しさん
2021/11/01(月) 10:40:50.02ID:GebKB2vN めっちゃ早(ry
369デフォルトの名無しさん
2021/11/01(月) 11:40:40.03ID:vX/UhvAM 趣味・嗜好は昇華して信仰になる!
実際に共用体になるのとポインタだけ入るのを同じに分類したら何でもありな気はするw
実際に共用体になるのとポインタだけ入るのを同じに分類したら何でもありな気はするw
370デフォルトの名無しさん
2021/11/01(月) 23:50:22.01ID:HKf+kmzN >>366
それは君の理解が浅く、君が間違っている。
まず、Rustのtraitはいわゆるtraitとは異なる。
つまりシェリルのtrait論文に従う他の言語のtraitとは異なっており、
複数traitでメソッドの名前衝突重複が起きたときに、メソッドの排除や名前の変更利用などのtraitが満たす条件を備えていない。
一方でRustのtraitでは重複自体は許して、メソッド呼び出しは一意性がないため許さず、関連関数呼び出しが自由に許される。
次に、Rustのtraitはいわゆる(Haskellの)type classに基本的な部分で合致している。
一番重要なところでいうと、Rustのtrait境界はHaskellのtype class制約である。
もちろん一般的なtraitにはこのような概念機能はない。
つまりRustのtraitはtraitではなくtype classであることがわかっていただけると思う。きちんと理解しているならば。
それは君の理解が浅く、君が間違っている。
まず、Rustのtraitはいわゆるtraitとは異なる。
つまりシェリルのtrait論文に従う他の言語のtraitとは異なっており、
複数traitでメソッドの名前衝突重複が起きたときに、メソッドの排除や名前の変更利用などのtraitが満たす条件を備えていない。
一方でRustのtraitでは重複自体は許して、メソッド呼び出しは一意性がないため許さず、関連関数呼び出しが自由に許される。
次に、Rustのtraitはいわゆる(Haskellの)type classに基本的な部分で合致している。
一番重要なところでいうと、Rustのtrait境界はHaskellのtype class制約である。
もちろん一般的なtraitにはこのような概念機能はない。
つまりRustのtraitはtraitではなくtype classであることがわかっていただけると思う。きちんと理解しているならば。
371デフォルトの名無しさん
2021/11/02(火) 01:20:08.88ID:Ou8VP/7A そもそもB | Cのようなad-hocな型制約をRust開発者が好まないというだけのことだと思う
関数オーバーロードもC++のテンプレート特殊化みたいなのも無いし
関数オーバーロードもC++のテンプレート特殊化みたいなのも無いし
372デフォルトの名無しさん
2021/11/02(火) 01:42:04.85ID:GkRdNW5V はあ…基地外が一生懸命調べて反論してるって感じだな、何が論文だ?気持ち悪りぃ
”一番重要なところでいうと、Rustのtrait境界はHaskellのtype class制約である”
Type classは制約だけではありません、アドホック多相を実現するための機能です。概念だけなら20年前の
Haskellから影響を受けているのは近代的な言語なら当然ですが、RustのtraitはHaskellのType classではなく
実装はSubtypingです。そもそも”貧弱なおもちゃ”に負けてるRange typeとかSum typeとか、Typescriptに
すらあるのに無い事、無理やりコードを書いて実現しようと自己弁護している事、Rustの書き手が減るような
非常に醜い弁護行為なので止めなさい
”つまりRustのtraitはtraitではなくtype classであることがわかっていただけると思う”
日本語でも、英語でも理解してますか?他の言語のtraitとは同じだと誰も主張していませんよ?そもそもこれも
因果関係が逆転しています。type classの「ほんの一部」を実現するために(rustの)traitを用いているだけです。
きちんと日本語と英語を理解しているならば、このような「間違い」は起きないはずです。それは君が理解が
難癖を付けたい基地外であり、おまえのような態度が気持ち悪い奴らRustの発展を阻害しているのです。
”一番重要なところでいうと、Rustのtrait境界はHaskellのtype class制約である”
Type classは制約だけではありません、アドホック多相を実現するための機能です。概念だけなら20年前の
Haskellから影響を受けているのは近代的な言語なら当然ですが、RustのtraitはHaskellのType classではなく
実装はSubtypingです。そもそも”貧弱なおもちゃ”に負けてるRange typeとかSum typeとか、Typescriptに
すらあるのに無い事、無理やりコードを書いて実現しようと自己弁護している事、Rustの書き手が減るような
非常に醜い弁護行為なので止めなさい
”つまりRustのtraitはtraitではなくtype classであることがわかっていただけると思う”
日本語でも、英語でも理解してますか?他の言語のtraitとは同じだと誰も主張していませんよ?そもそもこれも
因果関係が逆転しています。type classの「ほんの一部」を実現するために(rustの)traitを用いているだけです。
きちんと日本語と英語を理解しているならば、このような「間違い」は起きないはずです。それは君が理解が
難癖を付けたい基地外であり、おまえのような態度が気持ち悪い奴らRustの発展を阻害しているのです。
373デフォルトの名無しさん
2021/11/02(火) 02:02:23.69ID:AchKVKlJ374デフォルトの名無しさん
2021/11/02(火) 02:15:11.25ID:GkRdNW5V ID変えてまた自己弁護、市ね基地外
375デフォルトの名無しさん
2021/11/02(火) 07:36:44.59ID:+/VenZ/0 ようはCommon Lispみたいなマクロ使える言語が最強って事だろ?
376デフォルトの名無しさん
2021/11/02(火) 08:27:57.62ID:65SbHznP377デフォルトの名無しさん
2021/11/02(火) 08:34:53.92ID:dHCyhX6F >>375
せや、あんたが優勝や
せや、あんたが優勝や
378デフォルトの名無しさん
2021/11/02(火) 08:39:57.46ID:yi7goDxw このクズは誰も言って無い事を言い出す、「他の言語のtraitとは同じ」「Rustで実装できない」
こんなことは誰も言ってない。
おまえはさ、Rustの発展にも、会社にも、社会にも邪魔だから消えろよ?おまえみたいのは、まだ技術が
浅く新しい人が入ってくる障害だからね
こんなことは誰も言ってない。
おまえはさ、Rustの発展にも、会社にも、社会にも邪魔だから消えろよ?おまえみたいのは、まだ技術が
浅く新しい人が入ってくる障害だからね
379デフォルトの名無しさん
2021/11/02(火) 10:07:28.88ID:A2ISzYRE380デフォルトの名無しさん
2021/11/02(火) 11:09:50.76ID:cXpPn69w 人の話を聞くのは正しいことかもしれないが
つまらない話を禁止したり面白い話を強制するぐらいなら人の話を聞かない方が正しい
つまらない話を禁止したり面白い話を強制するぐらいなら人の話を聞かない方が正しい
381デフォルトの名無しさん
2021/11/02(火) 11:15:37.18ID:Svesn2Xo 両方とも気持ち悪いなと思ってたら
もう一人気持ち悪いのが出てきたww
いつもの次世代wスレ
もう一人気持ち悪いのが出てきたww
いつもの次世代wスレ
382デフォルトの名無しさん
2021/11/02(火) 11:48:12.43ID:Hfhc0VzY また違う人物のふりして出現か、傍から見てる人が「お前は」なんてイキナリ怒り心頭顔真っ赤で言うかよ。
おめーがつまんねえから
おめーがつまんねえから
383デフォルトの名無しさん
2021/11/02(火) 12:12:25.90ID:cXpPn69w C++のtemplate引数はダックタイピング
ダックタイピングは気持ち悪い
HaskellとRustは気持ち悪くない
マクロ引数の問題はtemplate引数よりも更に気持ち悪い
ダックタイピングは気持ち悪い
HaskellとRustは気持ち悪くない
マクロ引数の問題はtemplate引数よりも更に気持ち悪い
384デフォルトの名無しさん
2021/11/02(火) 12:29:54.01ID:LR6fq+wY Haskellを悪く言うやつを見たことがない
もう全部Haskellでいいよ
もう全部Haskellでいいよ
385デフォルトの名無しさん
2021/11/02(火) 13:43:18.32ID:aJCYG77w C++もね、conceptでだいぶマシになったんだけどね
そもそもどれだけの環境でC++20が使えるんだという話をされるとぐうの音も出なくなる
そもそもどれだけの環境でC++20が使えるんだという話をされるとぐうの音も出なくなる
386デフォルトの名無しさん
2021/11/02(火) 14:57:01.19ID:jqcpDrr+387デフォルトの名無しさん
2021/11/02(火) 15:36:03.35ID:px0qcy1y 3人いようが4人いようがそれ以上でも
描き込み全部気持ち悪い事実は変わらない
描き込み全部気持ち悪い事実は変わらない
388デフォルトの名無しさん
2021/11/02(火) 16:14:12.44ID:TM2Ai9P9 お前らが気持ち悪さに敏感なのは良いことだと思う
気持ち悪さの応酬をして平気なツラしてるような地獄のスレもある
気持ち悪さの応酬をして平気なツラしてるような地獄のスレもある
389デフォルトの名無しさん
2021/11/02(火) 18:13:46.42ID:4qET4FIO Nim言語にもconceptがあります。(まだexperimentalだけど)
https://nim-lang.org/docs/manual_experimental.html#concepts
conceptやtype classを使ってgenerics(c++のtemplateに相当)の引数に指定できる型を制限すれば気持ち悪さを軽減できるか思います。
けどNimのseq[T](C++のstd:::vector<T>、Rustのstd::Vec<T>に相当)のようなコンテナ型にはコピー可能な型なら何でも指定できるわけですが、こういうのが気持ち悪いと言われても指定できる型を限定すれば不便になるだけだと思うのですが。
https://nim-lang.org/docs/manual_experimental.html#concepts
conceptやtype classを使ってgenerics(c++のtemplateに相当)の引数に指定できる型を制限すれば気持ち悪さを軽減できるか思います。
けどNimのseq[T](C++のstd:::vector<T>、Rustのstd::Vec<T>に相当)のようなコンテナ型にはコピー可能な型なら何でも指定できるわけですが、こういうのが気持ち悪いと言われても指定できる型を限定すれば不便になるだけだと思うのですが。
390デフォルトの名無しさん
2021/11/02(火) 22:59:17.06ID:N6sgsEFk Nimの並列ってどうなん?何か特徴有ったりする?
391デフォルトの名無しさん
2021/11/03(水) 11:54:22.69ID:Klx8o89d ポケモンしか見つからんのですが
392デフォルトの名無しさん
2021/11/03(水) 12:42:45.74ID:JMRJWcyj キミに決め・・・られないw
393デフォルトの名無しさん
2021/11/03(水) 15:41:03.34ID:M0DzS1St 言語が気持ち悪いんじゃない
俺も含めおまいらが全員気持ち悪いんです。次世代言語と銘打ってるのにあの言語はこの機能がないからゴミだ
あの言語は(高尚な)Haskellが元だ、などなど。ポジティブな意見ではなく、ネガティブ丸出し全開なんです。
RFC for anonymous variant types, a minimal ad-hoc sum type
https://github.com/rust-lang/rfcs/pull/2587
高速ゼロコスト言語の次世代言語Rustだってこういう提案はされて、別言語の悪口なんて出てこないんです
俺も含めおまいらが全員気持ち悪いんです。次世代言語と銘打ってるのにあの言語はこの機能がないからゴミだ
あの言語は(高尚な)Haskellが元だ、などなど。ポジティブな意見ではなく、ネガティブ丸出し全開なんです。
RFC for anonymous variant types, a minimal ad-hoc sum type
https://github.com/rust-lang/rfcs/pull/2587
高速ゼロコスト言語の次世代言語Rustだってこういう提案はされて、別言語の悪口なんて出てこないんです
394デフォルトの名無しさん
2021/11/03(水) 15:54:38.31ID:JMRJWcyj ネガってるのとそのレスに極端な反応してるのは他人を基地外呼ばわりしてる1人しかいないと思うんだけどw
他の人は他言語と正確に比較してるだけで否定的な論調もなく他人の趣味・嗜好を尊重してるw
他の人は他言語と正確に比較してるだけで否定的な論調もなく他人の趣味・嗜好を尊重してるw
395デフォルトの名無しさん
2021/11/03(水) 21:11:03.58ID:Jc+nuIwU バグ報告したら不正アクセスだって言われるのと似たような現象
396デフォルトの名無しさん
2021/11/03(水) 23:58:41.87ID:UFPQir4N まあ仕事で使う上では言語の強みより弱みや落とし穴を知っとく方が価値あるわな。
どうせ選ぶ権利ない場合がほとんどだし。
その辺が学生、アマチュアなんかとの差だろうね。
どうせ選ぶ権利ない場合がほとんどだし。
その辺が学生、アマチュアなんかとの差だろうね。
397デフォルトの名無しさん
2021/11/04(木) 03:09:20.83ID:DB49gC4z >>390
Nimでは競合状態を防ぐためにスレッド毎にガーベージコレクタで管理されたヒープメモリを持っていて、
グローバル変数以外スレッド間で共有できなくなっています。
そのおかげでガーベージコレクタが効率よく動きます。
コンパイル時にスレッド間でヒープメモリを共有していないかチェックします。
詳しくはこちら
nim-lang.org/docs/manual.html#threads
Channelを使ってスレッド間でデータのやりとりができます。
nim-lang.org/docs/channels_builtin.html
試験段階ですがthreadpoolモジュールにあるParallelとSpawnを使って並列処理できます。
nim-lang.org/docs/manual_experimental.html#parallel-amp-spawn
nim-lang.org/docs/threadpool.html
Nimの標準ライブラリじゃないのですがWeaveというパフォーマンス重視なライブラリもあります。
github.com/mratsim/weave
Nimでは競合状態を防ぐためにスレッド毎にガーベージコレクタで管理されたヒープメモリを持っていて、
グローバル変数以外スレッド間で共有できなくなっています。
そのおかげでガーベージコレクタが効率よく動きます。
コンパイル時にスレッド間でヒープメモリを共有していないかチェックします。
詳しくはこちら
nim-lang.org/docs/manual.html#threads
Channelを使ってスレッド間でデータのやりとりができます。
nim-lang.org/docs/channels_builtin.html
試験段階ですがthreadpoolモジュールにあるParallelとSpawnを使って並列処理できます。
nim-lang.org/docs/manual_experimental.html#parallel-amp-spawn
nim-lang.org/docs/threadpool.html
Nimの標準ライブラリじゃないのですがWeaveというパフォーマンス重視なライブラリもあります。
github.com/mratsim/weave
398デフォルトの名無しさん
2021/11/04(木) 07:19:03.96ID:6aa/TylF >>397
スドップザワールドもスレッド単位でしか起こらんということなん?
スドップザワールドもスレッド単位でしか起こらんということなん?
399デフォルトの名無しさん
2021/11/04(木) 08:00:34.54ID:iBQltfW1 >>385
現場で使えわせてくれるのはあと2,3年はかかりそうだな
現場で使えわせてくれるのはあと2,3年はかかりそうだな
400デフォルトの名無しさん
2021/11/04(木) 08:47:03.06ID:GROwH+E9 >>398
基本的にはストップザワールドは発生しないマーク&スイープガーベージコレクタが今はデフォルト(refc)
ガーベージコレクタを選べるのでARC(rustと同じ)を選べばストップザワールドは無いが循環参照はリークする。
(これはrustも同じ)循環参照をガーベージコレクションするARC+サイクルコレクターがORCなって、ストップ
は起こらないが、少しパフォーマンスが落ちる。C系と相性の良いboehmとか、dllを作ってgoとリンクさせる
ようならストップザワールドが発生するガーベージコレクタを使用する場合がある
Multi-paradigm Memory Management Strategies(中段当たりの表)
https://nim-lang.org/docs/gc.html
基本的にはストップザワールドは発生しないマーク&スイープガーベージコレクタが今はデフォルト(refc)
ガーベージコレクタを選べるのでARC(rustと同じ)を選べばストップザワールドは無いが循環参照はリークする。
(これはrustも同じ)循環参照をガーベージコレクションするARC+サイクルコレクターがORCなって、ストップ
は起こらないが、少しパフォーマンスが落ちる。C系と相性の良いboehmとか、dllを作ってgoとリンクさせる
ようならストップザワールドが発生するガーベージコレクタを使用する場合がある
Multi-paradigm Memory Management Strategies(中段当たりの表)
https://nim-lang.org/docs/gc.html
401デフォルトの名無しさん
2021/11/04(木) 10:57:37.34ID:lAAyXHqu 何を見ても聞いてもnimには一切興味がわかない・・・
なんというか特徴がなさすぎる
なんというか特徴がなさすぎる
402デフォルトの名無しさん
2021/11/04(木) 11:41:59.42ID:vVwsjj5J Haskellとかもそうだけどオタクの中のオタクの間だけで持て囃されてる言語には近寄らない方が吉
403デフォルトの名無しさん
2021/11/04(木) 12:00:51.59ID:tx1xmHYz Rustこそ至高の言語、NimとHaskellなんて糞、GoはまあGoogleがやってるから認めるけど
言語的にはジェネリクスも無い90年代の時代遅れ
NimだとかHaskellだとか、糞気持ち悪いオタクの匂いがする。どっちもゴミ
SwiftとKotlin、そしてTypeScriptともにスマホで使う
言語的にはジェネリクスも無い90年代の時代遅れ
NimだとかHaskellだとか、糞気持ち悪いオタクの匂いがする。どっちもゴミ
SwiftとKotlin、そしてTypeScriptともにスマホで使う
404デフォルトの名無しさん
2021/11/04(木) 12:19:18.72ID:wrxqAvPZ rustはこれからjavaになるんだろ
405デフォルトの名無しさん
2021/11/04(木) 13:07:01.54ID:UnTZr4yd >>403
Nimも悪くないとは思うけど
欲しい基本がまだexperimentalなど多いのと人口の少なさ
あと競合しているRustがコンパイル通ればメモリ安全性保証してるので
結論はRustでいいじゃんとなりました
Nimも悪くないとは思うけど
欲しい基本がまだexperimentalなど多いのと人口の少なさ
あと競合しているRustがコンパイル通ればメモリ安全性保証してるので
結論はRustでいいじゃんとなりました
406デフォルトの名無しさん
2021/11/04(木) 13:17:36.87ID:fybR+JX+ Goが良いのは、関連エコシステムと、あと強いていうなら並列処理らへんぐらいかな。
プログラミング言語としてはさすがにしょぼすぎるけど、エコシステムが優れてるからなんだかんだ便利。
PythonとかJavaScriptとかはエコシステムが最強な言語の一つだよね。
逆にD言語とかはエコシステムがウンコすぎて使い物にならなかった。
プログラミング言語としてはさすがにしょぼすぎるけど、エコシステムが優れてるからなんだかんだ便利。
PythonとかJavaScriptとかはエコシステムが最強な言語の一つだよね。
逆にD言語とかはエコシステムがウンコすぎて使い物にならなかった。
407デフォルトの名無しさん
2021/11/04(木) 13:19:04.19ID:bqbD3Nhm Nimはなんか中庸って感じがする
そこにピッタリはまる人にはいいんだろうけど
もっと楽に書きたい人はGo、ちゃんと書きたい人はRustに流れてしまって
あまりユーザが増えないのではないかな
そこにピッタリはまる人にはいいんだろうけど
もっと楽に書きたい人はGo、ちゃんと書きたい人はRustに流れてしまって
あまりユーザが増えないのではないかな
408デフォルトの名無しさん
2021/11/04(木) 15:00:22.37ID:OXP1jNWB オタク臭いやつと臭くないやつの違いは一般人でもわかる
TypescriptとGoとNimの違いがわかるのは重度のオタクだけだろ
TypescriptとGoとNimの違いがわかるのは重度のオタクだけだろ
409デフォルトの名無しさん
2021/11/04(木) 15:11:34.22ID:lAAyXHqu やっぱ言語の普及には有名企業の後押しがいるんか?でもrustってなんか後押しあったっけ?
まあ案件レベルだと全然ないけどw
まあ案件レベルだと全然ないけどw
410デフォルトの名無しさん
2021/11/04(木) 15:13:41.91ID:F8fi5yeE Nim少し見てみたけどインデントか、ちょっと苦手かも
411デフォルトの名無しさん
2021/11/04(木) 15:18:21.88ID:fybR+JX+ 大企業の後押しは必須ではないだろうけど、後押しあると強い、というか、やっぱエコシステムが育ちやすいと思う。
すぐに潰されない言語だ、って思って他の企業とかも投資できるからかな。
TypeScriptが人気あるせいか、Dartはなんかイマイチ広まりきれてない感じだったけどね。
Rustは新規ミドルウェアを作るような現場では需要あるんじゃないの?
すぐに潰されない言語だ、って思って他の企業とかも投資できるからかな。
TypeScriptが人気あるせいか、Dartはなんかイマイチ広まりきれてない感じだったけどね。
Rustは新規ミドルウェアを作るような現場では需要あるんじゃないの?
412デフォルトの名無しさん
2021/11/04(木) 15:26:36.67ID:8l/Jusr1 いまRust推しの大企業といえばAmazonだな
MozillaからリストラされたRustコミッタを相当取り込んでるし
影響力が強すぎるんじゃないかと不安視されるくらい
MozillaからリストラされたRustコミッタを相当取り込んでるし
影響力が強すぎるんじゃないかと不安視されるくらい
413デフォルトの名無しさん
2021/11/04(木) 15:26:54.42ID:DB49gC4z これは他のコンパイル言語にはあまりない特徴だと思うけど、Nim言語はスクリプト言語のように使うこともできる。
Nimはコンパイル時に実行されるコードをNimに埋め込まれたvirtual machine上で実行するんだが
このVMを他の用途にも使うことができる。
コンパイルに使う設定ファイルやnimble(RustのCargoのようなもの)ファイルをNimScriptで記述できる。
nim-lang.org/docs/nims.html
github.com/nim-lang/nimble
Nimのコードを拡張子がnimsとなるようにファイルに保存してnim myscript.nimsと実行すれば
実行ファイルを生成せずに実行される。
NimScriptにはFFIが使えないとか制限があるがファイル操作や他の実行ファイルを呼ぶことができるので
shellスクリプトやバッチファイルの代わりに使うことができる。
C/C++だとプログラムにスクリプト言語を埋め込むときはPythonとかLuaを使うことが多いと思うけど
Nim言語ではNimScriptを埋め込むことが可能。
github.com/beef331/nimscripter
Nimはコンパイル時に実行されるコードをNimに埋め込まれたvirtual machine上で実行するんだが
このVMを他の用途にも使うことができる。
コンパイルに使う設定ファイルやnimble(RustのCargoのようなもの)ファイルをNimScriptで記述できる。
nim-lang.org/docs/nims.html
github.com/nim-lang/nimble
Nimのコードを拡張子がnimsとなるようにファイルに保存してnim myscript.nimsと実行すれば
実行ファイルを生成せずに実行される。
NimScriptにはFFIが使えないとか制限があるがファイル操作や他の実行ファイルを呼ぶことができるので
shellスクリプトやバッチファイルの代わりに使うことができる。
C/C++だとプログラムにスクリプト言語を埋め込むときはPythonとかLuaを使うことが多いと思うけど
Nim言語ではNimScriptを埋め込むことが可能。
github.com/beef331/nimscripter
414デフォルトの名無しさん
2021/11/04(木) 15:32:39.45ID:DB49gC4z >>410
どの言語を書く時でも基本的にはインデントするから
インデントでコードブロックを作ることによってソースコードの中に
{}とか;が頻繁にでてこないようにしたほうがソースコードがすっきりして読みやすくなると思うんだけどな。
どの言語を書く時でも基本的にはインデントするから
インデントでコードブロックを作ることによってソースコードの中に
{}とか;が頻繁にでてこないようにしたほうがソースコードがすっきりして読みやすくなると思うんだけどな。
415デフォルトの名無しさん
2021/11/04(木) 15:46:29.06ID:4stXfNK+ >>414
ルールで言うならyamlみたいなインデント or カッコの両対応がいいんだけどねぇ。そんなの無いけど。
ルールで言うならyamlみたいなインデント or カッコの両対応がいいんだけどねぇ。そんなの無いけど。
416デフォルトの名無しさん
2021/11/04(木) 15:47:23.54ID:eo9m+3ij 行頭に } って書いてあると終わった感がある
417デフォルトの名無しさん
2021/11/04(木) 15:51:50.87ID:fybR+JX+ Rubyみたいな do end もそんなに悪くなかったし、エディタのサポートがあれば慣れの問題かなあ、って気がしてしまう
418デフォルトの名無しさん
2021/11/04(木) 16:30:26.61ID:62sZMwyh419デフォルトの名無しさん
2021/11/04(木) 16:40:09.48ID:oJ9Lbupd int hoge = 1;
int hage = 2;
if ... {
hoge += 3;
hage = 4;
}
理論上は見た目とコンピューター的なパース処理を一致させる考えがPythonやNim、CoffeeScriptなどの
オフサイドルールという書き方。
上記の例でCなどから、主流で余分な空白を無視して波括弧 { と } でブロックを表すという記法が、C#や
Java、Rust、Javascriptなど。もう1つは、begin-endでブロック的なスコープを表す記法で、これは
Pascal/Delphi、Ruby、PL/SQL・TSQLなど。他は純関数言語でErlangやHaskellなどはこの限りではない。
Cなどの記法は、空白あるいはタブがどのような形でも{}が対応していて、;が1手続きの終わりであり
プログラマの好みによって、字下げ・字上げ・空白することが可能であるという利点がある。しかしながら
上のように書く人は居ない。{}の対応するかっこを上下位置で揃える古いK&R的な書き方をする人はいるが
近年のgolangのように、きっちりフォーマットする(goだとエラーになる場合もある)
Python的な見た目に拒否感が起こる人は、「空白字下げの入れ忘れがバグにつながるのでは?」と言う。
for ... :
hoge += 6
hage = 7
しかしながら、上のように書く人は存在するがあまり読みづらく、ループに入れるなら字下げすべきだし
入れないのであれば、forの終わりに1行空行を入れる。Rubyは厳密にはxxx-endだけではなく、{}も
あって意味が違うのだが長くなりすぎるので説明しない。
もう1つはIDEなどがソースコードを勝手に整形するので、スペースではない明確な表示文字で区切りたい
という人もいる。当然このようなことを言い出したらキリがないが、最終的には好みで言語を選ぶわけで
無く仕事なら無条件であり、慈悲も和解もない。
int hage = 2;
if ... {
hoge += 3;
hage = 4;
}
理論上は見た目とコンピューター的なパース処理を一致させる考えがPythonやNim、CoffeeScriptなどの
オフサイドルールという書き方。
上記の例でCなどから、主流で余分な空白を無視して波括弧 { と } でブロックを表すという記法が、C#や
Java、Rust、Javascriptなど。もう1つは、begin-endでブロック的なスコープを表す記法で、これは
Pascal/Delphi、Ruby、PL/SQL・TSQLなど。他は純関数言語でErlangやHaskellなどはこの限りではない。
Cなどの記法は、空白あるいはタブがどのような形でも{}が対応していて、;が1手続きの終わりであり
プログラマの好みによって、字下げ・字上げ・空白することが可能であるという利点がある。しかしながら
上のように書く人は居ない。{}の対応するかっこを上下位置で揃える古いK&R的な書き方をする人はいるが
近年のgolangのように、きっちりフォーマットする(goだとエラーになる場合もある)
Python的な見た目に拒否感が起こる人は、「空白字下げの入れ忘れがバグにつながるのでは?」と言う。
for ... :
hoge += 6
hage = 7
しかしながら、上のように書く人は存在するがあまり読みづらく、ループに入れるなら字下げすべきだし
入れないのであれば、forの終わりに1行空行を入れる。Rubyは厳密にはxxx-endだけではなく、{}も
あって意味が違うのだが長くなりすぎるので説明しない。
もう1つはIDEなどがソースコードを勝手に整形するので、スペースではない明確な表示文字で区切りたい
という人もいる。当然このようなことを言い出したらキリがないが、最終的には好みで言語を選ぶわけで
無く仕事なら無条件であり、慈悲も和解もない。
420デフォルトの名無しさん
2021/11/04(木) 16:51:58.52ID:F8fi5yeE >>414
インデントはフォーマッターに任せる温い環境に慣れすぎて自分でやるのは辛ぽよ
インデントはフォーマッターに任せる温い環境に慣れすぎて自分でやるのは辛ぽよ
421デフォルトの名無しさん
2021/11/04(木) 17:02:13.15ID:oJ9Lbupd そしてなぜPythonのようなCとC++の、ある意味で伝統を受け継がない物が出来たかと言えば演算子の順序で
a = b + c * dと書いた場合、c * d が優先されるのだが、ニワカは a = b + ( c * d )と書いたりする。
これをプログラマは冗長、あるいはダサいと言う風潮が出来て、「余計なカッコはカッコ悪い」となった。
ここから、whileやifに普通の丸カッコを付けない言語が多くなる。v = if true { 5 } else { 6 };
このように評価式にはtrueで、()を付けない、これが長い評価式の行になったとしても同じ
いわばカッコ言語と称される言語は、Pythonから見るとカッコ(悪い)言語になり、逆に伝統的なプログラマから
見ると、空白がブロックを左右するいい加減な言語に見える。よって又しても慈悲も和解もない
a = b + c * dと書いた場合、c * d が優先されるのだが、ニワカは a = b + ( c * d )と書いたりする。
これをプログラマは冗長、あるいはダサいと言う風潮が出来て、「余計なカッコはカッコ悪い」となった。
ここから、whileやifに普通の丸カッコを付けない言語が多くなる。v = if true { 5 } else { 6 };
このように評価式にはtrueで、()を付けない、これが長い評価式の行になったとしても同じ
いわばカッコ言語と称される言語は、Pythonから見るとカッコ(悪い)言語になり、逆に伝統的なプログラマから
見ると、空白がブロックを左右するいい加減な言語に見える。よって又しても慈悲も和解もない
422デフォルトの名無しさん
2021/11/04(木) 17:14:28.06ID:MjRPJM3Z { } な言語ばかりやってきたので
インデント言語について素朴な質問です
スコープブロックはどのように作るのですか?
例えばスコープブロック作成のために数行だけを { } の中に閉じ込めたりするのですが
インデント言語では括弧も何もなく数行だけを深くインデントするのですか?
インデント言語について素朴な質問です
スコープブロックはどのように作るのですか?
例えばスコープブロック作成のために数行だけを { } の中に閉じ込めたりするのですが
インデント言語では括弧も何もなく数行だけを深くインデントするのですか?
423デフォルトの名無しさん
2021/11/04(木) 17:15:03.57ID:DB49gC4z >>406
>>411
NimはC, C++, pythonで書かれた豊富なライブラリを簡単に使うことができるようにすることで
ライブラリの少なさを補っている。
Cのライブラリを使える言語は結構あるけどNimはバックエンドにC++コンパイラを使うこともできるので
C++で書かれたライブラリも使うことができる。
c2nimを使えばC/C++のヘッダーファイルを自動的にNimのコードに変換してくれる。
C/C++のコードを完全にNimのコードに変換できるわけではないが
NimからC/C++のコードを呼び出すのに必要なコードを出してくれる。
github.com/nim-lang/c2nim
ここにあるコードのようにimportcppプラグマを使えば
C++のstd::mapやstd::vectorのようなテンプレートクラスをNimのgenericsのように使うことも可能。
nim-lang.org/docs/manual.html#importcpp-pragma-importcpp-for-objects
NimからPythonの関数を読んだりNimでPythonモジュールを作れるようにするライブラリ
github.com/yglukhov/nimpy
Nimのコードをマクロを使ってコンパイル時にGLSLのコードに変換するライブラリ
github.com/treeform/shady
>>411
NimはC, C++, pythonで書かれた豊富なライブラリを簡単に使うことができるようにすることで
ライブラリの少なさを補っている。
Cのライブラリを使える言語は結構あるけどNimはバックエンドにC++コンパイラを使うこともできるので
C++で書かれたライブラリも使うことができる。
c2nimを使えばC/C++のヘッダーファイルを自動的にNimのコードに変換してくれる。
C/C++のコードを完全にNimのコードに変換できるわけではないが
NimからC/C++のコードを呼び出すのに必要なコードを出してくれる。
github.com/nim-lang/c2nim
ここにあるコードのようにimportcppプラグマを使えば
C++のstd::mapやstd::vectorのようなテンプレートクラスをNimのgenericsのように使うことも可能。
nim-lang.org/docs/manual.html#importcpp-pragma-importcpp-for-objects
NimからPythonの関数を読んだりNimでPythonモジュールを作れるようにするライブラリ
github.com/yglukhov/nimpy
Nimのコードをマクロを使ってコンパイル時にGLSLのコードに変換するライブラリ
github.com/treeform/shady
424デフォルトの名無しさん
2021/11/04(木) 17:36:48.75ID:d2BeURFt >>422
Pythonだと、PEP340という、Anonymous Block Statementsの提案がなされていたが
block expr as x: # expr as x はおそらく省略できる
...
このように書ける提案だったがリジェクトされて、PEP343となりwithブロックになった。
with open(path) as f:
...
ほかの言語だとこのblockという無名または名前付きのスコープが作れるものが多いと思う
block "A sealed": # 文字列は名前で省略できる
...
そうはいっても、以下のようにすればブロックは勝手にできるあまり意味はない。どこかでBLOCK = true
if BLOCK:
...
Pythonだと、PEP340という、Anonymous Block Statementsの提案がなされていたが
block expr as x: # expr as x はおそらく省略できる
...
このように書ける提案だったがリジェクトされて、PEP343となりwithブロックになった。
with open(path) as f:
...
ほかの言語だとこのblockという無名または名前付きのスコープが作れるものが多いと思う
block "A sealed": # 文字列は名前で省略できる
...
そうはいっても、以下のようにすればブロックは勝手にできるあまり意味はない。どこかでBLOCK = true
if BLOCK:
...
425デフォルトの名無しさん
2021/11/04(木) 17:40:02.16ID:d2BeURFt 他にもlabel(?だったか)として名前付きのものもあったな、これは、多重のforなどのbreakで名前が指定できる
426デフォルトの名無しさん
2021/11/04(木) 17:40:29.24ID:lAAyXHqu bindingはどの言語でもあるし簡単に作れるよ
ただ純正コードで書くのと同じくらい適切に運用させるのが困難な場合が多いので、誰もそれが簡単だとは言わない
個人的には正直nimアピールいらんw 何か書かれる度にどんどんnimから離れて行きたくなるw
ただ純正コードで書くのと同じくらい適切に運用させるのが困難な場合が多いので、誰もそれが簡単だとは言わない
個人的には正直nimアピールいらんw 何か書かれる度にどんどんnimから離れて行きたくなるw
427デフォルトの名無しさん
2021/11/04(木) 17:40:46.86ID:DB49gC4z >>422
Nimではblock文/block式というのがあります。
nim-lang.org/docs/manual.html#statements-and-expressions-block-statement
nim-lang.org/docs/manual.html#statements-and-expressions-block-expression
変数aはblock:の下のインデントされたブロッグ内のスコープ内でのみ使えます。
block:
let a = 1
echo a
こんな感じでblockに名前を付けてbreak文を使っていっきにblockから抜けることもできます。
var found = false
block myblock:
for i in 0..3:
for j in 0..3:
if a[j][i] == 7:
found = true
break myblock #forループの上にあるmyblockから抜ける。
echo found
block式を使うとblock文と同じように新しいスコープを作りますがblock内の最後の式がblock式の値になります。
let a = block:
var fib = @[0, 1]
for i in 0..10:
fib.add fib[^1] + fib[^2]
fib # fibの値がこのblock式の値になってaに代入される。
echo a # @[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] が出力される
Nimではblock文/block式というのがあります。
nim-lang.org/docs/manual.html#statements-and-expressions-block-statement
nim-lang.org/docs/manual.html#statements-and-expressions-block-expression
変数aはblock:の下のインデントされたブロッグ内のスコープ内でのみ使えます。
block:
let a = 1
echo a
こんな感じでblockに名前を付けてbreak文を使っていっきにblockから抜けることもできます。
var found = false
block myblock:
for i in 0..3:
for j in 0..3:
if a[j][i] == 7:
found = true
break myblock #forループの上にあるmyblockから抜ける。
echo found
block式を使うとblock文と同じように新しいスコープを作りますがblock内の最後の式がblock式の値になります。
let a = block:
var fib = @[0, 1]
for i in 0..10:
fib.add fib[^1] + fib[^2]
fib # fibの値がこのblock式の値になってaに代入される。
echo a # @[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] が出力される
428デフォルトの名無しさん
2021/11/04(木) 17:44:36.59ID:fybR+JX+ nimアピールすごいな。
宣伝したいならQiitaとかでいっぱい記事書いたほうがいいんじゃないかな・・・。
宣伝したいならQiitaとかでいっぱい記事書いたほうがいいんじゃないかな・・・。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 [蚤の市★]
- 【速報】気象庁は津波注意報すべて解除 [蚤の市★]
- 【サッカー】58歳カズ「オファーが来ている」 J3福島と近日中にも交渉 早ければ年内にも決断 [征夷大将軍★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 働いて参ります
- ( ・᷄ὢ・᷅ )あ?
- 地震
- こんぺこ!こんぺこ!こんぺこ!🐰🏡
- 早大名誉教授「高市内閣の高支持率はデータ操作か、支持している日本人がアホなのか」👈核心を突いてしまう [868050967]
- ブタをぶったたく
