Dokumenty nie uczyniły mnie mądrzejszym:
Ta funkcja zwraca wartość zapisaną w komórce wartości symbolu. To tutaj przechowywana jest bieżąca (dynamiczna) wartość zmiennej. Jeśli zmienna nie ma lokalnego powiązania, jest to po prostu jej wartość globalna. Jeśli zmienna jest nieważna, sygnalizowany jest błąd zmiennej nieważności.
Jaki jest sens wartości symbolicznej? Gdzie i kiedy muszę go użyć?
Odpowiedzi:
Potrzebujesz go, gdy w kodzie Elisp chcesz uzyskać wartość symbolu, to znaczy jego wartość, gdy jest uważana za zmienną.
Pamiętaj, że symbol Elisp ma kilka cech / cech:
symbol-name
daje)symbol-value
daje)symbol-function
daje)symbol-plist
daje)Pomyśl o symbolu jako obiekcie o różnych atrybutach.
źródło
symbol-value
zawsze zwraca dynamiczne powiązanie dla symbolu. W ten sposób nie można uzyskać wartości leksykalnych.C-h i g
(elisp) Symbol Components
RET
dokumentację na temat różnych komórek / komponentów symboli.(setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v)))
. Ale tak, to co jest napisane na (Elisp)Lexical Binding
: „ funkcje jaksymbol-value
,boundp'
iset'
tylko pobierać lub modyfikować dynamikę danej zmiennej wiązania (czyli zawartość wartość komórki jest jej symbol) ”. Jednak nic o tym nie mówi sięSymbol Components
.(Doh, @Drew już omówił niektóre z poniższych. W każdym razie, oto kilka dodatkowych szczegółów.)
Jak wyjaśnia strona podręcznika na temat symboli , każdy symbol ma cztery składniki (komórki): komórkę nazwy wydruku, komórkę wartości, definicję funkcji i listę właściwości. Komórka wartości lub komórka funkcji może być nieważna, a lista właściwości może być zerowa.
Jak wskazano w instrukcji:
Dlatego możesz na przykład:
źródło
Oto trochę odniesień historycznych (jeszcze się nie urodziłem, kiedy miały miejsce opisane wydarzenia, więc może ktoś bardziej kompetentny mnie poprawi. Wszystko po przeczytaniu starych artykułów i niektórych książek).
Po rezygnacji z wyłączenia odpowiedzialności wydaje się, że w czasach Fortran kontra Lisp „symboliczne” było rodzajem modnego hasła, jakim jest dzisiaj „obiektowe”. Tj. Programy były zwykle postrzegane jako po prostu ogromne formuły matematyczne, w których liczby zostaną w końcu podłączone, a symbole zastępcze dla liczb były nieistotne. Wszystkie informacje symboliczne zawarte w programie znikną, gdy tylko program zostanie uruchomiony, skompilowany lub zinterpretowany. Nowością Lisp było to, że pozwalało na zachowanie symboli w programie nawet po jego uruchomieniu, kompilacji lub interpretacji. To zainspirowało taką terminologię, jak „algebra symboliczna” (jak w przypadku manipulacji formułami algebraicznymi wykonywanymi na papierze / tablicy, a nie przez bezpośrednie obliczenia). Aby wesprzeć to (i inne symboliczne rzeczy) symbole miały być wyposażone w nazwę i niektóre właściwości. Z nie-symbolicznego punktu widzenia można powiedzieć, że „symbole są po prostu nazwanymi wskaźnikami”, i chociaż nie jest to prawdą, jeśli w ogóle są bardziej wskaźnikami do struktur, ale dla celów praktycznych symbole są desygnatorami lewej strona strony pary o zmiennej wartości. Pozwala to również zobaczyć
symbol-value
działają jako dereferencje wskaźnika w językach innych niż symboliczne.Współczesne Lisps różnią się tym, ile wartości można skojarzyć z jednym symbolem (załóżmy, że masz nie-symboliczny język z wieloma stosami / stosami pamięci, możesz sobie wyobrazić sytuację, w której ten sam wskaźnik ma znaczenie, gdy jest interpretowany w kontekście różnych stosów / hałdy). Tak więc języki Lisp2 (Emacs Lisp jest jednym z takich języków) mają osobne miejsce na funkcje i zmienne, dlatego też istnieje również „
symbol-function
, który„ odznacza wskaźnik wskazujący miejsce na funkcję ”. Schemat nie ma tego specjalnego miejsca do przechowywania, a Clojure AFAIK, nie ma ani tego, anisymbol-plist
.źródło
Małe demo:
źródło