sync notes(auto)

This commit is contained in:
Kaz Saita(raspi5) 2024-04-28 17:15:03 +09:00
parent d4210c98f4
commit 8637b92271

View file

@ -1,9 +1,10 @@
# 20240428122916 setf setq defvar defparameter の違い
#common_lisp #tips
そもそも・・・
defvar, defparameterはダイナミックスコープの変数(スペシャル変数)を定義する。
letや未定義時のsetfはレキシカルスコープの変数を定義する。
若干ややこしいく、前提となる知識が必要だが、
- defvar, defparameterはダイナミックスコープの変数(スペシャル変数)を定義する。
- letや未定義時のsetfはレキシカルスコープの変数を定義する。
グローバル変数をレキシカルに作る方法は(少なくとも標準的には)無い。 上記未定義時のsetfは期待した動作をするが、推奨されていない。
cf.
@ -69,6 +70,7 @@ d ; => 1
;; caught 1 WARNING condition
(setf e 2); 2回目 ;; 同様のwarningが出る
e ; => 2
;; defconstant強い。letでも変えられない
(let
((d 2)))
@ -78,6 +80,14 @@ e ; => 2
;; Compile-time error:
;; COMMON-LISP-USER::D names a defined constant, and cannot be used in LET.
;; [Condition of type SB-INT:COMPILED-PROGRAM-ERROR]
;; こう書いた場合もグローバルにアクセスできる?
;; ダイナミックスコープならできるはず
(defun nazo ()
(defvar nazo_value 10))
(nazo)
nazo_value ; => 10 できた
```
### Refs.