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?
Jawaban:
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:
symbol-name
memberi fungsi )symbol-value
memberi)symbol-function
memberi)symbol-plist
memberi)Pikirkan simbol sebagai objek, dengan berbagai atribut.
sumber
symbol-value
selalu mengembalikan ikatan dinamis untuk simbol. Anda tidak dapat memperoleh nilai leksikal dengan cara ini.C-h i g
(elisp) Symbol Components
RET
dokumentasi tentang berbagai sel / komponen simbol ini.(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 sepertisymbol-value
,,boundp'
danset'
hanya mengambil atau memodifikasi pengikatan dinamis variabel (yaitu, isi sel nilai simbolnya) ". Namun, tidak ada yang dikatakan tentang itu diSymbol Components
.(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:
Itu sebabnya Anda dapat memiliki, misalnya:
sumber
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 dilihat
symbol-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 maupunsymbol-plist
.sumber
Demo kecil:
sumber