レガシーコード生産ガイド

私に教えられることなら

CommonLispのletとlet*とoptional

一応メモしておく

(defvar x 2)

;; letを使った場合は、初期値中の変数は外側を参照する
(defun y-let ()
  (let
      ((x 1) (y (+ x 1)))
    y))
(y-let) ;; => 3


;; let*の場合はそれより前で定義された同スコープの変数から
(defun y-let* ()
  (let*
      ((x 1) (y (+ x 1)))
    y))
(y-let*) ;; => 2

;; 関数定義の&optional中でも同様
(defun y-optional (&optional (x 1) (y (+ x 1)))
  y)
(y-optional) ;; => 2

;; &keyでも同様
(defun y-key (&key (x 1) (y (+ x 1)))
  y)
(y-key) ;; => 2

letだけ挙動が違って間違えやすそうだしいつでもlet*使ったほうがいいんじゃないのかな?と思って調べてみた。

LET versus LET* in Common Lisp - Stack Overflow

LET makes code understanding easier. One sees a bunch of bindings and one can read each binding individually without the need to understand the top-down/left-right flow of 'effects' (rebindings). Using LET* signals to the programmer (the one that reads code) that the bindings are not independent, but there is some kind of top-down flow - which complicates things.

フーム…

広告を非表示にする