“Sembol-değer” ne yapar?


13

Belgeler beni daha akılsız yaptı:

Bu işlev, sembolün değer hücresinde depolanan değeri döndürür. Bu, değişkenin geçerli (dinamik) değerinin depolandığı yerdir. Değişkenin yerel bağlaması yoksa, bu yalnızca global değeridir. Değişken geçersizse, geçersiz değişken hatası bildirilir.

Sembol-değerinin anlamı nedir? Nerede ve ne zaman kullanmam gerekir?


3
Emacs'a sorarak cevabı bulmaya çalıştığın için teşekkürler. Doğru yaklaşım budur: Önce Emacs'a sor ve sonra burada hala net olmayan şeyleri sor, soruna zaten denediğini bize bildir. Kudos!
Drew

Yanıtlar:


13

Elisp kodunda, bir sembolün değerini, yani bir değişken olarak kabul edildiğinde değerini almak istediğinizde buna ihtiyacınız vardır.

Elisp sembolünün çeşitli özellikleri / özellikleri olduğunu unutmayın:

  • Bir adı vardır (hangi fonksiyon symbol-nameverir)
  • Değişken olarak kabul edildiğinde (bu değer symbol-valueverir) bir değeri olabilir
  • Bir işlev olarak kabul edildiğinde bir işlevi adlandırabilir (bu symbol-functionverir)
  • Bir özellik listesi ( symbol-plistverir)

Bir sembolü çeşitli niteliklere sahip bir nesne olarak düşünün.


1
Ayrıca (belgelerin belirttiği gibi) symbol-valueher zaman sembolün dinamik bağını döndürdüğünü unutmayın . Sözcüksel değerleri bu şekilde elde edemezsiniz.
phils

2
Ayrıca C-h i g (elisp) Symbol Components RETbu çeşitli sembol hücreleri / bileşenleri hakkındaki belgelere bakın .
phils

@phils: Hımm acaba: (setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v))). Ama evet, (elisp) de şöyle diyor Lexical Binding: " fonksiyonları gibi symbol-value, boundp've set'sadece almak veya bağlayıcı bir değişkenin dinamiği değiştirmek (yani onun sembolün değeri hücrenin içeriği) ". Ancak, bu konuda hiçbir şey söylenmez Symbol Components.
Drew

10

(Doh, @Drew zaten aşağıdakilerden bazılarını ortaya koydu. Her neyse, işte ek ayrıntılar.)

Sembol bileşenlerindeki manuel sayfada açıklandığı gibi, her sembolde dört bileşen (hücre) vardır: yazdırma adı hücresi, değer hücresi, işlev tanımı ve özellik listesi. Değer hücresi veya işlev hücresi geçersiz olabilir ve özellik listesi sıfır olabilir.

Kılavuzun da belirttiği gibi:

Her sembolün ayrı değer ve işlev hücreleri olduğundan, değişken adları ve işlev adları çakışmaz.

Bu yüzden sahip olabilirsiniz, örneğin:

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

1
Ah, fonksiyonun aksine değer olduğunu anlamayı çok daha kolay hale getirdi. Teşekkürler.
The Unfun Cat

8

İşte biraz tarihsel referans (tarif edilen olaylar gerçekleştiğinde henüz doğmadım, belki daha bilgili biri beni düzeltir. Bütün bunlar eski makaleleri ve bazı kitapları okumaktan kaynaklanıyor).

Feragatnameden vazgeçtikten sonra, Fortran vs Lisp günlerinde geri dönüyor gibi görünüyor "sembolik" bugün "nesne yönelimli" olduğu için bir tür terimdi. Yani programlar genellikle sayıların nihayetinde takılacağı ve sayıların yer tutucularının önemsiz olduğu büyük matematiksel formüller olarak görülüyordu. Bir programda yer alan tüm sembolik bilgiler, program çalıştırıldığı, derlendiği veya yorumlandığı anda yok olur. Lisp'in yeniliği, sembollerin bir programda çalıştırıldıktan, derlendikten veya yorumlandıktan sonra bile devam etmesine izin vermesiydi. Bu, "sembolik cebir" gibi terminolojiye ilham verdi (cebirsel formüllerde, doğrudan hesaplama yerine kağıt / tahtada yapılan manipülasyonda olduğu gibi). Bunu (ve diğer sembolik şeyleri) desteklemek için sembollerin bir isim ve bazı özellikleri ile donatılması gerekiyordu. Sembolik olmayan bir bakış açısından, "semboller sadece işaretçiler olarak adlandırılır" diyebilir ve bu doğru olmasa da, eğer herhangi bir şey yapılara daha çok işaret ederse, ancak pratik amaçlar için, semboller solun belirleyicisidir. değişken değer çiftinin el tarafı. Bu aynı zamandasymbol-value sembolik olmayan dillerde işaretçi kaydı silme işlevi görür.

Modern Lisps, bir sembolle ne kadar değer ilişkilendirilebileceğine göre değişir (birden fazla bellek yığınına / yığınına sahip sembolik olmayan bir diliniz olduğunu varsayalım, farklı yığınlar bağlamında yorumlandığında aynı işaretçinin anlamı olduğu bir durum hayal edebilirsiniz. yığın). Yani, Lisp2 dilleri (Emacs Lisp böyle bir dildir) işlevler ve değişkenler için ayrı bir depolama alanına sahiptir, bu yüzden de symbol-function"bir işlev deposuna işaret eden bir işaretçi dereferences" dır . Şema bu özel depoya sahip değil ve Clojure AFAIK, ne bu ne de var symbol-plist.


7

Küçük demo:

(setq v1 10)
;;10
v1
;;10
(setq v2 'v1)
;;v1
v2
;;v1
(symbol-value v2)
;;10 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.