2013-05-11 6 views
7

मैं (कॉल-सीसी) विधि का उपयोग कर योजना में एक प्रयास-पकड़ ब्लॉक को लागू करने की कोशिश कर रहा हूं लेकिन मुझे यकीन नहीं है कि इसका उपयोग कैसे किया जा सकता है। मुझे कोई उदाहरण नहीं मिला।योजना में एक प्रयास-पकड़ ब्लॉक को कैसे कार्यान्वित करें?

और पाए गए उदाहरणों में केवल त्रुटि-हैंडलिंग है लेकिन मैं क्या करना चाहता हूं: यदि कोई त्रुटि हुई है, तो योजना कार्यक्रम को प्रोग्राम को निलंबित किए बिना उपयोगकर्ता को (उदाहरण के लिए प्रदर्शन के माध्यम से) संदेश देना होगा।

क्या यह संभव है?

उत्तर

6

जब से तुम इस तरह दोनों raise द्वारा उठाए गए लोगों के रूप में सभी त्रुटियों, को पकड़ने के लिए चाहते हैं और raise-continuable तुम दोनों एक आवश्यकता होगी अपवाद हैंडलर (उठाए गए परिस्थितियों से निपटने के लिए) और बाहर निकलने की निरंतरता (के साथ जारी रखने से बचने के लिएशरीर)। try के लिए सरल वाक्य रचना होगा:

(import (rnrs base)   ; define-syntax 
     (rnrs exceptions))  ; get `with-exception-handler` 

(define-syntax try 
    (syntax-rules (catch) 
    ((_ body (catch catcher)) 
    (call-with-current-continuation 
     (lambda (exit) 
     (with-exception-handler 
     (lambda (condition) 
      catcher 
      (exit condition)) 
     (lambda() body))))))) 

यह, के रूप में इस्तेमाल किया जाता है, उदाहरण के लिए:

> (try (begin (display "one\n") 
       (raise 'some-error) 
       (display "two\n")) 
    (catch (display "error\n"))) 
one 
error 
some-error  # the return value. 

नोट: इस R6RS (और R7RS) योजना है।

+0

उत्तर के लिए धन्यवाद! यही वह है जिसे मैं ढूंढ रहा था लेकिन 'अपवाद-हैंडलर नहीं मिला। रैकेट में और r6rs में भी। – Asqan

+0

ठीक है, मैंने Ikarus में कोड चलाया ... 'अपवाद-हैंडलर' (आरएनआर अपवाद) पुस्तकालय में पाया जाता है। अद्यतन उत्तर देखें। सेक्शन 7.1, पेज 24 या आर 6 आरएस-लिब प्रलेखन देखें। – GoZoner

+0

धन्यवाद! यहां (http://docs.racket-lang.org/r6rs/) रैकेट में आप (आरएनआर अपवाद) का उपयोग कैसे करते हैं। – GoZoner

11

आमतौर पर आप with-handlers फ़ॉर्म का उपयोग करेंगे। यह आपको एक त्रुटि संदेश प्रदर्शित करने से पहले एक त्रुटि संदेश प्रदर्शित करने या किसी अन्य कार्रवाई करने देता है।

#lang racket 

(define (foo x) 
    (with-handlers ([exn:fail? (lambda (exn) 
           (displayln (exn-message exn)) 
           #f)]) 
    (/ 1 x))) 

(foo 1) 
; 1 
(foo 0) 
; "/: division by zero" 
; #f 

तुम सच में किसी कारण से सीधे एक निरंतरता का उपयोग करना चाहते हैं, तो आप एक त्रुटि/छुटकारा सामान्य call/cc के बजाय जारी रखने के लिए call/ec इस्तेमाल कर सकते हैं।

डॉक्स:

+0

कोशिश-पकड़ अधिक स्वच्छ क्वा समझदारी है लेकिन अपवाद हैंडलिंग का यह तरीका अधिक आसान लगता है; और मैं इसका उपयोग करूंगा मुझे लगता है :) उत्तर के लिए धन्यवाद! – Asqan

+3

आप आसानी से एक मैक्रो लिख सकते हैं जो 'हैंडलर' का उपयोग करता है लेकिन कोशिश करने की तरह दिखता है: '(परिभाषित-वाक्यविन्यास प्रयास (वाक्यविन्यास-नियम (पकड़) [(_ ई (पकड़ [पूर्व संभाल] ...)) (साथ-हैंडलर ([pred handle] ...) ई)])) –

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