मुझे लगता है कि आप कम से कम एक है, और शायद निम्न दोनों कम पड़ रहा है:
का उपयोग (provide (contract-out ....))
का मतलब अनुबंध केवल मॉड्यूल सीमा पर लागू होता है - केवल अन्य मॉड्यूल require
इस के लिए एक। तो यदि आपका परीक्षण उदाहरण एक ही मॉड्यूल में था, तो अनुबंध लागू नहीं होगा। इसके बजाय आप define/contract
का उपयोग उस अनुबंध पर लागू करने के लिए कर सकते हैं, दोनों मॉड्यूल में जहां यह परिभाषित किया गया है और बाहर provide
है।
एक special form of contracts for struct
s है, जिसमें आप प्रत्येक फ़ील्ड के लिए अनुबंध निर्दिष्ट करते हैं। आपने ऊपर जो कोशिश की वह केवल कन्स्ट्रक्टर फ़ंक्शन पर अनुबंध है। यद्यपि हो सकता है जो आप चाहते हैं, struct
के लिए अनुबंध का उपयोग करने पर विचार करें।
संयोजन दोनों तुम कर सकते हो:
;; Define the contract on the struct itself.
;; Contract is used even within this module.
(provide car)
(define-struct/contract car ([model string?]
[year integer?]))
आप मॉड्यूल सीमा पर केवल लागू करने के लिए अनुबंध किया था चाहते हैं, तो आप का प्रयोग करेंगे:
;; Define the contract only as `provide`d.
;; Contract is used only for code `require`-ing this module.
(provide (contract-out (struct car ([model string?]
[year integer?]))))
(struct car (model year))
पी.एस. रैकेट में FWIW सामान्य शैली संरचना नाम को कैपिटल करने के लिए car
Car
नहीं है।
अद्यतन: बस अंतर अधिक स्पष्ट रूप से वर्णन करने के लिए:
#lang racket
(module mod racket
(provide car0)
(define-struct/contract car0 ([model string?]
[year integer?]))
(car0 "foo" "bar") ;; gives contract violation
;; because contract on struct itself
(struct car1 (model year))
(provide (contract-out (struct car1 ([model string?]
[year integer?]))))
(car1 "foo" "bar") ;; does NOT give contract violation
;; because contract only on the `provide`
)
(require 'mod)
(car0 "foo" "bar") ;; gives contract violation
(car1 "foo" "bar") ;; gives contract violation
स्रोत
2013-06-09 17:04:55
BTW ठेके के बारे में अच्छी बात यह है कि वे एक C/C++ अर्थ में "प्रकार" तक ही सीमित नहीं रहे हैं। उदाहरण के लिए यदि 1769 में ऑटोमोबाइल का आविष्कार किया गया था, तो 'वर्ष' के लिए आपका अनुबंध' (और/c पूर्णांक? (>/C 1768) हो सकता है) 'केवल' पूर्णांक 'के बजाय '। ;) –
बहुत बहुत धन्यवाद, यह पूरी तरह से काम किया :) – TesX