आप चाहते हैं फिर से परिभाषित/गतिशील दायरे का उपयोग करके एक मौजूदा समारोह शैडो, यह एक मैक्रो मैं थोड़ी देर के लिए प्रयोग कर रहे है।
(defmacro! with-shadow ((fname fun) &body body)
"Shadow the function named fname with fun
Any call to fname within body will use fun, instead of the default function for fname.
This macro is intentionally unhygienic:
fun-orig is the anaphor, and can be used in body to access the shadowed function"
`(let ((fun-orig))
(cond ((fboundp ',fname)
(setf fun-orig (symbol-function ',fname))
(setf (symbol-function ',fname) ,fun)
(unwind-protect (progn ,@body)
(setf (symbol-function ',fname) fun-orig)))
(t
(setf (symbol-function ',fname) ,fun)
(unwind-protect (progn ,@body)
(fmakunbound ',fname))))))
उपयोग:
Clozure Common Lisp Version 1.9-r15759 (DarwinX8664) Port: 4005 Pid: 4728
; SWANK 2012-03-06
CL-USER>
(defun print-using-another-fname (x)
(print x))
PRINT-USING-ANOTHER-FNAME
CL-USER>
(let ((*warn-if-redefine-kernel* nil))
(with-shadow (print (lambda (x)
(funcall fun-orig (+ x 5))))
(print-using-another-fname 10)))
15
15
CL-USER>
(print 10)
10
10
CL-USER>
ध्यान दें कि यह डौग Hoyte के defmacro पर निर्भर करता है! मैक्रो, Let Over Lambda में उपलब्ध है।
के रूप में भी लिखा है, यह anaphoric (मजेदार मूल शरीर के भीतर उपलब्ध है) है। यदि आप इसे पूरी तरह से स्वच्छ बनाना चाहते हैं, तो बस मजेदार-उत्पत्ति को बदल दें, जी! मजेदार-उत्पत्ति।
मैं सबसे अधिक बार कार्यों को फिर से परिभाषित जब इकाई परीक्षण लेखन। किसी विशेष इकाई परीक्षण के दायरे में मॉकिंग फ़ंक्शंस सहायक होता है, और कभी-कभी इसे गतिशील (व्याख्यात्मक) दायरे के साथ करने की आवश्यकता नहीं होती है।
स्रोत
2012-01-27 18:06:38
तो, के बाद से यह lexically scoped है यह केवल, flet/लेबल की वास्तविक शरीर और नहीं पूरे funcion कॉल पदानुक्रम को प्रभावित करेगा तो बात करने के लिए? –
वास्तव में ऐसा है, तो यह केवल lexcial दायरे के भीतर "मौजूद" होगा, अन्य कार्यों के लिए अंतर का एक अंधे सा नहीं बना। जहां तक मुझे पता है, गतिशील रूप से प्रतीक-से-फ़ंक्शन मैपिंग को बाध्य करने का कोई भी तरीका नहीं है। – Vatine