Может ли функция схемы вернуть глобальный символ и его значение? - PullRequest
0 голосов
/ 19 ноября 2018

Можно ли написать функцию схемы symtab ниже?

(define x 1)
(define y 2)
(symtab x) ; => (x . 1)
(symtab y) ; => (y . 2)

Если это невозможно, можно ли определить аналогичную функцию с аргументами в кавычках?

(symtab 'x) ; => (x . 1)
(symtab 'y) ; => (y . 2)

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Это возможно с кавычками:

(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 - динамически ограниченный.

0 голосов
/ 19 ноября 2018

Да, с макросами.

> (define-syntax symtab
  (syntax-rules ()
    ((_ x)
     (cons 'x x))))

> (define x 1)
> (define y 2)
> (symtab x) 
'(x . 1)
> (symtab y)
'(y . 2)
> 

Макрос на самом деле не является функцией (поэтому технически существенный ответ на ваш вопрос - нет).С простыми функциями ваша задача может быть даже невозможна на большинстве языков.Но Scheme предоставляет нам макросы, которые позволяют нам манипулировать программой изнутри.Чтобы узнать больше о макросах и о том, чем они отличаются от функций, я рекомендую взглянуть на следующий учебник: http://www.greghendershott.com/fear-of-macros/all.html#%28part..Transform%29

Он основан на Racket, но в значительной степени применим к различным диалектам Схемы.Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...