2011-11-10 18 views
7

यह सवाल "मानसिक masterbation" से विशुद्ध रूप से आता है और शायद कोई व्यावहारिक महत्व है।Clojure संकलन समय स्थिर

अगर मैं def का उपयोग कर Clojure में एक मूल्य को परिभाषित, संकलक संकलन समय पर यह मूल्यांकन करने के लिए, और रन-टाइम तक इंतजार नहीं प्रेरित किया जा सकता है?

(def the-answer 42) 

(+ the-answer 1) 

मुझे लगता है मैं मैक्रो निर्धारित सकता है, लेकिन बुला वाक्य रचना तरह की अजीब हो जाता है:

(defmacro the-answer [] 42) 

(+ (the-answer) 1) 

यह भी काम करता है, लेकिन अभी भी बदसूरत है:

(+ `~the-answer 1) 

मैं यह भी समझता (या विश्वास) कि क्लोजर संकलन समय पर निरंतर अभिव्यक्ति का मूल्यांकन करता है:

(def milliseconds-per-day (* 24 60 60 1000)) 

मैं सिर्फ कॉमन लिस्प सीख रहा हूँ, लेकिन मैं समझता हूँ कि कॉमन लिस्प उपयोगकर्ता परिभाषित पाठक मैक्रो का समर्थन करता है, तो आप एक पाठक मैक्रो (#$ की तरह कुछ) है कि संकलन समय पर निम्न प्रतीक का मूल्यांकन करता है निर्धारित कर सकते हैं:

(+ #$the-answer 1) 

वैसे, कि वाक्य रचना नहीं "खूबसूरत" मैक्रो कॉल की तुलना में है।

क्लोजर संकलन समय पर निरंतर वर्रों का मूल्यांकन कैसे कर सकता है और वास्तविक मूल्य के साथ संदर्भ को प्रतिस्थापित कर सकता हूं? यह पहले से ही ऐसा करता है?

किसी ने भी Knuth के कानून ("समयपूर्व अनुकूलन सभी बुराइयों की जड़" उद्धृत करना शुरू करने से पहले, मैं क्लोजर संकलन के आंतरिक को बेहतर ढंग से समझने के लिए इस सवाल से पूछता हूं।

+0

यह नहीं है कि पोंटिफिकेशन क्या है। Pontification जोरदार या dogmatically बोलना है। –

+0

हाँ, मैंने इसे हटा दिया। – Ralph

उत्तर

11

Clojure 1.3 docs

== 2.14^से: स्थिरांक defs ==

^: स्थिरांक आप त्वरित संदर्भ के साथ आदिम मूल्यों का नाम देता है।

(डीईएफ़ स्थिरांक {: अनुकरणीय 3.14: ई 2.71})

(डीईएफ़ ^: स्थिरांक अनुकरणीय (: अनुकरणीय स्थिरांक)) (डीईएफ़ ^: स्थिरांक ई (: ई स्थिरांक))

भूमि के ऊपर ई और: देख के नक्शे में अनुकरणीय संकलन समय में होता है, के रूप में (: अनुकरणीय स्थिरांक) और (: ई स्थिरांक) मूल्यांकन किया जाता है जब उनके माता-पिता डीईएफ़ रूपों मूल्यांकन किया जाता है।

5

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

+0

यह एक उचित उत्तर है, और मैं वही बात सोच रहा था। वाक्यविन्यास 'उत्तर-उत्तर विकल्प से बेहतर है। – Ralph

2

`~foo सचमुच सभी मामलों में foo के समान है - जो कुछ भी आपको लगता है कि आप पूर्व से बाहर हो रही है एक भ्रम है।

मुझे लगता है कि :const शायद सही उत्तर है, लेकिन आप clojure.tools से प्रतीक-मैक्रोज़ का भी उपयोग कर सकते हैं।मैक्रो - इस उद्देश्य के लिए symbol-macrolet और defsymbolmacro/with-symbol-macros है (साथ ही साथ अन्य उपयोग)।

+0

मुझे एहसास नहीं हुआ कि ~ ~ foo। धन्यवाद। जैसा कि मुझे समस्या के बारे में और अधिक लगता है, '^: const' जाने का सही तरीका प्रतीत होता है, लेकिन ** केवल प्राइमेटिव्स के लिए ** ('स्ट्रिंग' उदाहरणों सहित)। स्ट्रिंग्स के साथ समस्या यह है कि मैक्रो या कॉन्स का उपयोग करने से शायद 'स्ट्रिंग' सामग्री की रनटाइम तुलना हो सकती है, न कि पते। यदि ऐसा करने का कारण प्रदर्शन के लिए है, तो यह एक नुकसान है। – Ralph

संबंधित मुद्दे