क्या मानक सामान्य-लिस्प फ़ंक्शंस/मैक्रोज़ का उपयोग करके पैकेज से अस्थायी रूप से कुछ पैकेज आयात करने का कोई तरीका है?सामान्य लिस्प: पैकेज से कुछ फ़ंक्शंस अस्थायी रूप से आयात करने के लिए सर्वोत्तम तरीका
मुझे कोई नहीं मिला और मुझे अपना रोल करना पड़ा। यदि मानक पहले से ही ऐसी कार्यक्षमता प्रदान करता है, तो मुझे कुछ भी कोड अप करने की आवश्यकता नहीं है, या किसी अन्य भाषा का निर्माण शुरू नहीं करना है।
(defmacro with-functions (functions the-package &body body)
"Allows functions in the-package to be visible only for body.
Does this by creating local lexical function bindings that redirect calls
to functions defined in the-package"
`(labels
,(mapcar (lambda (x) `(,x (&rest args)
(apply (find-symbol ,(format nil "~:@(~a~)" x)
,the-package)
args)))
functions)
,@body))
उदाहरण उपयोग:
(defclass-default test-class()
((a 5 "doc")
(b 4 "doc")))
#<STANDARD-CLASS TEST-CLASS>
CL-USER>
(with-functions (class-direct-slots slot-definition-name) 'sb-mop
(with-functions (slot-definition-initform) 'sb-mop
(slot-definition-initform
(car (class-direct-slots (find-class 'test-class))))))
5
CL-USER>
संपादित करें: मैक्रो को रेनर के सुझावों में से कुछ शामिल।
मैंने पैकेज में फ़ंक्शन खोजने के लिए रन-टाइम लुकअप की समय लागत पर रन-टाइम लुकअप क्षमता रखने का निर्णय लिया।
मैंने एक आयात-आयात मैक्रो लिखने की कोशिश की जो छाया-आयात और अनन्य का उपयोग करता था, लेकिन मैं इसे काम नहीं कर सका। मुझे पाठक के साथ समस्याएं थीं कि कहा गया था कि आयातित कार्यों का मूल्यांकन करने वाले कोड से पहले आयातित फ़ंक्शंस अभी तक (पढ़ने के समय पर) मौजूद नहीं था।
मुझे लगता है कि इसे छायांकन-आयात और अनन्य के साथ काम करने के लिए एक बेहतर तरीका है, क्योंकि यह बहुत साफ, तेज (हालांकि कोई रन-टाइम लुकअप क्षमता नहीं होगी) और संकुल में कार्यों और प्रतीकों के साथ काम करेगा।
मुझे यह देखने में बहुत दिलचस्पी होगी कि क्या कोई अनन्य और छायांकन-आयात का उपयोग करके आयात-आयात मैक्रो को कोड कर सकता है या नहीं।
यह लेक्सिकल फ़ंक्शंस के साथ काम नहीं करता है, क्योंकि आवेदन उन्हें नामों के रूप में प्रतीकों का उपयोग करके कॉल नहीं कर सकता है। –
मुझे नहीं लगता कि यह एक मैक्रो के साथ संभव है, क्योंकि मैक्रो का विस्तार होने से पहले पाठक द्वारा प्रतीकों का समाधान किया जाता है, लेकिन मैं गलत हो सकता हूं कि मैं पूरी तरह से समझ नहीं पा रहा हूं कि पाठक कैसे काम करता है। – Daimrod
@ डेमरोड ऐसे मैक्रो का निर्माण करना संभव होना चाहिए, लेकिन यह बहुत मुश्किल है (और, शायद, अप्राप्य), क्योंकि आपको प्रारंभिक प्रतीक-रिज़ॉल्यूशन रणनीति से उत्पन्न होने वाले नाम विवादों को संभालना होगा। –