第167回 素人くさいSICP読書会(at 月島某所)

  • 会場提供&コーラ&お菓子ありがとうございました
  • 参加者は弾さんを入れて7人と近年まれに見る盛況
  • Mac6台+マシンなし1人。すなわちMac率100%
  • 問題5.10
  • すでに必要十分な命令があるのに新命令を考えなきゃならないということでみんな悩んでた
  • 自分は前回の帰り道に思いついたswapを書いてみた
;; (swap reg1 reg2)

(define (make-swap inst machine pc)
  (let ((reg1
         (get-register machine (cadr inst)))
        (reg2
         (get-register machine (caddr inst))))
    (let ((value1
           (lambda () (get-contents reg1)))
          (value2
           (lambda () (get-contents reg2))))
      (lambda ()
        (set-contents! reg1 (value2))
        (set-contents! reg2 (value1))
        (advance-pc pc)))))
  • 最初、get-contentsをlambdaで囲むのを忘れてた。hisaさんに指摘されて修正。むき出しだと初期状態のmachineでレジスタの値を読み出そうとしてしまう
  • swapは意外に好評でちょっとうれしい
  • ググったらARMにSWAP命令があった。メモリーレジスタの間で値を交換するらしい
  • 「XORを3回使えば一時変数なしで値を交換できる」(弾さん)。XOR交換アルゴリズム。同じ値を交換しようとするとゼロになってしまうのが欠点
  • 参加者6人で久しぶりにもんじゃ