`Symbol-value` làm gì?


13

Các tài liệu làm cho tôi không khôn ngoan hơn:

Hàm này trả về giá trị được lưu trữ trong ô giá trị của ký hiệu. Đây là nơi lưu trữ giá trị hiện tại (động) của biến. Nếu biến không có ràng buộc cục bộ, đây đơn giản là giá trị toàn cầu của nó. Nếu biến là void, một lỗi biến void được báo hiệu.

Điểm của giá trị biểu tượng là gì? Tôi cần sử dụng nó ở đâu và khi nào?


3
Cảm ơn bạn đã cố gắng tìm câu trả lời bằng cách hỏi Emacs. Đó là cách tiếp cận đúng: hỏi Emacs trước, sau đó hỏi ở đây về bất cứ điều gì vẫn chưa rõ ràng, cho chúng tôi biết trong câu hỏi của bạn những gì bạn đã thử. Thanh danh!
vẽ

Câu trả lời:


13

Bạn cần nó khi, trong mã Elisp, bạn muốn lấy giá trị của một ký hiệu, nghĩa là giá trị của nó khi được coi là một biến.

Hãy nhớ rằng một biểu tượng Elisp có một số đặc điểm / tính năng:

  • Nó có một tên (chức năng symbol-namecho)
  • Nó có thể có một giá trị, khi được coi là một biến ( symbol-valuecung cấp)
  • Nó có thể đặt tên cho một hàm, khi được coi là một hàm ( symbol-functioncung cấp cho)
  • Nó có một danh sách tài sản ( symbol-plistcung cấp cho)

Hãy nghĩ về một biểu tượng như một đối tượng, với các thuộc tính khác nhau.


1
Cũng lưu ý rằng (như tài liệu chỉ ra) symbol-valueluôn trả về ràng buộc động cho biểu tượng. Bạn không thể có được các giá trị từ vựng theo cách này.
phils 10/03/2015

2
Cũng xem C-h i g (elisp) Symbol Components RETtài liệu về các ô / thành phần ký hiệu khác nhau.
phils 10/03/2015

@phils: Hừm, tôi tự hỏi : (setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v))). Nhưng vâng, đó là những gì nó nói tại (elisp) Lexical Binding: "các hàm như symbol-value, boundp'set'chỉ truy xuất hoặc sửa đổi ràng buộc động của một biến (nghĩa là nội dung của ô giá trị ký hiệu của nó) ". Tuy nhiên, không có gì được nói về nó tại Symbol Components.
vẽ

10

(Doh, @Drew đã đưa ra một số điều sau đây. Dù sao, đây là một số chi tiết bổ sung.)

Như trang hướng dẫn về các thành phần ký hiệu giải thích, có bốn thành phần (ô) cho mỗi ký hiệu: ô tên in, ô giá trị, định nghĩa hàm và danh sách thuộc tính của nó. Ô giá trị hoặc ô chức năng có thể bị vô hiệu và danh sách thuộc tính có thể là không.

Như hướng dẫn cũng chỉ ra:

Bởi vì mỗi biểu tượng có các ô giá trị và hàm riêng biệt, tên biến và tên hàm không xung đột.

Đó là lý do tại sao bạn có thể có, ví dụ:

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

1
Ah, đó là giá trị trái ngược với chức năng làm cho nó dễ hiểu hơn nhiều. Cảm ơn.
Mèo Unun 10/03/2015

8

Đây là một chút tài liệu tham khảo lịch sử (Tôi chưa được sinh ra khi các sự kiện được mô tả diễn ra, vì vậy có lẽ ai đó hiểu biết hơn sẽ sửa chữa tôi. Tất cả điều này là từ việc đọc các bài báo cũ và một số sách).

Sau khi từ chối trách nhiệm, có vẻ như trở lại thời kỳ Fortran vs Lisp "tượng trưng" là một loại từ thông dụng như "hướng đối tượng" ngày nay. Các chương trình thường được xem như là các công thức toán học khổng lồ trong đó các số cuối cùng sẽ được cắm và các trình giữ chỗ cho các số là không quan trọng. Tất cả thông tin tượng trưng có trong một chương trình sẽ biến mất ngay khi chương trình đó được chạy, biên dịch hoặc giải thích. Điểm mới lạ của Lisp là nó cho phép các biểu tượng tồn tại trong một chương trình ngay cả sau khi được chạy, biên dịch hoặc giải thích. Điều này đã truyền cảm hứng cho thuật ngữ này như "đại số tượng trưng" (như trong thao tác trên các công thức đại số như được thực hiện trên giấy / bảng đen thay vì tính toán trực tiếp). Để hỗ trợ biểu tượng này (và những thứ tượng trưng khác) phải được trang bị tên và một số thuộc tính. Từ quan điểm phi biểu tượng, người ta có thể nói rằng "các biểu tượng chỉ là con trỏ được đặt tên", và trong khi điều này không đúng, nếu bất cứ điều gì chúng là con trỏ nhiều hơn, nhưng với mục đích thực tế, các biểu tượng là người chỉ định bên trái bên tay của một cặp giá trị biến. Điều này cũng làm cho nó có thể nhìn thấysymbol-value có chức năng như hội thảo con trỏ trong các ngôn ngữ phi biểu tượng.

Lisps hiện đại khác nhau ở chỗ có bao nhiêu giá trị có thể được liên kết với một biểu tượng (giả sử bạn có ngôn ngữ phi biểu tượng với nhiều ngăn xếp / đống bộ nhớ, bạn có thể tưởng tượng một tình huống trong đó cùng một con trỏ có nghĩa khi được giải thích trong ngữ cảnh của các ngăn xếp khác nhau / đống). Vì vậy, các ngôn ngữ Lisp2 (Emacs Lisp là một ngôn ngữ như vậy) có bộ lưu trữ riêng cho các hàm và biến, đây là lý do tại sao cũng có một symbol-function"con trỏ trỏ đến một bộ lưu trữ hàm". Lược đồ không có bộ lưu trữ đặc biệt này và Clojure AFAIK, không có cái đó cũng không có symbol-plist.


7

Bản demo nhỏ:

(setq v1 10)
;;10
v1
;;10
(setq v2 'v1)
;;v1
v2
;;v1
(symbol-value v2)
;;10 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.