2011-07-11 11 views
7

में उद्धृत प्रतीक मैं कोई योजना विशेषज्ञ नहीं हूं इसलिए सुनिश्चित नहीं हूं कि मैं यहां सही शब्दावली का उपयोग कर रहा हूं। कोड के लिए ही बात करते हैं:योजना

CSI> (define tree '(1 2 3 'Symb 4 5 6)) 
#<unspecified> 
CSI> tree 
(1 2 3 (quote Symb) 4 5 6) 
CSI> (symbol? 'Symb) 
#t 
CSI> (map symbol? tree) 
(#f #f #f #f #f #f #f) 

Clojure पृष्ठभूमि से आ रहा है, मैंने सोचा था कि प्रतीकों, योजना में इस तरह इस्तेमाल किया गया Clojure में कीवर्ड की तरह। मुझे एक नेस्टेड सूची संरचना के माध्यम से जाना है और एक समारोह कॉल के साथ प्रतीकों को प्रतिस्थापित करना है। यह मेरा आयामी समाधान है और यह काम करता है:

(define (print-track track attrs) 
    (apply fmt #t 
     (map (lambda (attr) 
       (cond 
        ((symbol? attr) (get-attr attr track)) 
        (else   attr))) 
      attrs))) 

(symbol?) रेखा से ऊपर खाली जगह एक (list?) सशर्त के लिए था, लेकिन यह संभावित रूप से गलत aproach है।

मैं चिकन योजना का उपयोग कर रहा हूं।

उत्तर

18

आप लिस्प उद्धरण "गेटचा" में भाग चुके हैं। योजना में, प्रतीकों का उपयोग परिवर्तनीय संदर्भ के लिए किया जाता है, जिसे आप स्पष्ट रूप से समझते हैं। यह सत्य पर मूल्यांकन करता है:

> (symbol? 'Symb) 

क्योंकि आपने प्रतीक उद्धृत किया है, और इसे एक चर संदर्भ के रूप में उपयोग करने से रोका है।

> (symbol? Symb) 

पहले सिम्ब चर के मान को देखेंगे, और तब जांचें कि वह मान प्रतीक था या नहीं।

> (let ((Symb 'foo)) (symbol? Symb)) 

#t का मूल्यांकन करेगा, क्योंकि सिम्ब का मूल्य एक प्रतीक है: foo।

> (let ((Symb 7)) (symbol? Symb)) 

, निश्चित रूप से, #f का मूल्यांकन करना होगा।

आप उद्धरण के बारे में सोचते हैं।

'Symb 

वास्तव में कम है; यह

(quote Symbol) 

के बराबर है, जो फिर से, अपने अनियमित तर्क को वापस कर देता है।

लेकिन आपके कोड को आंतरिक उद्धरण की आवश्यकता नहीं है। जब आप

> (define tree '(1 2 3 'Symb 4 5 6)) 

पूरी सूची उद्धृत की गई है; सूची के अंदर कुछ भी का मूल्यांकन किया जा रहा है। क्यों

> tree ; => (1 2 3 (quote Symb) 4 5 6) 

उद्धृत सूची के अंदर, 'symb (उद्धरण symb) है, जो वास्तव में एक सूची है के बराबर होता है। चूंकि पूरी सूची उद्धृत की गई है, सिम्ब का उपयोग बिना, एक परिवर्तनीय संदर्भ के रूप में नहीं माना जाएगा। यह सिर्फ प्रतीक होगा।

> (define tree '(1 2 3 Symb 4 5 6)) 
> tree ; => (1 2 3 Symb 4 5 6) 

अब, अगर आप सूची कार्य करने के लिए उन सभी तर्कों से गुजर रहे थे, क्या आप मूल रूप से किया सही होगा:

> (define tree (list 1 2 3 'Symb 4 5 6)) 
> tree ; => (1 2 3 Symb 4 5 6) 

उस मामले में, आप एक समारोह के लिए उन तर्कों से गुजर रहे हैं, किसी फ़ंक्शन के तर्कों का मूल्यांकन किया जाता है, इसलिए आपको प्रतीकों को परिवर्तनीय संदर्भों के रूप में माना जाने से रोकने के लिए उद्धरण की आवश्यकता होती है।

> (define tree (list 1 2 3 (quote Symb) 4 5 6)) 

वही काम करेगा।

+0

स्पष्टता के लिए +1, पूर्णता – acfoltzer

+1

कोई वास्तव में इस से कोई स्पष्ट उत्तर नहीं लिख सकता :) – progo