Как я могу проверить, существует ли переменная в схеме? - PullRequest
8 голосов
/ 02 октября 2010

Есть ли способ проверить, существует ли переменная в схеме? Даже такие вещи, как (если переменная) или (нулевая? Переменная) вызывают ошибки, потому что переменная не определена. Есть ли какая-нибудь функция, которая возвращает значение переменной или нет?

Ответы [ 4 ]

3 голосов
/ 06 мая 2014

Эта функция встроена в Mit-Scheme.

#lang scheme   
(define x "hello world")
(environment-bound? (nearest-repl/environment) 'x)
(environment-bound? (nearest-repl/environment) 'not-x)
3 голосов
/ 03 октября 2010

Вот пример в Racket:

#lang racket
(define x 1)
(define-namespace-anchor ns)
(define (is-bound? nm)
  (define r (gensym))
  (not (eq? r (namespace-variable-value nm #t
                                            (lambda () r) 
                                            (namespace-anchor->namespace ns)))))

(is-bound? 'x)
(is-bound? 'not-bound-here)
3 голосов
/ 09 октября 2010

Вы хотите задавать вопросы окружающей среде. Это невозможно с R5RS, и я не уверен насчет R6RS. Я, конечно, хотел бы сделать это, используя только стандарт Scheme (и это может быть частью R7RS - ищите "Запросы окружения" в списке пунктов, над которыми они, вероятно, будут работать ).

Насколько я могу судить, в настоящее время есть только ad-hoc решений для этого, поэтому вам придется прочитать документацию вашей реализации.

Цыпленок поддерживает это с яйцом oblist (оно позволяет получить список всех интернированных символов), а также с яйцом environments, которое позволяет вам конкретно спрашивать, связан ли один символ.

В зависимости от вашей реализации, если возможно, это можно проверить, сделав ссылку на переменную и поймав исключение, а затем проверив, было ли это необязательным исключением или чем-то подобным.

2 голосов
/ 02 октября 2010

Согласно R6RS, это синтаксическое нарушение для вызова несвязанной переменной.

http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-12.html#node_sec_9.1

Однако, в зависимости от вашей реализации, должен быть способ (теоретически, вминимум) запросить среду и проверить, является ли переменная членом.Однако для этого вам нужно еще кое-что почитать.

http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-17.html#node_idx_1268

...