2015-09-08 11 views
6

के लिए इनपुट प्रकारों को लागू करता है मैं रैकेट में किसी फ़ंक्शन में इनपुट के लिए डेटा प्रकार को लागू करना चाहता हूं। उदाहरण के लिए, इस फ़ंक्शन में मैं पूर्णांक की अपेक्षा करना चाहता हूं और कोई स्ट्रिंग इनपुट करता है तो कोई त्रुटि फेंकना चाहता हूं।रैकेट फ़ंक्शन

क्या रैकेट में इसे लागू करने का कोई मानक तरीका है?

(sum-coins pennies nickels dimes quarters) 
    pennies : integer? 
    nickels : integer? 
    dimes : integer? 
    quarters : integer? 

उत्तर

8

हां, दो मानक तरीके हैं।

संविदा

Contracts जांच की स्थिति और रनटाइम पर त्रुटियों बढ़ा:

#lang racket 

(define/contract (sum-coins pennies nickels dimes quarters) 
    (-> integer? integer? integer? integer? integer?) 
    (+ (* 1 pennies) 
    (* 5 nickels) 
    (* 10 dimes) 
    (* 25 quarters))) 

(sum-coins 1 2 3 4) 
;; => 141 
(sum-coins "1" 2 3 4) 
; sum-coins: contract violation 
; expected: integer? 
; given: "1" 
; in: the 1st argument of 
;  (-> 
;  integer? 
;  integer? 
;  integer? 
;  integer? 
;  integer?) 
; contract from: (function sum-coins) 
; blaming: /tmp/so.rkt 
; (assuming the contract is correct) 
; at: /tmp/so.rkt:3.18 
; Context (errortrace): 
; /tmp/so.rkt:11:0: (sum-coins "1" 2 3 4) 
; /tmp/so.rkt:11:0: (sum-coins "1" 2 3 4) 

Typed रैकेट

या आप Typed Racket, जो संकलन समय पर प्रकार की जांच करता है का उपयोग कर सकते हैं:

#lang typed/racket 

(define (sum-coins [pennies : Integer] 
        [nickels : Integer] 
        [dimes : Integer] 
        [quarters : Integer]) 
    (+ (* 1 pennies) 
    (* 5 nickels) 
    (* 10 dimes) 
    (* 25 quarters))) 

(sum-coins 1 2 3 4) 
;; => 141 
(sum-coins "1" 2 3 4) 
; /tmp/so2.rkt:14:11: Type Checker: type mismatch 
; expected: Integer 
; given: String 
; in: "1"