Apa yang dilakukan `simbol-nilai`?

13

Dokumen membuat saya tidak bijaksana:

Fungsi ini mengembalikan nilai yang disimpan dalam sel nilai simbol. Di sinilah nilai variabel saat ini (dinamis) disimpan. Jika variabel tidak memiliki ikatan lokal, ini hanyalah nilai globalnya. Jika variabel tersebut batal, kesalahan variabel-void ditandai.

Apa gunanya nilai simbol? Di mana dan kapan saya harus menggunakannya?

Kucing Unfun
sumber
3
Terima kasih telah mencoba menemukan jawabannya dengan bertanya kepada Emacs. Itu adalah pendekatan yang tepat: tanyakan pada Emacs terlebih dahulu, dan kemudian tanyakan di sini tentang apa pun yang masih belum jelas, beri tahu kami dalam pertanyaan Anda apa yang sudah Anda coba. Pujian!
Drew

Jawaban:

13

Anda memerlukannya saat, dalam kode Elisp, Anda ingin mendapatkan nilai simbol, yaitu nilainya ketika dianggap sebagai variabel.

Ingatlah bahwa simbol Elisp memiliki beberapa karakteristik / fitur:

  • Ini memiliki nama (yang symbol-namememberi fungsi )
  • Itu mungkin memiliki nilai, ketika dianggap sebagai variabel (yang symbol-valuememberi)
  • Mungkin nama fungsi, bila dianggap sebagai fungsi (yang symbol-functionmemberi)
  • Ia memiliki daftar properti (yang symbol-plistmemberi)

Pikirkan simbol sebagai objek, dengan berbagai atribut.

Drew
sumber
1
Perhatikan juga bahwa (sebagaimana ditunjukkan oleh dokumentasi) symbol-valueselalu mengembalikan ikatan dinamis untuk simbol. Anda tidak dapat memperoleh nilai leksikal dengan cara ini.
phils
2
Lihat juga C-h i g (elisp) Symbol Components RETdokumentasi tentang berbagai sel / komponen simbol ini.
phils
@phils: Hm, aku bertanya-tanya: (setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v))). Tapi ya, itulah yang dikatakan di (elisp) Lexical Binding: " berfungsi seperti symbol-value,, boundp'dan set'hanya mengambil atau memodifikasi pengikatan dinamis variabel (yaitu, isi sel nilai simbolnya) ". Namun, tidak ada yang dikatakan tentang itu di Symbol Components.
Drew
10

(Doh, @Drew sudah memasang beberapa tindak lanjut. Pokoknya, inilah beberapa detail tambahan.)

Seperti yang dijelaskan halaman manual tentang komponen simbol , ada empat komponen (sel) untuk setiap simbol: sel nama cetak, sel nilainya, definisi fungsinya, dan daftar propertinya. Sel nilai atau sel fungsi mungkin batal, dan daftar properti mungkin nol.

Sebagaimana manual juga tunjukkan:

Karena setiap simbol memiliki nilai dan sel fungsi yang berbeda, nama variabel dan nama fungsi tidak bertentangan.

Itu sebabnya Anda dapat memiliki, misalnya:

(setq test "kittens")
(defun test ()
  (message "puppies"))
(symbol-value 'test)    ; => "kittens"
(symbol-function 'test) ; => (lambda nil (message "puppies"))
Dan
sumber
1
Ah, itu adalah nilai yang bertentangan dengan fungsi membuatnya lebih mudah untuk dipahami. Terima kasih.
The Unfun Cat
8

Ini sedikit referensi sejarah (saya belum dilahirkan ketika peristiwa yang digambarkan terjadi, jadi mungkin seseorang yang lebih berpengetahuan akan mengoreksi saya. Semua ini dari membaca artikel-artikel lama dan beberapa buku).

Setelah menghilangkan disclaimer, sepertinya kembali pada zaman Fortran vs Lisp "simbolik" adalah semacam kata kunci seperti "berorientasi objek" hari ini. Yaitu program biasanya dilihat hanya sebagai rumus matematika besar di mana angka-angka pada akhirnya akan dicolokkan dan placeholder untuk angka tidak penting. Semua informasi simbolis yang terkandung dalam suatu program akan lenyap begitu program itu dijalankan, dikompilasi atau ditafsirkan. Kebaruan Lisp adalah memungkinkan simbol untuk bertahan dalam suatu program bahkan setelah dijalankan, dikompilasi atau ditafsirkan. Istilah ini mengilhami istilah seperti "aljabar simbolik" (seperti dalam manipulasi pada rumus aljabar seperti yang dilakukan pada kertas / papan tulis bukan dengan perhitungan langsung). Untuk mendukung ini (dan hal-hal simbolis lainnya) simbol harus dilengkapi dengan nama dan beberapa properti. Dari sudut pandang non-simbolik, orang mungkin mengatakan bahwa "simbol hanya bernama pointer", dan sementara ini tidak benar, jika ada lebih dari pointer ke struct, tetapi untuk tujuan praktis, simbol adalah perancang kiri. sisi pasangan nilai-variabel. Ini juga memungkinkan untuk dilihatsymbol-value berfungsi sebagai pointer dereferencing dalam bahasa non-simbolik.

Lisps modern bervariasi dalam hal berapa banyak nilai yang dapat dikaitkan dengan satu simbol (misalkan Anda memiliki bahasa non-simbolik dengan banyak tumpukan memori / tumpukan, Anda dapat membayangkan situasi di mana pointer yang sama memiliki makna ketika ditafsirkan dalam konteks tumpukan yang berbeda / tumpukan). Jadi, bahasa Lisp2 (Emacs Lisp menjadi salah satu bahasa seperti itu) memiliki penyimpanan terpisah untuk fungsi dan variabel, inilah sebabnya ada juga symbol-function, yang "menunjuk referensi yang menunjuk ke penyimpanan fungsi". Skema tidak memiliki penyimpanan khusus ini dan Clojure AFAIK, tidak memiliki keduanya maupun symbol-plist.

wvxvw
sumber
7

Demo kecil:

(setq v1 10)
;;10
v1
;;10
(setq v2 'v1)
;;v1
v2
;;v1
(symbol-value v2)
;;10 
abo-abo
sumber