То же самое происходит и в Emacs Lisp. Он имеет два пространства имен, одно для функций и одно для переменных. Если вы разыменовываете символ в контексте функции ((var)
), он вызовет функцию, если вы разыменовываете его в контексте переменной (var
, то есть без скобок ), он даст вам переменную. Например:
(defun myvar (myvar)
"adds 3 to MYVAR"
(+ 3 myvar))
(setq myvar 7)
(message (myvar myvar))
Выполнит функцию myvar
с аргументом 7
, который является разыменованием переменной myvar
.
Это может стать очень запутанным, если вы к этому не привыкли.
Посмотрев на ваш вопрос и проведя тесты для bash , я удивлен, что он демонстрирует такое же поведение. Перевод ELisp сверху на bash:
[grochmal@phoenix ~]$ myvar () { echo $(($1+3)); }
[grochmal@phoenix ~]$ myvar=7
[grochmal@phoenix ~]$ myvar $myvar
10
Bash немного менее запутан в этом, чем ELisp, потому что вам нужен $
, чтобы пометить переменную. Тем не менее, это может выглядеть как declare
одного имени, состоящего из двух вещей. См.:
[grochmal@phoenix ~]$ declare -p myvar
declare -x myvar="7"
[grochmal@phoenix ~]$ declare -f myvar
myvar ()
{
echo $(($1+3))
}
(П.С. Как только вы привыкнете к существованию двух пространств имен, например. вы программируете на ELisp какое-то время, это перестает сбивать с толку)