Это возможно с кавычками:
(define (symtab s)
(cons s (eval s (interaction-environment))))
Теперь давайте проверим это:
(define xy 12)
(symtab 'xy)
=> (xy . 12)
РЕДАКТИРОВАТЬ: Однако это не очень надежно (также с использованием макросов) - пожалуйста, прочитайте тесно связанные Почему нет unquote
Примитив Lisp?
Это потому, что Scheme, как и большинство языков, имеет лексическую область видимости. Это означает, что имена переменных разрешаются при определении функции, в отличие от динамической области действия, когда имена переменных разрешаются во время выполнения. Так
(define xy 12)
(define (getXY) xy)
(getXY)
=> 12
Этот код работает, потому что когда мы определяем getXY
, имя xy
известно и может быть разрешено до верхнего уровня xy
. Тем не менее
(define (getXY) xy)
(let ((xy 21))
(getXY))
=> Unbound variable: xy
Это не работает, потому что когда было определено getXY
, xy
не было известно (и моя схема Guile также дала мне предупреждение при определении getXY
"предупреждение: возможно, несвязанная переменная" xy "" ).
Он будет работать в Emacs Lisp - динамически ограниченный.