by shigemk2

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

let と let*

letを使ってローカル変数を定義できる。
ローカル変数は、一時的に使用する変数で、
グローバル変数を一時的に変更する
なお、letは入れ子にできる。letを抜けると、外側の値が有効になる。

また、let*はローカル変数が順番に代入されるので、
直前の代入の影響を受ける

以下、letとlet*の挙動を確認する。

(setq x 1)
x					; => 1
(let ((x 2)
  null)				; グローバル変数xを一時的に変更する
  x				; => 2
  null				; => nil
  ;; letは入れ子に出来る
  (let ((x 3)) x)			; => 3
  )
;; letを抜けたらグローバルの値になる
x 					; => 1

(let ((x (+ 5 5))			;yには影響しない
      (y x)				;ここでは外側のxが参照される
      )
  x					; => 10
  y					; => 1
  (setq x 100)
  x					; => 100
  )					; => 100
;; let内の代入は外部には及ばない
x					; => 1
;; ここでは設定したばかりのxが参照される
(let* ((x (+ 5 5))			; yに影響する
       (y x)				; ローカル変数のxが参照される
       )
  x					; => 10
  y					; => 10
  )
x 					; => 1

(setq x 1)
(let ((x 2))
  x					; => 2
  (let ((x 3))
    x					; => 3
    (let ((x 4))
      x					; => 4
      (setq x 9999))			; => 9999
    x					; => 3
    )
  x					; => 2
  )
x					; => 1
(setq x 1)
(let ((x 3) (y (1+ x)))
  (+ x y))				; => 5
(let* ((x 3) (y (1+ x)))
  (+ x y))				; => 7

P51

Emacs Lispテクニックバイブル

Emacs Lispテクニックバイブル