by shigemk2

当面は技術的なことしか書かない

2012-04-20から1日間の記事一覧

汎変数

setqでは代入値左辺(リストのcar)の書き換えは出来ないが、 この汎変数を書き換えるにはsetqではなくsetfを使う。 ;; リストの値の変更 (setq l '(1 2 3)) ;; 同じことをsetqでしてもエラー (ignore-errors (setq (car l) 10)) l ; => (1 2 3) (setf (car l)…

マクロ定義を拡張する

;; defmacroではリスト分解機能はない (defmacro for2 (spec &rest body) (declare (indent 1)) (let ((limit (gensym))) (destructuring-bind (var start end) spec `(let ((,var ,start) (,limit ,end)) (while (<= ,var ,limit) ,@body (setq ,var (1+ ,v…

関数定義を拡張する

Common LIspの拡張関数defun*を使うと、 &optional デフォルト引数 &key キーワード引数 リスト分解機能が使えるようになる。 ;; 拡張されたデフォルト値 (defun* test-default (a &optional (b 2) (c 3 c-avail)) (list a b c c-avail)) (test-default 1) ;…

destructuring-bindはデフォルト値やキーワード引数も使える

(destructuring-bind (&optional a (b 2)) '(1) (list a b)) ; => (1 2) (destructuring-bind (a &rest b) '(1 2 3) (list a b)) ; => (1 (2 3)) (destructuring-bind (&key a b) '(:a 10 :b 20) (list a b)) ; => (10 20) P193Emacs Lispテクニックバイブル…