2009-06-25 24 views
5
PAIP में

पीटर Norvig का कहना है:
"आधुनिक lisps में ... eval कम अक्सर प्रयोग किया जाता है (वास्तव में, इस योजना में कोई eval बिल्कुल है)" "यदि आप पाते हैं अपने आप को eval उपयोग कर, आप शायद गलत बात कर रहे हैं "।योजना में EVAL

योजना में eval का उपयोग करने से रोकने के कुछ तरीके क्या हैं? वहाँ वेंट वहाँ जहां eval बिल्कुल जरूरी है?

उत्तर

7

ऐसे मामले हैं जहां eval आवश्यक है, लेकिन वे हमेशा उन्नत प्रोग्राम शामिल करते हैं जो कुछ कोड गतिशील रूप से लोड करने जैसी चीजें करते हैं (उदाहरण के लिए, वेब सर्वर में एक सर्वलेट)। इसका उपयोग करके "circumvent" करने के लिए एक तरीका के रूप में - यह उस वास्तविक समस्या पर निर्भर करता है जिसे आप हल करने का प्रयास कर रहे हैं, eval को छोड़कर eval से बचने के लिए कोई जादू समाधान नहीं है।

(Btw, मेरा अनुमान है कि PAIP एक लंबे समय पहले लिखा गया था, इससे पहले कि eval योजना की रिपोर्ट करने के लिए जोड़ा गया था।)

+0

मुझे खेद है कि मैं इस प्रश्न में जो चाहता था उसके बारे में अधिक विशिष्ट नहीं हो सकता था। लेकिन दिलचस्प बात यह है कि मैंने हमेशा सोचा था कि eval हमेशा योजना का एक अभिन्न हिस्सा था। वैसे भी मुझे आशा है कि मुझे सीएस जी 111 में अधिक उपयोग और 'दुरुपयोग' का उपयोग करना होगा। :) – unj2

+1

हां, 'eval' * * योजना का एक अभिन्न अंग है, लेकिन इसे केवल उन्नत मामलों में ही जरूरी है। अंगूठे का नियम यह है: यदि आप तकनीकी कारणों को नहीं जानते हैं जिनके लिए आपको 'eval' का उपयोग करने की आवश्यकता है, तो आपको * इसकी आवश्यकता नहीं है। (और यह एक गंभीर जवाब है!) किसी भी मामले में, हाँ, आपके पास CSG111 में बहुत से 'eval'ing होगा यदि आप इसे लेने जा रहे हैं, और उम्मीद है कि अगर आपको याद है, तो मुझे इसके बारे में पूछें। –

1

पहला, पीएआईपी आम लिस्प के लिए लिखा गया है, योजना नहीं, इसलिए मुझे नहीं पता कि वह वही बात कहेंगे। सीएल मैक्रोज़ eval के समान ही काम करते हैं, हालांकि रन टाइम के बजाए संकलन समय पर, और अन्य चीजें हैं जो आप कर सकते हैं। यदि आप मुझे आम लिस्प में eval का उपयोग करने का एक उदाहरण दिखाएंगे, तो मैं वही काम करने के अन्य तरीकों के साथ आने का प्रयास कर सकता हूं।

मैं एक योजना प्रोग्रामर नहीं हूं। मैं केवल एक सामान्य लिस्प प्रोग्रामर के रूप में, Norvig के परिप्रेक्ष्य से बात कर सकते हैं। मुझे नहीं लगता कि वह योजना के बारे में बात कर रहा था, और मुझे नहीं पता कि वह योजना को विशेष रूप से अच्छी तरह जानता था या जानता था या नहीं।

दूसरा, Norvig कहते हैं, "आप गलत काम कर रहे हैं" के बजाय "आप शायद गलत काम कर रहे हैं"। इसका तात्पर्य यह है कि, वह सभी के लिए जानता है, ऐसे समय होते हैं जब eval उपयोग करने के लिए सही बात है। सी जैसी भाषा में, मैं goto के बारे में वही बात कहूंगा, हालांकि वे कुछ प्रतिबंधित परिस्थितियों में काफी उपयोगी हैं, लेकिन अधिकांश goto उपयोग उन लोगों द्वारा किया जाता है जो किसी भी बेहतर नहीं जानते हैं।

+0

"मुझे नहीं पता कि वह योजना विशेष रूप से अच्छी तरह जानता है"। यह कथन काफी अविश्वसनीय है। "ऐसे समय होते हैं जब उपयोग करने के लिए eval सही चीज है"। वह मेरा दूसरा सवाल था। प्रोग्रामर का अभ्यास करने के रूप में, क्या आपने eval का उपयोग किया है? – unj2

+1

जाहिर है, नोर्विग आम लिस्प में बेहद अच्छा है, जिसने इसके बारे में वास्तव में उत्कृष्ट पुस्तक लिखी है। यह योजना पर लागू नहीं होता है। क्या जावा या ऑब्जेक्टिव-सी में कुछ करने का सबसे अच्छा तरीका स्ट्रॉस्ट्रप अनिवार्य रूप से एक अच्छा अधिकार होगा? भाषा का वह परिवार आम लिस्प और योजना समेत लिस्प परिवार से अधिक अलग नहीं है। –

+0

हमम वह योजना को लागू करता है lisp..oh अच्छी तरह से मैं नहीं जानता। लेकिन मुझे लगता है कि वह "विशेष रूप से अच्छी तरह से जानता है" स्पेक्ट्रम पर निहित है। – unj2

-1

आप योजना में एक योजना दुभाषिया लिख ​​सकते हैं। ऐसा निश्चित रूप से संभव है, लेकिन यह व्यावहारिक नहीं है।

