¿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?
Respuesta
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
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. –
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)
¿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.
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)
- 1. ¿Cómo puedo verificar si existe una cadena en otra cadena?
- 2. ¿Cómo puedo verificar si existe una cadena en una matriz?
- 3. ¿Cómo puedo verificar si existe un directorio?
- 4. ¿cómo puedo verificar si existe un archivo?
- 5. C# ¿Cómo puedo verificar si existe una URL/es válida?
- 6. ¿Cómo verificar si existe una clave appSettings?
- 7. ¿Cómo verificar si existe una propiedad?
- 8. ¿Puedo verificar si existe un archivo en una URL?
- 9. ¿Puedo verificar si existe un archivo en una URL?
- 10. ¿Cómo verificar si existe una variable con un valor sin "variable o método local indefinido"?
- 11. ¿Cómo puedo verificar si existe un buffer actual en Emacs?
- 12. ¿Cómo puedo verificar si existe un procedimiento en un paquete?
- 13. ¿Cómo puedo verificar si existe un archivo en Perl?
- 14. ¿Cómo puedo verificar si un atributo existe en XmlAttributeCollection?
- 15. ¿Cómo puedo verificar si el archivo existe en Makefile?
- 16. ¿Cómo undefine una variable en Scheme?
- 17. Averiguar si existe una variable
- 18. ¿Cómo verificar si existe una restricción en el servidor Sql?
- 19. ¿Cómo puedo verificar si existe o no un recurso incrustado?
- 20. ¿Cómo puedo verificar si existe un nombre de usuario dado?
- 21. java: ArrayList: ¿cómo puedo verificar si existe un índice?
- 22. ¿Cómo verificar si existe una clave en ** kwargs?
- 23. ¿Cómo puedo verificar si existe un archivo usando Emacs Lisp?
- 24. ¿Cómo verificar si una variable está cargada en JavaScript?
- 25. ¿Cómo debo verificar si existe Gravatar?
- 26. ¿Cómo verificar si existe una carpeta en Cocoa & Objective-C?
- 27. ¿Cómo verificar una DLL si existe una función?
- 28. ¿Cómo verificar si una variable enum es válida?
- 29. ¿Cómo verificar si existe un cierto ensamblaje?
- 30. ¿Cómo verificar si una variable está vacía en python?
¿Por qué necesitarías esto alguna vez? – Paul
@Paul: Eso no responde la pregunta. –
Es por eso que lo publiqué como un comentario y no como una respuesta. – Paul