2010-10-02 6 views
6

Czy istnieje sposób sprawdzenia, czy zmienna istnieje w Scheme? Nawet robienie rzeczy takich jak (jeśli zmienna) lub (zmienna zerowa) powoduje błędy, ponieważ zmienna nie jest zdefiniowana. Czy istnieje funkcja zwracająca czy zmienna istnieje, czy nie?Jak mogę sprawdzić, czy zmienna istnieje w Scheme?

+3

Dlaczego miałbyś kiedykolwiek tego potrzebować? – Paul

+2

@Paul: To nie odpowiada na pytanie. –

+0

Dlatego napisałem to jako komentarz, a nie jako odpowiedź. – Paul

Odpowiedz

2

Według R6RS złamanie składni powoduje wywołanie zmiennej niezwiązanej.

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

Jednakże, w zależności od implementacji nie powinno być sposobem (teoretycznie przynajmniej) do kwerendy środowiska i sprawdzić, czy zmienna jest członkiem. Trzeba by jednak do tego jeszcze dołożyć.

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

+1

Jednak implementacje kompilatorów R6RS mogą odmówić kompilacji programów, w których występują naruszenia składni. Wątpię, żeby to było częścią R7RS. –

3

Oto przykład w 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

chcesz zadać pytania do środowiska. Nie jest to możliwe w przypadku R5RS i nie jestem pewien co do R6RS. Z pewnością chciałbym to zrobić, używając tylko standardu Scheme (i to może być częścią R7RS - poszukaj "Zapytań środowiskowych" w list of items they are likely going to work on).

O ile mi wiadomo, obecnie dostępne są tylko rozwiązania ad-hoc, więc będziesz musiał przeczytać dokumentację implementacji.

Kurczak obsługuje jajkiem (pozwala uzyskać listę wszystkich internowanych symboli), a także jajkiem environments, co pozwala precyzyjnie zapytać, czy jeden symbol jest powiązany.

W zależności od implementacji, jeśli jest to możliwe, można to sprawdzić, odwołując się do zmiennej i przechwytując wyjątek, a następnie sprawdzając, czy jest to wyjątek związany, czy coś podobnego.

2

Ta funkcja jest wbudowana w Mit-Scheme.

#lang scheme 
(define x "hello world") 
(environment-bound? (nearest-repl/environment) 'x) 
(environment-bound? (nearest-repl/environment) 'not-x)