Вот небольшая историческая справка (я еще не родился, когда произошли описанные события, поэтому, возможно, кто-то более знающий исправит меня. Все это от чтения старых статей и некоторых книг).
Не обращая внимания на отказ от ответственности, кажется, что во времена Фортрана против Лиспа «символическое» было своего рода модным словом, как сегодня «объектно-ориентированное». Т.е. программы обычно рассматривались как просто огромные математические формулы, в которых числа в конечном итоге будут вставлены, а заполнители для чисел были несущественными. Вся символическая информация, содержащаяся в программе, исчезнет, как только эта программа будет запущена, скомпилирована или интерпретирована. Новинка Lisp заключалась в том, что он позволял символам сохраняться в программе даже после ее запуска, компиляции или интерпретации. Это вдохновило такую терминологию, как «символическая алгебра» (как при манипулировании алгебраическими формулами, как это делается на бумаге / доске, а не путем прямого вычисления). Чтобы поддержать это (и другие символические вещи), символы должны были быть снабжены именем и некоторыми свойствами. С несимволической точки зрения можно сказать, что «символы просто называются указателями», и хотя это не так, если они являются чем-то большим, чем указатели на структуры, но для практических целей символы обозначают левые сторона стороны пары переменная-значение. Это также позволяет увидетьsymbol-value
функция разыменования указателя в несимвольных языках.
Современные Лиспы отличаются тем, что значения могут быть связаны с одним символом (предположим, у вас был не символический язык с несколькими стеками / кучами памяти, вы можете представить себе ситуацию, когда один и тот же указатель имеет значение при интерпретации в контексте разных стеков / отвалы). Таким образом, языки Lisp2 (Emacs Lisp является одним из таких языков) имеют отдельное хранилище для функций и переменных, поэтому существует также метод symbol-function
, который «разыменовывает указатель, указывающий на хранилище функций». Схема не имеет этого специального хранилища, а Clojure AFAIK не имеет ни того, ни другого symbol-plist
.