日暮途遠(Linux)

Just another WordPress.com site

リストの内容を書き換えるsetf関数

leave a comment »

Emacs Lisp基礎文法最速マスター – (rubikitch loves (Emacs Ruby CUI Books))参考

リスト

Lispにも配列はあるものの、リストの方が基本的なのでリストを。

リストはlist関数を使う。リテラルをリストするには「'(要素 …)」でもよい。

(setq ary ‘(100 200 300)) ; => (100 200 300)

(setq ary (list 100 200 300)) ; => (100 200 300)

要素の参照と代入

(setq ary (list 100 200 300))

;; 最初の要素を参照するにはcarかfirst関数を使う。

(setq a (car ary)) ; => 100

(setq a (first ary)) ; => 100

;; nthかelt関数を使うと任意の要素を取り出せる

(setq a (nth 0 ary)) ; => 100

(setq a (elt ary 0)) ; => 100

(setq b (nth 1 ary)) ; => 200

;; リストを書き換えるにはsetfとnthを併用する

(require ‘cl)

(setf (nth 0 ary) 1) ; => 1

(setf (nth 1 ary) 2) ; => 2

;; 確かに書き変わっている。

ary ; => (1 2 300)

要素の個数

リストの要素にもlength関数が使える。

(length ary) ; => 3

リストの操作

(setq ary (list 1 2 3)) ; => (1 2 3)

;; 先頭を取り出すにはpopマクロを使う

(require ‘cl)

(pop ary) ; => 1

ary ; => (2 3)

;; 先頭に追加するにはpushマクロを使う

(push 5 ary) ; => (5 2 3)

;; 末尾を取り出す(非破壊的)

;; データ構造上、リストでは末尾を取り出すことは稀。

(last ary) ; => (3)

(car (last ary)) ; => 3

ary ; => (5 2 3)

;; 末尾に追加するにはリスト化してappendする

(setq ary (list 5 2)) ; => (5 2)

(append ary (list 9)) ; => (5 2 9)

setqはEmacs-Lispで最も基本的な関数で変数に値をセットするものですが、setfというのは、初めて見るもので思わず調べてしまいました。複雑なリスト操作をすることはないと思いますが、setfというのはsetqと紛らわしく気になる関数なので、メモしておきました。

Written by 廣野秀樹

2012年6月11日 @ 12:17 午前

カテゴリー: Emacs-Lisp

コメントを残す