2010-10-02 24 views
6

¿Hay alguna forma de verificar si existe una variable en Scheme? Incluso hacer cosas como (si es variable) o (variable nula) causa errores porque la variable no está definida. ¿Hay alguna función que devuelva si existe o no una variable?¿Cómo puedo verificar si existe una variable en Scheme?

+3

¿Por qué necesitarías esto alguna vez? – Paul

+2

@Paul: Eso no responde la pregunta. –

+0

Es por eso que lo publiqué como un comentario y no como una respuesta. – Paul

Respuesta

2

De acuerdo con R6RS, es una violación de sintaxis hacer una llamada a una variable independiente.

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

Sin embargo, dependiendo de su aplicación no debería ser una forma (teóricamente, al menos) para consultar el medio ambiente y comprobar si una variable es un miembro. Sin embargo, necesitarías leer un poco más para eso.

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

+1

Sin embargo, las implementaciones del compilador R6RS pueden rechazar la compilación de programas que tienen violaciones de sintaxis. Dudo que esto sea parte de R7RS tampoco. –

3

He aquí un ejemplo de la raqueta:

#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

¿Quieres hacer preguntas al medio ambiente. Esto no es posible con R5RS, y no estoy seguro acerca de R6RS. Ciertamente me gustaría hacer eso usando solo el estándar Scheme (y este puede ser parte de R7RS - busque "Consultas ambientales" en el list of items they are likely going to work on).

Por lo que puedo decir, actualmente solo hay soluciones ad-hoc, así que tendrás que leer la documentación de tu implementación.

Pollo admite que con el huevo oblist (le permite obtener una lista de todos los símbolos internados), y también con el environments huevo, lo que le permite preguntar específicamente si un símbolo está vinculado.

Dependiendo de su implementación, si es posible probarlo haciendo una referencia a la variable y atrapando una excepción, luego verificando si se trata de una excepción no encuadernada, o algo similar a eso.

2

Esta característica está incorporada en Mit-Scheme.

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