2010-07-16 15 views
7

मैं यह जांचने में सक्षम होना चाहता हूं कि इसे एक्सेस करने से पहले एक चर परिभाषित किया गया है या नहीं।मैं कैसे परीक्षण कर सकता हूं कि एक संदर्भ को संदर्भित करने से पहले परिभाषित किया गया है या नहीं?

मुझे एक वैश्विक होना पसंद है जो "डीबग स्तर" निर्दिष्ट करता है। यदि डीबग स्तर 0 है, तो कोई अतिरिक्त आउटपुट नहीं दिया जाता है। 1 से अधिक होने पर, डीबग आउटपुट दिया जाता है, अधिक संख्या में अधिक verbosity के साथ।

मैं इसे भी सेट अप करना चाहता हूं ताकि प्रक्रियाएं चलें, और स्तर 0 मान लें, अगर मैं इसे परिभाषित करने के लिए नहीं मिला था। कुछ की तरह:।। (जहां defined? जादू है मैं कैसे करना है पता नहीं है

(if (and (defined? debug-level) (> debug-level 1)) 
    (diplay "Some debugging info")) 

मैं The Scheme Programming Language, 4th Edition में रूपों में से सारांश के माध्यम से ध्यान दिया है केवल एक ही है कि मैंने देखा के रूप में एक संभावना identifier? था यह किया । काम नहीं

मैं SISC 1.16.6 उपयोग कर रहा हूँ और Chez छोटा योजना v8 (R6RS अनुपालन का दावा है)

संपादित मैं की तरह एक guard साथ eval लपेटकर की कोशिश की (R5RS अनुपालन का दावा है):

(guard (x (else #f)) (eval 'debug-level)) 

'debug-level उद्धृत किया गया है, इसका मूल्यांकन किया जा सकता है और eval पर पास किया जा सकता है। फिर जब eval इसका मूल्यांकन करने का प्रयास करता है, तो एक त्रुटि होगी, जिसे मैंने आशा की थी कि guard पकड़ लेंगे। ऐसा नहीं हुआ

संपादित 2 मुझे एहसास हुआ कि मैं डिबग एक अलग प्रक्रिया में अनुरेखण रैप करने के लिए चाहता था और उस फ़ाइल को परिभाषित करता है कि कि प्रक्रिया भी एक अलग प्रक्रिया का उपयोग कर के लिए की 0. कारणों में एक डिफ़ॉल्ट debug-level परिभाषित कर सकते हैं कम करने के लिए कर रहे हैं काम करने वाली प्रक्रियाओं में लाइनों की संख्या और आवश्यकता होने पर डीबग आउटपुट के पुनर्निर्देशन की अनुमति देने के लिए।

उत्तर

4

यह पूरी तरह कार्यान्वयन प्रदान करने के लिए पर निर्भर है, और इस तरह के अधिकांश प्रयोगों को संतोषजनक ढंग से यह प्रदान नहीं करते हैं यह लग रहा है।

SISC योजना में, ऐसा लगता है कि आप इस आशय का GETPROP उपयोग कर सकते हैं लग रहा है, लेकिन वातावरण को अपने आप अपडेट नहीं ओह, देखो, इस बात सहभागिता-पर्यावरण कहा जाता है कि आप उपयोग कर सकते हैं:

 
#;> (getprop 'cons (interaction-environment)) 
#<native procedure cons> 
#;> (getprop 'x (interaction-environment)) 
#f 
#;> (define x 100) 
#;> (getprop 'x (interaction-environment)) 
100 

लेकिन यह केवल शीर्ष स्तर पर काम करता है।

 
#;> (define (foo y) 
    (let ((e (interaction-environment))) 
    (display "Is X bound? ") (display (getprop 'x e)) 
    (newline) 
    (display "Is Y bound? ") (display (getprop 'y e)) 
    (newline))) 
#;> (foo 1) 
#;> Is X bound? 100 
Is Y bound? #f 

Chez के लिए आप TOP-LEVEL-BOUND? और बातचीत-पर्यावरण फिर से की है।

+0

धन्यवाद। मुझे डर था कि जवाब व्यापक रूप से पोर्टेबल नहीं होगा, यह आर 6 आरएस या कार्यान्वयन विशिष्ट में कुछ नया होगा। +1, लेकिन मैं इस उत्तर की उम्र को थोड़ी देर देने जा रहा हूं, यह देखने के लिए कि क्या सही विचार स्वीकार करने से पहले कोई बेहतर विचार पोस्ट किया गया है या नहीं। –

1

थोड़ा बैकअप लेने के लिए एक defined? समारोह के साथ समस्या यह है कि यदि आप लिखना

(defined? debug-level) 

योजना debug-level मूल्यांकन करने के लिए है, जो निश्चित रूप से एक त्रुटि है, क्योंकि यह परिभाषित नहीं है प्रयास करता है। इस तरह के एक फॉर्म को एक विशेष मामले के रूप में संकलक/दुभाषिया द्वारा आंतरिक रूप से कार्यान्वित किया जाना होगा।

इस तरह के एक विशेष रूप R5RS मानक का हिस्सा नहीं है (जब तक मैं इसे याद किया, कृपया double-check)। तो आर 5 आरएस योजनाओं के संबंध में आप भाग्य से बाहर हैं जबतक कि आपको कोई ऐसी योजना न मिल जाए जो इसे गैर-मानक विस्तार के रूप में लागू करे।

+0

मैं एक फ़ंक्शन 'परिभाषित' नहीं मांग रहा था, क्योंकि, जैसा कि आप कहते हैं, एक फ़ंक्शन काम नहीं करेगा। लेकिन एक समारोह 'if' के लिए काम नहीं करेगा, और फिर भी योजना' if' है। अन्य कार्यक्षेत्रों में, एक विशेष रूप की तलाश, या परिणामों को प्राप्त करने का अन्य तरीका। (मैक्रो शायद?) –

+1

ज़रूर। जो मैं कहने की कोशिश कर रहा था वह यह है कि यह अंतर्निहित रूपों में से एक होना चाहिए जो भाषा प्रदान करता है, जैसे 'if', और spec (कम से कम R5RS) में एक शामिल नहीं है। –

2

R5RS के लिए क्लंकी लेकिन व्यावहारिक समाधान। कीवर्ड को फिर से परिभाषित करने के लिए चलो-सिंटैक्स की अक्सर उपेक्षा/भूल गई क्षमता का उपयोग करें। यह घबराहट है क्योंकि आपकी पूरी फाइल को लेट-सिंटैक्स में लपेटा गया है और क्योंकि यह प्रत्येक परिभाषित करने के लिए कुछ ओवरहेड जोड़ता है। मैं परिभाषाओं को याद रखने के लिए एक सहयोगी सूची का उपयोग करता हूं, एक हैश टेबल एक शर्त विकल्प होगा।

(define define-list '()) 
(define define-list-add 
    (lambda (key value) 
    (set! define-list (cons `(,key ,value) define-list)))) 

(let-syntax (
      (define (syntax-rules() 
         ((_ (pro-name args ...) body ...) 
         (begin 
          (define (pro-name args ...) body ...) 
          (define-list-add pro-name '((pro-name args ...) body ...)))) 
         ((_ pro-name pro) (begin 
              (define pro-name pro) 
              (define-list-add 'pro-name 'pro))) 

         )) 
      (defined? 
       (syntax-rules() 
       ((_ sym) (begin (if (assoc (quote sym) define-list) #t #f))))) 
      ) 
    (define y (lambda() x)) 

    (display (defined? y)) 
    (newline) 
    (display (defined? x)) 
) 

प्रिंट

#t 
#f 

रैकेट में नीचे: एक मॉड्यूल प्रत्येक प्रतीक और परिभाषा परिभाषित-सूची नामक सूची में स्टोर करने के लिए परिभाषित को फिर से परिभाषित किया जाता है। मैक्रो परिभाषित किया गया? यह सूची देखने के लिए कि क्या मौसम या प्रतीक परिभाषित नहीं किया गया है।

(module qdefine mzscheme 
    (provide ;(all-from-except mzscheme let) 
    (rename define olddefine) 
    (rename quote-define define) 
    defined?) 

    (define define-list '()) 
    (define define-list-add 
    (lambda (key value) 
     (set! define-list (cons `(,key ,value) define-list)))) 

    (define-syntax quote-define 
    (syntax-rules() 
     ((_ (pro-name args ...) body ...) 
     (begin 
     (define (pro-name args ...) body ...) 
     (define-list-add pro-name '((pro-name args ...) body ...)))) 
     ((_ pro-name pro) (begin 
          (define pro-name pro) 
          (define-list-add 'pro-name 'pro))) 

    )) 

    (define-syntax defined? 
    (syntax-rules() 
     ((_ sym) (begin (if (assoc (quote sym) define-list) #t #f))))) 
) 
(require 'qdefine) 

(define y (lambda() x)) 

(defined? y) 
(defined? x) 

गुइल में यह अभी परिभाषित किया गया है? जाहिर है: http://www.delorie.com/gnu/docs/guile/guile_289.html

+1

रैकेट में इस तरह कुछ करने के लिए प्रतिबिंब उपकरण होते हैं, लेकिन ऐसी चीजें ('इंटरैक्शन-पर्यावरण', जो भी गुइल करता है, इत्यादि सहित) हमेशा कमजोर प्रकार के समाधान होते हैं, जो एक तरफ या किसी अन्य से पीड़ित होते हैं। पोर्टेबल समाधान के लिए –

+0

+1। –

संबंधित मुद्दे

 संबंधित मुद्दे