sync notes(auto)
This commit is contained in:
parent
d4210c98f4
commit
8637b92271
1 changed files with 13 additions and 3 deletions
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue