2011-05-02 8 views
7

मैं रैकेट और एमआईटी योजना में निम्न कोड के साथ कोशिश कर रहा था होता है की जाँच करने के लिए, मुझे आश्चर्य है कि संकलक फेंक गलतीकैसे करता है, तो एक सूची केवल #t

(foldr and #t '(#t #t #f)) 

वहाँ किसी भी तरह से कम करने का उपयोग करने के/गुना रास्ता नहीं है यह जांचने के लिए कि क्या सूची में केवल सत्य या गलत है? मुझे पता है कि एक लैम्ब्डा नौकरी कर सकता है, लेकिन यह वास्तव में हमें आश्चर्य है कि यह वैध कोड क्यों नहीं है। मुझे याद है कि मैं इसे हास्केल में कर सकता हूं .....

टीआईए।

+0

आपने क्या त्रुटि संदेश मिला? – brandizzi

+0

योजना और रैकेट बिल्कुल समान नहीं हैं, लेकिन आपको [समाधान में लागू फ़ंक्शन का उपयोग करके] का उपयोग करना पड़ सकता है (http://stackoverflow.com/q/387775/1281433)। –

उत्तर

8

and एक मैक्रो है, इसलिए इसका कोई मूल्य नहीं है। विशेष रूप से, यह शॉर्ट-सर्किट मूल्यांकन, और इसका उपयोग करने के रूप में आपने कोई समझ नहीं लिया है। इसी कारण से, रैकेट में andmap है जिसका आप इस तरह के मामलों में उपयोग कर सकते हैं। (अन्य कार्यान्वयन विभिन्न नामों के तहत इसी तरह की सुविधा है - उदाहरण के लिए, srfi -1 every उपयोग करता है।)

+0

लघु-सर्किटिंग मूल्यांकन आवश्यक रूप से फोल्ड करने में असमर्थ होने का अर्थ नहीं है। ओपी दुष्प्रभावों के लिए नहीं पूछ रहा है। यदि मैं प्रारंभिक मान और पहला तत्व हूं, तो मुझे या तो सत्य या गलत होना चाहिए। 'और' दूसरे तत्व के साथ ऐसा करना चाहिए, आदि – drysdam

+0

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

+0

फिर दूसरा तरीका है: (कोशिश करें) दोनों 'और' दोनों समान अर्थशास्त्र साझा करते हैं - एक और अच्छी तरह से धोखा विचार ... एक तरफ आपको कुछ आश्चर्य मिलते हैं (या तो 'फ़ोल्डल' एक विशेष रूप बन जाता है, या आप गैर-शॉर्ट-सर्किटिंग व्यवहार पर वापस आते हैं), और अधिक महत्वपूर्ण पक्ष पर, आप ... fexprs, और सभी मज़ेदार हैं जो इसका तात्पर्य है। –

1

इस छल में काम करता है:

(primitive-eval (cons 'and '(#t #f))) 
+0

योजना के लिए अभी भी नया है जो कई कार्यान्वयन में काम करता है (रैकेट में आप 'eval' का उपयोग करेंगे), लेकिन यह अन्य कारणों से एक बुरा विचार है। (उदाहरण के लिए, या तो आप आश्चर्यचकित करते हैं कि '(चलो ((x 1)) (eval (cons' और '(x))))' काम नहीं करता है, या आप ऐसी चीजों से बचते हैं जो आपको 'andmap'/'हर 'जैसी कार्यक्षमता।) –

+0

निश्चित रूप से यदि मैंने एक स्ट्रिंग * के रूप में सूची * बनाई है और फिर स्ट्रिंग का मूल्यांकन किया है तो यह काम करेगा। मैंने सोचा कि लिस्प का पूरा बिंदु यह था कि कार्यक्रम और डेटा एक ही सामान हैं। – drysdam

+0

नहीं, एक स्ट्रिंग से कोड का मूल्यांकन करने के लिए एक ही समस्या है।उनसे बचने का मेरा मतलब बाइंडिंग के किसी भी संदर्भ से परहेज करना है - और यह आपको वैल्यू की सूची को कम करने की सादे क्षमता के साथ छोड़ देता है, वैसे ही 'एंडमैप' करता है। –

7

और एक मैक्रो है और एक समारोह के रूप में इस्तेमाल नहीं किया जा सकता। यह एक समारोह में रख:

(foldr (lambda (a b) (and a b)) #t '(#t #t #f))

1

एक बात है कि बंद हो सकता है कि रैकेट और योजना में, सही मूल्य #F के अलावा और कुछ हो रहा है। के बाद से अपने प्रश्न बूलियन्स के लिए पूछता है, निम्नलिखित अधिक भेदभाव हो जाएगा:

#lang racket 
(define (boolean-true? x) (eq? x #t)) 
(define (only-contains-#t? l) 
    (andmap boolean-true? l)) 

उदाहरण के लिए,

> (only-contains-#t? '()) 
#t 
> (only-contains-#t? '(#t #t #t)) 
#t 
> (only-contains-#t? '(#t #t true)) 
#f 
संबंधित मुद्दे