読者です 読者をやめる 読者になる 読者になる

by shigemk2

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

if progn < cond

Emacs Lisp

ifは1つのフォームしか置けないので、prognと併用することで
複数のフォームを置けるが、
if+prognよりも、condを使ったほうがスマート。

(cond (条件式
       真フォーム1
       真フォーム2
       ..)
      (t
       偽フォーム1
       偽フォーム2
       ..))
返り値は、最後に評価したフォーム
;;ifとprognをcondに置き変えるとインデントがきれいになる
(let (a b)
  (if (= 1 1)
      (progn
	(setq a 2)
	(setq b 3))
    (setq a 10)
    (setq b 20))
  (list a b))				; => (2 3)
(let (a b)
  (cond ((= 1 1)
	 (setq a 2)
	 (setq b 3))
	(t
	 (setq a 10)
	 (setq b 20)))
  (list a b))				; => (2 3)
;;; ネストしたif式をcondに置き換える
(if (zerop (% 10 4))
    "10は4の倍数"
  (if (zerop (% 10 2))
      "10は偶数"
    "10は奇数"))			; => "10は偶数"
(cond ((zerop (% 10 4))
    "10は4の倍数")
    ((zerop (% 10 2))
      "10は偶数")
    (t
     "10は奇数"))			; => "10は偶数"

condは最初に真になった部分のフォームを評価する

P61

Emacs Lispテクニックバイブル

Emacs Lispテクニックバイブル