2015-07-03-01-ずっと悩んでいたこと - project-enigma

2015-07-03-01-ずっと悩んでいたこと

>> Site top >> weblog >> 月別アーカイブ >> 2015年07月のlog >> 2015-07-03-01-ずっと悩んでいたこと

最終更新日付:2015/07/03 23:51:49


ずっと悩んでいたこと

2015 年 07 月 03 日

ずっと以前から、通らないテストコードがあって困っていた。困っているというのは、理由がわからなかったからだ。今回、これまた定かでない経緯でもって解決したので記録しておこうと思った次第。

実際のテストコードとはかなり違うのだけれど、やっていることとその結果はおおむね以下のようなモノだ。

(let ((arr #(10 11 12 13 14 15)))
  (with-operators
      (let* ((ptr &arr[3])
             (ret (setf *ptr 93)))
        (format t "arr          => ~A~%" arr)
        (format t "(aref arr 3) => ~A~%" (aref arr 3))
        (format t "ret          => ~A~%" ret))))

arr          => #(10 11 12 93 14 15)
(aref arr 3) => 13
ret          => 93

 

配列 arr の4番目の要素を指すポインタを取得して、それを経由して値を 13 から 93 に書き換えている。結果を確認するために3つの format 関数を使っているが、2つめの結果がおかしい。配列全体の出力では #(10 11 12 93 14 15) と表示されているのに、(aref arr 3) は 13 と出力されるのだ。

正直、この挙動とその理由は自分には見当もつかなかった。しかし今日、ふと「ハードコーディングされた配列を書き換えようとしているからイケないのでは?」と思ったのだ。なぜそう思ったのかはわからない。とにかくそう思った。で、以下のようにしてみたのだ。そしたら期待している動作をするようになった。

(let ((arr (make-array 6 :initial-contents '(10 11 12 13 14 15))))
  (with-operators
      (let* ((ptr &arr[3])
             (ret (setf *ptr 93)))
        (format t "arr          => ~A~%" arr)
        (format t "(aref arr 3) => ~A~%" (aref arr 3))
        (format t "ret          => ~A~%" ret))))

arr          => #(10 11 12 93 14 15)
(aref arr 3) => 93
ret          => 93

 

おそらく、ハードコードされたシーケンスを書き換えるのはダメなんだろう。それを根拠として (aref arr 3) のような表現は畳み込まれてしまうということだろうか。このあたりのことは、もういちど勉強しなおしだな。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : Common Lisp

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.