let と let* の違い

Emacs Lisp 初心者のメモなので間違っているかもしれません。。。

今日覚えたこと。

let* は、変数を順にバインドしていくため、それまでバインドした変数を後続で参照できるようだ。

*scratch* バッファで、

(let ((str1 "hoge")
      (str2 (concat str1 "fuga")))
  str2)

を評価すると、*Backtrace*バッファに、

Debugger entered--Lisp error: (void-variable str1)
  (concat str1 "fuga")
  (let ((str1 "hoge") (str2 ...)) str2)
  eval((let )((str1 "hoge") (str2 ...)) str2))(
  eval-last-sexp-1(t)
  eval-last-sexp(t)
  eval-print-last-sexp()
  call-interactively(eval-print-last-sexp nil nil)

のエラーが表示される(変数 str1 が定義されていない)。で、let*の方を評価すると

(let* ((str1 "hoge")
      (str2 (concat str1 "fuga")))
  str2)
"hogefuga"

となって、 str1 がバインド済みだと確認できる。