なんか考えてることとか

変な人が主にプログラミング関連で考えていることをまとめる。

プログラミング

あなたが誤解しているRustの「安全」について

2025/2/6 動作がわかりやすいようにほぼすべてのコードに標準出力を追加 最近(2025/1/18現在)、チェスプログラムの評価を通して、Rustをボロクソに叩いた記事がZennに投稿された。 zenn.dev Rustはデバックモードでのスタックサイズが限られていて、これが非…

C言語で定数に型を付ける方法

現在デファクトスタンダードとなっているC99において、定数を定義する方法として、マクロ定義を用いる方法と、enumによる列挙定数を用いる方法がある。 しかし、マクロ定数はあくまで「コードの展開」という機能でしかなく、マクロ定義そのものには型がない。…

文字列結合に(+)演算子を使うことへの違和感の正体

私はソフトウェア開発をしていて、ずっと違和感があったところがある。それが一部の言語で見られる文字列結合演算子(+)である。 今回は、この違和感について、正体がわかってきたので書いていくことにする。

PureScriptに入門した

仕事柄、Webアプリケーション開発に携わることはあまりないが、JavaScript(以下JS)で辛い思いするのはもう嫌になったので次携わることになったときのために、JSを改善したAltJSやフロントエンドフレームワークを使えるようにしておこうと思い、PureScript(以…

HaskellのIOアクションが副作用を持たず、参照透過であることをようやく納得できた話

今回は、HaskellのIOアクションについて、ようやく納得できたので書いていく。

「Python滅ぼす協会に入会したい」にマサカリを投げる協会に入会したい

バカの山

オフサイドルール言語が批判される意味がわからない

ブロック単位で字下げを行う、もしくはフォーマッタをかける初心者でない人がオフサイドルールでないプログラミング言語を使わない、というのは、良いとして、初心者向けにもお勧めしないことが理解できない。俺個人としては、初心者にこそオフサイドルール…

C言語のStrict aliasing rulesについて極力わかりやすく書きたい

C, C++の標準規格に存在するStrict aliasing rules。これについて、プロでもなかなか理解されにくい(現状、自分でも理解できているかどうか怪しい)ので、極力わかりやすく書いていきたいと思う。

「行数の少ないコード」信仰者による、非常に読みやすいプログラムの書き方

注意 この記事は私怨や戒めを込めたネタ記事です。こんな記事を真に受けず、マサカリは投げないようお願いいたします。 もっと読みにくく、イラつかせるアイデアは大歓迎です。

JavaScriptのNumber型におけるbit演算は悪である

⚠注意⚠今回の記事は「特に」個人の感想色が強く、JavaScript好きにとって不快になる要素が含まれているかもしれません おそらく手続き型言語であれば必ずと言って良いほど存在するbit演算。今回はJavaScript(以下JS)のNumber型におけるbit演算は自分が今ま…

Python 3.11で末尾再帰が書けるようになる

2022/10/28 factorial関数の定義に誤りがあったので修正 3.10以前のPythonでは、再帰関数に対して「末尾呼び出し最適化」など何も対策をしていないために、普通に再帰関数を定義すると、問題が発生してしまっていた。しかしPython 3.11でその問題が解消され…

Rustにおいてbreakやreturnを含む式はどの型であっても良い

2022/8/27 演習問題の(3)で提示されているコードが間違っていたので修正 Rustaceanなら周知の事実であるが、Rustは基本式指向の言語である。そのため、すべてのブロックは式として扱われる。そしてとにかく型に厳しいことでも知られる(型に厳しいと言うより…

「型システム入門」第4章の実装をRustでやってみた

型システム入門 プログラミング言語と型の理論作者:BenjaminC.Pierce,住井英二郎オーム社Amazon「型システム入門 −プログラミング言語と型の理論−」(以下TaPL)は、型システムを理解するうえで必要な基礎知識を学ぶことができる、文字通り…

void型の関数は「値を返さない」のではない

void型とはほとんどの場合において「値がないこと」を示す特別な型である。このとき、関数の戻り値の型としてvoid型を指定したときに「値を返さない」と説明する人をしばしば見かける。 これは解釈次第では間違いではないのだが、「誤解が生じやすい説明」で…

Rustのクロージャは厳密にはクロージャではない

前々から思っていたのだが、Rustのクロージャという「名前」には違和感があった。なぜなら、クロージャと言うのは本来ただの関数のことを示すわけではないからだ。だがクロージャについて調べてみて、改めて「Rustのクロージャは厳密にはクロージャではない…

「Rustのトレイトは『高カインド多相のない型クラス』である」のブコメ返信とか

これは「Rustのトレイトは『高カインド多相のない型クラス』である」のブコメに対する返信をする記事です。気になったコメントがあれば随時追加していきます。 opaupafz2.hatenablog.com

JavaScriptでC共用体を表現してみる(実は、リベンジ)。

2022/8/5 「参照渡し」の誤用があったのですべて修正 その記事は(ブログごと)消していてもうないのだが、実は筆者は過去、JavaScript(以下JSと呼ぶ)でCの共用体について説明しよう、という記事を書こうとしたことがある。しかし、複数の変数がメモリを共…

Rustのトレイトは「高カインド多相のない型クラス」である

Rustのトレイト(以降Rustトレイトとつなげて呼ぶことにする)は一体何なのか、様々な他言語の概念を通して調べていたが、やっと(「やはり」でもあるのだが)結論が出たので書いていこうと思う。 また、Rustトレイトはインターフェースなのか、MixInなのか…

インターフェース、MixIn、トレイトについて

近年、MixInやトレイトという名称の概念を持つプログラミング言語が増えてきた、が、蓋を開けてみると、実際にはそれはMixInでなかったり、トレイトではなかったりすることが多くあり、MixInやトレイトに関する混乱を招く要因になっていると思う。そこで今回…

モナド初心者が解く、モナドのあらゆる誤解

2022/5/21 関数適用の表現、その他稚拙な表現を修正。最近、プログラミングにおけるモナドについて調べていて、モナドと言うものがどんなものなのか掴み始めてきて、ある程度これが誤解なのかそうでないのか見分けられるようになってきたので、モナドのよく…

モナド則からJavaScriptのPromiseがモナドであることを確かめてみた

2022/1/13 型コンストラクタを「抽象型」としていたのを「多相型」に修正しました最近になって、プログラミングにおけるモナドには「モナド則」という規則があることを知り、これを使えばこれまた最近聞いた「JavaScriptのPromiseはモナドである」というのが…

代数的データ型を論理回路で理解する記事

前回をより理解しやすくするための補足記事的なもの。 opaupafz2.hatenablog.com今回、「代数的データ型」について、自分なりの解釈を述べていこうと思う。これによって前回の記事で自分が何を言いたかったのかより理解を深めていただければ幸いである。 注…

直和型を「C言語の共用体に相当する」と説明するのは、もはや誤解を生むだけである

関数型プログラミングを学ぶ際に登場することのある単語として「代数的データ型」というものがあり、直和型はこの代数的データ型の一種である。代数的データ型において、「列挙型はCの列挙体(enum)、直積型はCの構造体(struct)に相当する」という説明に…

PHPで始めるプロトタイプベースOOP (後編)

前編からの続き。 opaupafz2.hatenablog.com前作: Pythonで始めるプロトタイプベースOOP opaupafz2.hatenablog.com opaupafz2.hatenablog.com

PHPで始めるプロトタイプベースOOP (前編)

前作: Pythonで始めるプロトタイプベースOOP opaupafz2.hatenablog.com opaupafz2.hatenablog.com

PHPでバイナリを扱う方法

PHPは90年発のプログラミング言語にしては、バイナリを扱う方法に乏しく、思ったようにバイナリを扱えないことが多い。バイナリを扱った事例も少ないためか、バイナリを扱うためのイディオム的な物もなかなか見つからない。そこで、PHPでバイナリを極力効率…

数字を含む文字列を安易に比較してはいけないという話

早速ですが、問題です。"9"と"10"、比較するとどちらが大きいでしょうか?ソートする際に文字列を比較することがある。その際、文字列に数字が含まれている場合、自分の思った通りに動かないことがあると言うことを今回書かせていただこうと思う。

Pythonで始めるプロトタイプベースOOP(2): より快適にする実装法

opaupafz2.hatenablog.com前に、Pythonではクラスオブジェクトを扱うことで、プロトタイプベースなオブジェクト指向プログラミング(以下OOP)が可能であることを書いた。今回はその続編として、より快適にPythonでプロトタイプベースOOPが可能となるような…

Haskellで再帰を心置きなく書いて良い理由(補足編)

2022/9/18 「サンク」周りの怪しい言い回しを修正 opaupafz2.hatenablog.com前回、スタックメモリの観点からもHaskellで再帰をしても良いと言う理由と再帰を書く際に気を付けなければならないことについて書いた。今回は、その補足として「末尾再帰で書かざ…

Haskellで再帰を心置きなく書いて良い理由

2022/9/18 「末尾再帰最適化」を「末尾呼び出し最適化」に修正 「サンク」関連の怪しい言い回しを修正 その他微妙な表現を修正 Haskellのような純粋関数型プログラミング言語では基本破壊的代入が許されていないために、ループするための構文、または式が用…