अनुमोदित, यह एक सामान्य उत्तर है, क्योंकि मेरे पास कोई उपयोग नहीं की गई योजना है, लेकिन यह आपकी मदद कर सकती है। :)

+0

यह वही जवाब है जहां मैं चाहता था। :) – unj2

4

वह गलत है। बेशक योजना में eval है।

+0

कौन सी योजना? मुझे नहीं लगता कि r4rs को उपस्थित होने की आवश्यकता है। – Aaron

+3

आर 5 आरएस http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_sec_6.5 – newacct

+3

@ न्यूवाक्ट पीएआईपी 1 99 2 में आया और आर 4 आरएस ने eval नहीं किया था। आर 5 आर 1 99 8 में आए और eval, गतिशील हवा और मूल्यों को जोड़ा :) – Sylwester

0

एक प्रयोग मैं पटकथा के वातावरण में 'eval' के लिए देखा है कुछ parameterize करने के लिए है रनटाइम मानों के साथ कोड। उदाहरण के लिए, psuedo-c में:

param = read_integer(); 
fn = eval("int lambda(int x) { 
      int param = " + to_string(param) + "; 
      return param*x; }"); 

मुझे आशा है कि आपको वह वास्तव में बदसूरत लगेगा। रनटाइम पर कोड बनाने के लिए चिपकाने वाला स्ट्रिंग? Ick। योजना और अन्य शब्दावली से लिपियों लिस्प्स में, आप eval का उपयोग किये बिना पैरामीटर किए गए कार्यों को बना सकते हैं।

(define make-my-fn 
    (lambda (param) 
    (lambda (x) (* param x))) 

(let* ([ param (read-integer) ] 
     [ fn  (make-my-fn param ]) 
    ;; etc. 
) 

जैसा उल्लेख किया गया था, गतिशील कोड लोड हो रहा है और इस तरह के अभी भी eval की जरूरत है, लेकिन पैरामिट्रीकृत कोड और कोड रचना प्रथम श्रेणी कार्यों के साथ उत्पादन किया जा सकता।

3

आपको कुछ दुर्लभ मामले में eval की आवश्यकता होगी। जो मामला दिमाग में आता है वह तब होता है जब आप प्रोग्राम के साथ प्रोग्राम बनायेंगे और फिर इसे निष्पादित करेंगे। यह मुख्य रूप से उदाहरण के लिए जेनेटिक एल्गोरिदम के साथ होता है। इस मामले में आप बहुत यादृच्छिक प्रोग्राम बनाते हैं जिन्हें आपको निष्पादित करने की आवश्यकता होगी।कोड होने के साथ eval होने के कारण डेटा आनुवांशिक एल्गोरिदम करने के लिए सबसे आसान प्रोग्रामिंग भाषा को कम कर देता है।

इन गुणों को एक बड़ी कीमत (आपके प्रोग्राम की गति और आकार की अवधि में) होने के बाद आता है क्योंकि आप कोड पर संकलन समय अनुकूलन करने की सभी संभावनाओं को हटा देंगे जो बेदखल हो जाएंगे और आपको पूर्ण दुभाषिया रखना होगा आपके परिणामस्वरूप बाइनरी।

परिणामस्वरूप इसे eval का उपयोग करने के लिए खराब डिजाइन माना जाता है जब इसे टाला जा सकता है।

3

दावा है कि योजना eval योजना मानक (आर 5 आरएस और बाद में) के नवीनतम संस्करणों के लिए कम से कम गलत है। आमतौर पर, आप जो चाहते हैं वह एक मैक्रो है, जो संकलन समय पर कोड उत्पन्न करेगा।

यह सच है कि eval से बचा जाना चाहिए। शुरुआत करने वालों के लिए, मैंने कभी यह व्यवहार करने की संतोषजनक परिभाषा नहीं देखी है, उदाहरण के लिए:

  1. कोई पर्यावरण पारित होने पर पर्यावरण के अभिव्यक्तियों का मूल्यांकन क्यों किया जाना चाहिए?
  2. जब आप किसी पर्यावरण में गुजरते हैं, तो वे कैसे काम करते हैं? उदाहरण के लिए, मानक किसी भी तरीके से निर्दिष्ट नहीं करते हैं कि आप उस पर्यावरण ऑब्जेक्ट में किसी मान को पूर्व-बाध्य कर सकते हैं।

यही कहा, मैं eval का उपयोग करता है ऐसे मामलों में जहां गणना की संरचना संकलन समय ज्ञात नहीं किया जा सकता के लिए कार्यावधि में गतिशील रूप से कोड उत्पन्न करने के लिए एक योजना आवेदन के साथ काम किया है। योजना प्रणाली को प्रदर्शन कारणों से रनटाइम पर कोड संकलित करने का इरादा है- और कठिनाई यह है कि योजना प्रणाली को "इस कोड को संकलित करने के लिए कोई मानक तरीका नहीं है।"

यह कहने के बिना जाना चाहिए कि eval एक बड़ा सुरक्षा जोखिम हो सकता है। आपको कभी भी eval कुछ भी नहीं होना चाहिए जिसमें उपयोगकर्ता इनपुट से अलगाव की विशाल दीवार न हो। असल में, यदि आप सुरक्षित रूप से eval का उपयोग करना चाहते हैं, तो आपको कुछ इनपुट (व्यापक रूप से परिभाषित व्याकरण का उपयोग करके) के विश्लेषण के बाद, एक कंपाइलर-जैसी प्रणाली के कोड-जनरेशन चरण के संदर्भ में ऐसा करना चाहिए।