### An obscure Emacs Lisp question
-
An obscure Emacs Lisp question
I'm trying to implement buffer-local variables in my #EmacsLisp interpreter, but in my test programs, there seem to be no functional difference between the "toplevel default" and the "default" value of a variable at all. When reading the documentation, it says this:
A variable can be let-bound to a value. This makes its global value shadowed by the binding;
default-valuewill then return the value from that binding, not the global value, andset-defaultwill be prevented from setting the global value (it will change the let-bound value instead). The following two functions allow referencing the global value even if it’s shadowed by a let-binding.But the documentation seems to be wrong, but maybe I am missing something? Here is my test program:
(when (intern-soft 'x) (unintern 'x obarray)) (setq record nil) (defun record (where val) (setq record (cons (cons where val) record)) ) (defun record-comment (str) (setq record (cons str record)) ) (defun replay () (princ ";----------------------------\n") (dolist (x (reverse record)) (cond ((stringp x) (princ x) (terpri)) (t (prin1 (car x)) (princ "; x => ") (prin1 (cdr x)) (terpri) )))) (record "lexical-binding" lexical-binding) (defvar x "global") (record 'x x) (make-local-variable 'x) (record '(make-local-variable 'x) x) (setq x "local") (record '(setq x "local") x) (record '(default-value 'x) (default-value 'x)) (set-default 'x "default") (record '(set-default 'x "default") x) (record '(default-value 'x) (default-value 'x)) (record '(default-toplevel-value 'x) (default-toplevel-value 'x)) (set-default-toplevel-value 'x "top-level") (record '(set-default-toplevel-value 'x "toplevel") x) (record '(default-value 'x) (default-value 'x)) (record '(default-toplevel-value 'x) (default-toplevel-value 'x)) (let ((x "inside-let-form")) (defvar x) (record '(let ((x "inside-let-form")) x) x) (setq x "let-local") (record '(let -- (setq x "let-local") x) x) (record '(let -- (default-value 'x)) (default-value 'x)) (set-default 'x "default") (record '(let -- (set-default 'x "default") x) x) (record '(let -- (default-value 'x)) (default-value 'x)) (record '(let -- (default-toplevel-value 'x)) (default-toplevel-value 'x)) (set-default-toplevel-value 'x "top-level") (record '(let -- (set-default-toplevel-value 'x "top-level")) x) (record '(let -- (default-value 'x)) (default-value 'x)) (record '(let -- (default-toplevel-value 'x)) (default-toplevel-value 'x)) ) (record-comment ";;after let") (record 'x x) (record '(default-value 'x) (default-value 'x)) (record '(default-toplevel-value 'x) (default-toplevel-value 'x)) (replay)When you look at the output of the program,
(default-value 'x)returns the same value as(default-toplevel-value 'x)regardless of whether it is inside of a let binding. Here is the above program's output:;---------------------------- x; x => "global" (make-local-variable 'x); x => "global" (setq x "local"); x => "local" (default-value 'x); x => "global" (set-default 'x "default"); x => "local" (default-value 'x); x => "default" (default-toplevel-value 'x); x => "default" (set-default-toplevel-value 'x "toplevel"); x => "local" (default-value 'x); x => "top-level" (default-toplevel-value 'x); x => "top-level" (let ((x "inside-let-form")) x); x => "inside-let-form" (let -- (setq x "let-local") x); x => "let-local" (let -- (default-value 'x)); x => "top-level" (let -- (set-default 'x "default") x); x => "let-local" (let -- (default-value 'x)); x => "default" (let -- (default-toplevel-value 'x)); x => "default" (let -- (set-default-toplevel-value 'x "top-level")); x => "let-local" (let -- (default-value 'x)); x => "top-level" (let -- (default-toplevel-value 'x)); x => "top-level" ;;after let x; x => "local" (default-value 'x); x => "top-level" (default-toplevel-value 'x); x => "top-level" -
R relay@relay.mycrowd.ca shared this topic