はとのーと

エジソンノート(アイデア、思い付き、メモ)として使っています。誰かの役に立つかもしれないので公開しています。

メモ 2021-12

2021-12-09

Vimでインデントをタブではなくスペース4つにする方法

Vim内で以下を実行する。

:set tabstop=4
:set autoindent
:set expandtab
:set shiftwidth=4

または ~/.vimrc に以下を記入する。

set tabstop=4
set autoindent
set expandtab
set shiftwidth=4

設定を変えた後、すでに書かれている行を再インデントするには:

  • 特定の行だけ再インデント
    1. Shift+V で行選択モードにする
    2. カーソルを移動して行を選択する
    3. = を入力する
  • 全体を再インデント
    • gg=G を入力する

2021-12-18

bit誌のVol. No. 通巻の関係
  • Vol: 創刊年1969を1とする年数
    • Vol = Year - 1968
  • No: 発行月
  • 通巻Issue = (Year - 1969) * 12 + (No - 2)

たとえば1996年4月号はVol.28、通巻326になる。

  • Year = 1996, No = 4
  • Vol = 1996 - 1968 = 28
  • Issue = (1996 - 1969) * 12 + (4 - 2) = 326

2021-12-27

Schemeのアクタ機能

bit 1996年4月号の記事『Scheme 現在・過去・未来』には次のようなことが書かれていた。

  • Carl HewittはロボットやAIのプログラミング用言語としてPlannerの次にPlasmaを作った
  • Plasmaではアクタがメッセージを送り合う
  • Gerry SussmanとGuy L.Steele JrはPlasmaを理解するためにLispインタプリタを作成した
  • アクタとメッセージ送信機能を持ったLispであるSchemeが完成

記事によるとSchemeのアクタは次のように記述・動作するらしい。

  • (alpha (引数 ...) (本体)) でアクタを作成する
  • send は他のアクタにメッセージを送る
  • send には2つの書式がある
    • 書式1: (send アクタ メッセージ)
    • 書式2: (send 演算子 引数 ... アクタ)
      • 書式2は演算結果をメッセージとしてアクタに送る
  • アクタはメッセージが届くまで動作しない
  • アクタは値を返さない

記事にあったアクタによる階乗計算のコード:

(define actorial        --- (1)
  (alpha (n c)
    (send = n 0         --- (2)
      (alpha (p)
        (if p           --- (3)
          (send c 1)    --- (3)
          (send - n 1   --- (3)
            (alpha (m)
              (send actorial m      --- (4)
                (alpha (z)          --- (4)
                  (send * n z c)))  --- (4)
)))))))
  1. 最初の definealpha(n c) で値 n とアクタ c (このアクタに結果が送られる) を引数として受け取る
  2. 次の (send = n 0 (alpha〜))n が0かどうかの結果をアクタ (alpha 〜) に渡す
  3. n=0が真ならば呼び出し元 c にメッセージ1を送り、偽ならば n を1減算した値を後続のアクタに渡す
  4. actorial再帰的にメッセージを送り、受け取った結果と n を掛けて呼び出し元のアクタにメッセージとして送る