From: Timothy J H. <tjh...@br...> - 2006-01-10 21:43:20
|
Hi mik, On Jan 10, 2006, at 3:10 PM, Michael Thome wrote: > What is the "proper" way to test to see if a symbol is bound? There is no proper way, as far as I can tell. > > I was expecting something like (bound? 'foo). If you have created a scheme environment using the jscheme.JScheme constructor, then there is an isDefined method which tests whether a symbol is defined in that interpreter, e.g. > [Timothy-Hickeys-Computer:~/Research/Software/jscheme] tim% java -jar > lib/jscheme.jar > JScheme 7.2 (1/10/06 8:55 AM) http://jscheme.sourceforge.net > > (define js (jscheme.JScheme.)) ;; create a new scheme interpreter > $1 = jscheme.JScheme@5db13f > > > (.eval js '(define x 1)) ;; evaluate a define in that interpreter > $2 = 1 > > > (.isDefined js "x") ;; check to see if the symbol corresponding to > the string "x" is defined in that interpreter > $3 = #t > > > (.isDefined js "y") ;; notice that "y" is not defined > $4 = #f > > > (.isDefined 'x) ;; also notice that 'x is not defined in the > toplevel Scheme environment, only in js > $5 = #f > > > (.eval js 'x) ;; we can get the value of 'x in js using eval > again.... > $6 = 1 > If you want to check whether a symbol is defined in the toplevel then (.isDefined 'foo) works fine. You could also use a macro with tryCatch to test for defined-ness without having to quote the symbol... > > (tryCatch (begin x #t) (lambda(e) #f)) > $7 = #f > > > (define-macro (isDefined s) `(tryCatch (begin ,s #t) (lambda(e) #f))) > $8 = (macro isDefined (s)...) > > > (isDefined sin) > $9 = #t > > > (isDefined sine) > $10 = #f I like the try/Catch approach better because the (.isDefined 'x) relies on the implementation of the Symbol.java class in the jsint package, which could conceivably change at some point, whereas the tryCatch approach relies only on the syntax of macros and tryCatch and the fact that evaluating an undefined symbol generates an exception.... But, using (.isDefined 'foo) is ten times faster then the tryCatch approach ... > > > (time (isDefined foo) 100000) > $10 = (#f (2929 msec) (367880 bytes)) > > > (time (.isDefined 'foo) 100000) > $11 = (#f (211 msec) (135856 bytes)) Does that help?? Best, ---Tim--- |