'기호 값'은 무엇을 하는가?


13

문서로 인해 더 현명하지 못했습니다.

이 함수는 심볼의 값 셀에 저장된 값을 반환합니다. 변수의 현재 (동적) 값이 저장되는 곳입니다. 변수에 로컬 바인딩이없는 경우 이는 단순히 전역 값입니다. 변수가 void이면 void-variable 오류가 발생합니다.

상징 가치의 요점은 무엇입니까? 언제 어디서 사용해야합니까?


3
이맥스에게 질문하여 답을 찾아 주셔서 감사합니다. 올바른 방법입니다. 먼저 Emacs에 문의 한 다음 아직 확실하지 않은 사항에 대해 여기에 질문하여 이미 시도한 내용을 질문에 알려주십시오. 명성!
Drew

답변:


13

Elisp 코드에서 기호의 값, 즉 변수로 간주 될 때의 값을 얻으려고 할 때 필요합니다.

Elisp 기호에는 몇 가지 특성 / 기능이 있습니다.

  • 이름이 있습니다 (함수가 symbol-name주는)
  • 변수로 간주 될 때 값을 가질 수 있습니다 ( symbol-value제공하는)
  • 그것은 함수 이름을 지정할 수 있습니다, (이 함수로 간주 할 때 symbol-function제공)
  • 속성 목록이 있습니다 ( symbol-plist제공합니다)

심볼을 다양한 속성을 가진 객체로 생각하십시오.


1
(문서에서 알 수 있듯이) symbol-value항상 심볼에 대한 동적 바인딩을 반환합니다 . 이런 식으로 어휘 값을 얻을 수 없습니다.
phils

2
C-h i g (elisp) Symbol Components RET이러한 다양한 기호 셀 / 구성 요소에 대한 설명서 도 참조하십시오 .
phils

@phils : 흠, 궁금합니다 : (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.
Drew

10

(Doh, @Drew는 이미 다음 중 일부를 작성했습니다. 어쨌든 여기에 추가 세부 사항이 있습니다.)

심볼 구성 요소 의 매뉴얼 페이지에서 설명 하는 것처럼 각 심볼에는 인쇄 이름 셀, 값 셀, 함수 정의 및 속성 목록의 네 가지 구성 요소 (셀)가 있습니다. 값 셀 또는 함수 셀이 비어 있고 속성 목록이 nil 일 수 있습니다.

매뉴얼도 지적했듯이 :

각 기호에는 별도의 값과 함수 셀이 있으므로 변수 이름과 함수 이름이 충돌하지 않습니다.

그렇기 때문에 다음과 같이 할 수 있습니다.

(setq test "kittens")
(defun test ()
  (message "puppies"))
(symbol-value 'test)    ; => "kittens"
(symbol-function 'test) ; => (lambda nil (message "puppies"))

1
아, 기능과 반대되는 가치는 이해하기 훨씬 쉬워졌습니다. 감사.
Unfun Cat

8

여기에 약간의 역사적 참고 자료가 있습니다 (설명 된 사건이 ​​발생했을 때 아직 태어나지 않았으므로 더 지식이있는 사람이 나를 고칠 것입니다.이 모든 것은 오래된 기사와 일부 책을 읽는 것입니다).

면책 조항을 배제한 후, 포트란 대 리스프 시대의 "기호"는 "오브젝트 지향"이 오늘날의 유행어였습니다. 즉, 프로그램은 일반적으로 숫자가 결국 연결되고 숫자 자리 표시자가 중요하지 않은 거대한 수학 공식으로 간주되었습니다. 프로그램에 포함 된 모든 기호 정보는 해당 프로그램이 실행, 컴파일 또는 해석 되 자마자 사라집니다. Lisp의 참신한 점은 심볼이 실행, 컴파일 또는 해석 된 후에도 프로그램에서 심볼이 지속될 수 있다는 것입니다. 이것은 "심볼 대수"와 같은 용어에 영감을 주었다 (직접 계산이 아닌 종이 / 칠판에서 수행되는 대수 공식의 조작에서와 같이). 이 (그리고 다른 상징적 인 것들)을 지원하기 위해 상징에는 이름과 일부 속성이 갖추어져있었습니다. 상징적이지 않은 관점에서 볼 때 "기호는 단지 포인터라는 이름의 포인터"라고 말할 수 있습니다. 그러나 이것이 사실이 아니지만, 구조체에 대한 포인터에 더 가깝다면 실제적인 목적으로 기호는 왼쪽의 지정자입니다. 변수-값 쌍의 손 쪽. 이것은 또한 볼 수 있습니다symbol-value 비 기호 언어에서 포인터 역 참조 기능.

현대 리스프는 하나의 심볼과 연관 될 수있는 값의 양이 다릅니다 (여러 메모리 스택 / 힙이있는 비 상징적 언어가 있다고 가정하면 다른 스택의 컨텍스트에서 해석 할 때 동일한 포인터가 의미하는 상황을 상상할 수 있습니다 / 힙). 따라서 Lisp2 언어 (Emacs Lisp는 그러한 언어 중 하나임)는 함수와 변수를위한 별도의 저장소를 가지고 있기 때문에 symbol-function"함수 저장소를 가리키는 포인터를 역 참조"하는 것도 있습니다. 구성표에는이 특수 저장소가 없으며 Clojure AFAIK에는 그 또는 그 어느 것도 없습니다 symbol-plist.


7

작은 데모 :

(setq v1 10)
;;10
v1
;;10
(setq v2 'v1)
;;v1
v2
;;v1
(symbol-value v2)
;;10 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.