2013-09-05 8 views
5

आम लिस्प हाइपरस्पेक कहता है "मैक्रो फॉर्म घोषणाओं में विस्तार नहीं कर सकते हैं; घोषित अभिव्यक्ति फॉर्म के वास्तविक उप-अभिव्यक्तियों के रूप में दिखाई देनी चाहिए जिनके बारे में वे संदर्भित करते हैं।"क्या मैक्रो विस्तार में (घोषणा ...) अभिव्यक्ति हो सकती है?

मैं "विस्तार" के अर्थ पर उलझन में हूं। मैक्रो जैसे निम्नलिखित स्पष्ट कारणों के लिए काम नहीं करेगा:

(defmacro optimize-fully() 
    `(declare (optimize (speed 3) (safety 0)))) 

लेकिन क्या होगा अगर मैक्रो विस्तार केवल शामिल एक (declare ...) अभिव्यक्ति?

(defmacro defun-optimized (name (&rest lambda-list) &rest body) 
    `(defun ,name ,lambda-list 
     (declare (optimize (speed 3) (safety 0))) 
     ,@body)) 

(defun-optimized foobar (a b) 
    (* a b)) 

क्या यह कल्पना का उल्लंघन है? सीएल कार्यान्वयन मैं उपयोग करता हूं, एसबीसीएल, शिकायत नहीं करता है, और वास्तव में, उपरोक्त मैक्रो अपेक्षाकृत ठीक काम करता प्रतीत होता है। क्या देता है?

उत्तर

13

आपका पहला उदाहरण बिल्कुल प्रतिबंधित है जो यह प्रतिबंधित है। , हालांकि

(defun optimized (a b) 
    (optimize-fully) 
    (+ a b)) 

मैं कभी कभी इस तरह कोड देखें:: तो जब कल्पना से "का विस्तार [ing] में मैक्रो कॉल पर प्रतिबंध लगाता है

(defvar *optimization-settings* '(optimize (speed 3) (safety 0))) 

(defun foo (a b) 
    (declare #.*optimization-settings*) 
    ...) 
+2

आप कुछ इस तरह के साथ संयुक्त ऐसा कोड नहीं कर सकता घोषणाएं ", यह केवल _immediate_ (मैं एक बेहतर शब्द के बारे में नहीं सोच सकता) विस्तार के बारे में बात कर रहा हूं? – nbtrap

+3

हां, इसका मतलब यही है। – Xach

+1

और "लेट ओवर लैम्ब्डा" पुस्तक के लेखक पाठकों मैक्रोज़ को परिभाषित करने का सुझाव देते हैं जो फॉर्म घोषित करने के लिए विस्तार करते हैं, क्योंकि सामान्य मैक्रोज़ का विस्तार होने से पहले पाठक मैक्रोज़ का विस्तार किया जाता है। – BreakDS

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