2010-11-16 30 views

Trả lời

24
user> (resolve 'foo) 
nil 
user> (def foo 3) 
#'user/foo 
user> (resolve 'foo) 
#'user/foo 
+0

Brilliant, làm việc lần đầu tiên. Cảm ơn! :) – Zubair

6

resolve hoặc ns-resolve có thể làm những gì bạn đang tìm kiếm:

user> (def a 1) 
#'user/a 
user> (def b) 
#'user/b 
user> (resolve 'a) 
#'user/a 
user> (resolve 'b) 
#'user/b 
user> (resolve 'c) 
nil 

để có được một boolean:

user> (boolean (resolve 'b)) 
true 

EDIT: theo nhận xét của MayDaniel, đây không phải là chính xác những gì bạn yêu cầu, nhưng nó sẽ giúp bạn có được ở đó. Dưới đây là một thực hiện bounded? (có lẽ không phải là tên tốt nhất):

(defn bounded? [sym] 
    (if-let [v (resolve sym)] 
    (bound? v) 
    false)) 

user> (map bounded? ['a 'b 'c]) 
(true false false) 
+1

Vâng, không. 'b được giải quyết, nhưng nó không bị ràng buộc. Đây không phải là những gì người hỏi muốn. – MayDaniel

+1

Bạn nói đúng. Sửa đổi –

+0

Tôi nghĩ rằng nó sẽ là hiếm hoi mà một trong những thực sự sẽ cần 'true' và' false'. Vì 'resolve' trả về giá trị trung thực nếu biểu tượng bị ràng buộc và giá trị falsey,' nil', nếu nó không được gắn kết, người ta thường có thể sử dụng 'resolve' như là. '(if (resolve 'c)" Biểu tượng bị ràng buộc, dude. "" Whaa ?? Ký hiệu đó không bị ràng buộc! ")' – Mars

2

có thể sử dụng tìm-var cho điều này

(bound? (find-var 'user/y)) 
+0

Điều này trả về một ngoại lệ con trỏ null nếu 'y' bị hủy trong' user', bởi vì 'find- var' trả về 'nil' trong trường hợp đó. – Mars

Các vấn đề liên quan