なんか考えてることとか

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

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

opaupafz2.hatenablog.com

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

続きを読む

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

  • 2022/9/18 「サンク」周りの怪しい言い回しを修正

opaupafz2.hatenablog.com

前回、スタックメモリの観点からもHaskell再帰をしても良いと言う理由と再帰を書く際に気を付けなければならないことについて書いた。

今回は、その補足として「末尾再帰で書かざるを得ない状況」について書いていこうと思う。

続きを読む

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

  • 2022/9/18
    • 「末尾再帰最適化」を「末尾呼び出し最適化」に修正
    • 「サンク」関連の怪しい言い回しを修正
    • その他微妙な表現を修正

Haskellのような純粋関数型プログラミング言語では基本破壊的代入が許されていないために、ループするための構文、または式が用意されていない。そのために、再帰を使ってループを表現する、というのが一般的となっている。

しかし、手続き型言語に慣れたプログラマからすれば、それはとても不安になることでもある。今回、なぜ不安になるのかどうかについて解説するとともに、なぜHaskellでは再帰を用いても問題ないのか書いていこうと思う。

続きを読む

なぜC言語のポインタは難しいと言われるのか

  • 2021/09/04 最後に補足を追加
  • 2021/09/05 「補足」項にて、ローカル文字列の注意点を追記

Cを学ぶにあたってよくぶち当たる壁と言われているのがポインタである。

なぜポインタは難しいと言われるのか?今回はそもそもポインタとは何なのかを交えてわかりやすくなるように努めて解説していこうと思う。

続きを読む

プログラミング言語であることの簡単な証明方法

  • 2021/08/12
    • Brainf*ckインタプリタのコードにミスを見つけたので修正
    • Brainf*ckはスタック指向ではないため「Brainf*ckはスタック指向である」旨の記述を削除

※注意※
今回の記事は人によって考えが異なる可能性のある内容が含まれています!
したがって今回の記事はあなたの納得できる内容であるとは限らないことを前もって言っておきます。

続きを読む

コピーセマンティクスとムーブセマンティクス

  • 2021/07/18
    • Rustのムーブによるエラーの解決策に参照を使った方法を追加
    • シャローコピーが採用されているプログラミング言語の例を記述
  • 2022/07/10
    • シャローコピーの認識が大きく異なっていたので修正
    • シャローコピーの例のJavaScriptコードをより見やすいものに変更
    • 「シャローコピー」項の変更に伴い「ディープコピー」項の冒頭を変更

個人的に代入演算子=は甘く見ていると、自分の思っていた挙動とは違っていたために痛い目を見てしまうことが多いと思う。というのも、代入演算子=プログラミング言語によってさまざまな意味を持つためだ。

今回は、代入演算子=の挙動を理解する基本的なセマンティクスとしてコピーセマンティクスとムーブセマンティクスについて解説していこうと思う。

続きを読む

C言語でオブジェクト指向プログラミング

  • 2021/07/04
    • 載せたコードにミスがあったので修正
    • 「サブクラス」、「スーパークラス」を「派生クラス」、「基底クラス」に統一
  • 2022/08/05
    • 「参照渡し」の誤用があったので修正

前にRustはオブジェクト指向型言語ではないという記事を書いた後で、Twitterで以下のような発言をしていた。

今回はこれを有言実行しようと思う。

続きを読む