プログラミング言語で文字列結合に「+」を使うの、数学的な加算演算子と言うより、「Fediverseは "federation" + "universe" のかばん語です」みたいな説明に使われる散文的表現由来なのでは? という感想(​:bt:​記事の根本からひっくり返しにかかるツッコミ)
とはいえ数値型と文字列型が混在するプログラムコードにおいて、表記が似すぎていてややこしいのはそれはそう
VBの & 演算子とかはその解決のひとつだけど、これはこれで他の言語だと別の意味を持つ演算子だからまたややこしい

フォロー

反論ってわけじゃないですけど、(&)がVBにおいてはbit AND演算として用いられない(一意的な演算子)であればまだ良いんですが、(話がこんがらがりそうなので、スレッドを分けます)
QT: fedibird.com/@the_kwa/11249673
[参照]

くゎ  
プログラミング言語で文字列結合に「+」を使うの、数学的な加算演算子と言うより、「Fediverseは "federation" + "universe" のかばん語です」みたいな説明に使われる散文的表現由来なのでは? という感想(​:bt:​記事の根本からひっくり返しにかかるツッコミ) とはい...

自分が特に問題に感じているのは、(+)に意味を2つ持たせるようなところが問題だと感じていて、型エラーになるとかなら、まだマシなのですが、JavaScript/TypeScript等は、数値を勝手に文字列に変換しちゃって、それがバグのもとになりやすいのですよね・・・っていうお気持ちで書きました

大昔に :x_twitter: で似たようなことを書いたら、「文字列はSemigroup(この記事における半群)だから、(+)は加法と同じと見なせる!だからお前はおかしい!(意訳)」とか言われたので、「そこまで言うなら、本当に俺が言っていることが数学的におかしいのか証明してやろうじゃないの」っていう感じで書いた次第であります

@opaupafz2 完全に横道ではありますが、VBの&演算子については心配ありません。
VBでの&は文字列同士のみに定義されていて、それどころか前後の型を文字列に拡大変換しようとするぐらい文字列志向の演算子です。
つまり、&を使った場合、くっつけた文字列が返るか、ダメなら型変換エラーになります。
ちなみに、VBのbit演算は「And」演算子です。「And」演算子にはBoolean演算のパターンもありますが、今ではBooleanには「AndAlso」演算子を使うのが主流ですから、気にすることはないでしょう。

……と、ここまで書いた上でアレなんですが、現在のVBには演算子のオーバーロードがあるため、演算子前後の型を完全に把握していない限り、そのコードから何が起こるかは結局確定できなかったりします(台無し)

@the_kwa まったく別の使い道をするような演算子オーバーロードをする人が、いるとは思いたくないですね・・・(趣味ならまだしも、実用とかで使われたら・・・ :blobcatscared: )

たとえばC++やPythonのように型エラーになるなら演算子オーバーロードとかはまだ良いんですけど、中には、片方の型が異なると、暗黙で型変換をしちゃうような言語があるんですよ・・・

(ちなみに余談ですが、演算子オーバーロードの例で言うと、C++の(<<)、(>>)も主観ですが、かなり変なオーバーロードをしていると思います(公式))

@opaupafz2 おそらくJavaやらそのあたりのことを念頭においてのことだと思うのですけど、あの文字列型に合わせていく挙動、個人的にはいうほど違和感ないのですよね。
数値を起点に考えるとWhy!?!?!??!?になるのも理解できるのですが、「Stringクラスに【数値型との間での拡大変換&演算子オーバーロード】が定義されている」と考えるとめちゃくちゃ素直な挙動なのですよ。

@the_kwa 結局のところ、演算子を別々にしたうえで型変換するならわかるのですが、オーバーロードをしたうえであのような挙動になっているのが、まぁ最終的には主観になってしまうんですが、自分にマッチしていないんですよ。
あと経験上、暗黙型変換に頼ったコードはバグの原因になりやすいので、できれば型エラーになってほしいなぁというのが個人的なところです

@the_kwa どちらかと言えば、あの記事は「文字列は半群だから文字列結合を加法と見なすのは正しい!よってお前はおかしい」とか大昔に言われたのをきっかけに書いた記事なので、私自身は、(+)演算子を文字列結合として定義してしまったもんはしょうがないよなぁとは感じております。

それに、今では、変数展開を用いて表現する方法があり、それが文字列結合と比べて可読性を落とすとはとても考えられないので、昨今のプログラミング言語でそれをわざわざ使う必要はないよねっていうのもあります。(+)しかないならそれはしょうがないのですが

@opaupafz2 あ、はい、さんざん引っ掻き回した上で言うのもあれですが、記事に関しては承知しております……(なのでBTしたのちリンクも参照もなしに空リプしてました)

変数展開を用いて云々に関しては、もう完全にまっさらな新しい言語でも作らない限りどうしようもなくてしょうがないところですね……。理想ばかりを謳って目の前にある古いコードが動かないような処理系などなんの役にも立ちませんし……。

@opaupafz2 そうですねぇ、究極的には好みの問題、極端に言えばそれこそ"宗教"的な話になってくると思います。演算子オーバーロードや暗黙の型変換をどこまで認めるかのラインは難しいですよね。
もっとも、JavaScriptのほうは型変換の問題というより、変数そのものには静的な型がないし決めようがない言語仕様の限界という感じがしますが…… :blobcat_daradara:

@the_kwa この辺りは、実行時に行われる動的検査が、どこまでサポートしてくれるか、というところにあると思います。同じ動的型付けでも、Pythonは動的検査時に型もチェックしてくれますが、JSはnull・undefinedであるか、そうでないか、ぐらいしかチェックしてくれません。それ故に、AltJSに乗り換えようって人がちらほらと・・・

@opaupafz2 その検査の話も、結局は互換性問題が理由でどうしようもないんですよね……。検査を厳しくしてしまえば「この目の前にある古いコード」が動かなくなりえますから。
だもんで、静的検査とトランスパイル時に解決できる問題は事前に片付けておこうというAltJSに流れるのもやむ無しですよね。難しい話です。

ログインして会話に参加
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。