popとpush

RubyのArrayにも,Common Lispにも,popやpushってありますよね.で,ちょっと使い方が違うので,これはなんだか面白いのでメモっておきます.

Rubyだと

RubyのArrayのpop,pushの挙動はこんな感じ.

>> arr = [1, 2, 3]
[1, 2, 3]
>> arr.pop
3
>> arr
[1, 2]
>> arr.push(4)
[1, 2, 4]

Common Lispだと

Common Lispのpop,pushの挙動はこんな感じ.

> (setf lst (list 1 2 3))
(1 2 3)
> (pop lst)
1
> lst
(2 3)
> (push 4 lst)
(4 2 3)

結局,逆になるんですよね.pop,pushはCommon Lispでよく使われるマクロなんだそうで,このように定義できるんだそうです.

;; pop
(let ((x (car lst)))
  (setf lst (cdr lst))
  x)
  
;; push
(setf lst (cons obj lst))

ただ,これはあくまでも関数ではなく,マクロ.これをそのままdefunとしても,思い通りには動いてくれません.ただ,まだマクロとは何ぞやがわかってない*1のでボクには何ともできない.

*1:マクロがプログラムを書いてくれるって程度しかわからない