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:マクロがプログラムを書いてくれるって程度しかわからない