문서로 인해 더 현명하지 못했습니다.
이 함수는 심볼의 값 셀에 저장된 값을 반환합니다. 변수의 현재 (동적) 값이 저장되는 곳입니다. 변수에 로컬 바인딩이없는 경우 이는 단순히 전역 값입니다. 변수가 void이면 void-variable 오류가 발생합니다.
상징 가치의 요점은 무엇입니까? 언제 어디서 사용해야합니까?
문서로 인해 더 현명하지 못했습니다.
이 함수는 심볼의 값 셀에 저장된 값을 반환합니다. 변수의 현재 (동적) 값이 저장되는 곳입니다. 변수에 로컬 바인딩이없는 경우 이는 단순히 전역 값입니다. 변수가 void이면 void-variable 오류가 발생합니다.
상징 가치의 요점은 무엇입니까? 언제 어디서 사용해야합니까?
답변:
Elisp 코드에서 기호의 값, 즉 변수로 간주 될 때의 값을 얻으려고 할 때 필요합니다.
Elisp 기호에는 몇 가지 특성 / 기능이 있습니다.
symbol-name
주는)symbol-value
제공하는)symbol-function
제공)symbol-plist
제공합니다)심볼을 다양한 속성을 가진 객체로 생각하십시오.
symbol-value
항상 심볼에 대한 동적 바인딩을 반환합니다 . 이런 식으로 어휘 값을 얻을 수 없습니다.
C-h i g
(elisp) Symbol Components
RET
이러한 다양한 기호 셀 / 구성 요소에 대한 설명서 도 참조하십시오 .
(setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v)))
. 그러나 예, 그것은 (elisp)에 말씀입니다 Lexical Binding
: " 기능과 같은 symbol-value
, boundp'
그리고 set'
만 검색하거나 바인딩 변수의 동적 수정 (즉, 그 심볼의 값 셀의 내용) ". 그러나에 대해서는 아무 것도 언급되어 있지 않습니다 Symbol Components
.
(Doh, @Drew는 이미 다음 중 일부를 작성했습니다. 어쨌든 여기에 추가 세부 사항이 있습니다.)
심볼 구성 요소 의 매뉴얼 페이지에서 설명 하는 것처럼 각 심볼에는 인쇄 이름 셀, 값 셀, 함수 정의 및 속성 목록의 네 가지 구성 요소 (셀)가 있습니다. 값 셀 또는 함수 셀이 비어 있고 속성 목록이 nil 일 수 있습니다.
매뉴얼도 지적했듯이 :
각 기호에는 별도의 값과 함수 셀이 있으므로 변수 이름과 함수 이름이 충돌하지 않습니다.
그렇기 때문에 다음과 같이 할 수 있습니다.
(setq test "kittens")
(defun test ()
(message "puppies"))
(symbol-value 'test) ; => "kittens"
(symbol-function 'test) ; => (lambda nil (message "puppies"))
여기에 약간의 역사적 참고 자료가 있습니다 (설명 된 사건이 발생했을 때 아직 태어나지 않았으므로 더 지식이있는 사람이 나를 고칠 것입니다.이 모든 것은 오래된 기사와 일부 책을 읽는 것입니다).
면책 조항을 배제한 후, 포트란 대 리스프 시대의 "기호"는 "오브젝트 지향"이 오늘날의 유행어였습니다. 즉, 프로그램은 일반적으로 숫자가 결국 연결되고 숫자 자리 표시자가 중요하지 않은 거대한 수학 공식으로 간주되었습니다. 프로그램에 포함 된 모든 기호 정보는 해당 프로그램이 실행, 컴파일 또는 해석 되 자마자 사라집니다. Lisp의 참신한 점은 심볼이 실행, 컴파일 또는 해석 된 후에도 프로그램에서 심볼이 지속될 수 있다는 것입니다. 이것은 "심볼 대수"와 같은 용어에 영감을 주었다 (직접 계산이 아닌 종이 / 칠판에서 수행되는 대수 공식의 조작에서와 같이). 이 (그리고 다른 상징적 인 것들)을 지원하기 위해 상징에는 이름과 일부 속성이 갖추어져있었습니다. 상징적이지 않은 관점에서 볼 때 "기호는 단지 포인터라는 이름의 포인터"라고 말할 수 있습니다. 그러나 이것이 사실이 아니지만, 구조체에 대한 포인터에 더 가깝다면 실제적인 목적으로 기호는 왼쪽의 지정자입니다. 변수-값 쌍의 손 쪽. 이것은 또한 볼 수 있습니다symbol-value
비 기호 언어에서 포인터 역 참조 기능.
현대 리스프는 하나의 심볼과 연관 될 수있는 값의 양이 다릅니다 (여러 메모리 스택 / 힙이있는 비 상징적 언어가 있다고 가정하면 다른 스택의 컨텍스트에서 해석 할 때 동일한 포인터가 의미하는 상황을 상상할 수 있습니다 / 힙). 따라서 Lisp2 언어 (Emacs Lisp는 그러한 언어 중 하나임)는 함수와 변수를위한 별도의 저장소를 가지고 있기 때문에 symbol-function
"함수 저장소를 가리키는 포인터를 역 참조"하는 것도 있습니다. 구성표에는이 특수 저장소가 없으며 Clojure AFAIK에는 그 또는 그 어느 것도 없습니다 symbol-plist
.