अनियंत्रित प्रतीकों का उपयोग अधिकतर नाम या डिजाइनर के रूप में किया जाता है ताकि वे संकुचित पैकेज, या संबंधित कार्यों से बच सकें।
उदाहरण के लिए:
T1> (find-symbol "T2")
NIL
NIL
T1> (find-symbol "T3")
NIL
NIL
T1> (defpackage t2)
#<Package "T2">
T1> (defpackage #:t3)
#<Package "T3">
T1> (find-symbol "T2")
T2
:INTERNAL
T1> (find-symbol "T3")
NIL
NIL
आप देख सकते हैं, पहली defpackage
रूप में यह पैकेज t1
में इंटर्न में t2
का उपयोग करते समय दूसरे defpackage
में #:t3
का उपयोग कर इस से बचा जाता है। यह संभव है, क्योंकि defpackage
स्ट्रिंग डिज़ाइनर अपने पहले तत्व के रूप में लेता है, और एक प्रतीक को डिज़ाइनर के रूप में कार्य करने के लिए इंटर्न करने की आवश्यकता नहीं होती है।
ये और संबंधित स्थितियां हैं जहां अनियंत्रित प्रतीकों का अधिकतर जानबूझकर उपयोग किया जाता है। आप स्ट्रिंग या कीवर्ड का उपयोग कर पैकेज को प्रदूषित करने से भी बच सकते हैं, लेकिन पहले मामले में, डिफ़ॉल्ट पठनीय-केस के अलावा अन्य लोगों के साथ समस्याएं हो सकती हैं, और दूसरे मामले में आप कीवर्ड पैकेज को प्रदूषित करेंगे, जो कुछ लोग परवाह करते हैं। (इस बात के बारे में अलग-अलग राय हैं कि यह वास्तव में ऐसी बुरी चीज है या नहीं।)
फिर ऐसी स्थितियां हैं जहां एक प्रतीक अपने घर के पैकेज को खो देता है (उदाहरण के लिए unintern
आईएनजी) और कम से कम बन जाता है अनियंत्रित।(यह अभी भी एक और पैकेज में प्रशिक्षु किया जा सकता है।)
T1> (defparameter *t2* (find-symbol "T2"))
*T2*
T1> (import *t2* "T3")
T
T1> (symbol-package *t2*)
#<Package "T1">
T1> (unintern *t2*)
T
T1> (find-symbol "T2")
NIL
NIL
T1> (symbol-package *t2*)
NIL
T1> *t2*
#:T2
T1> (find-symbol "T2" "T3")
#:T2
:INTERNAL
T1> (unintern *t2* "T3")
T
T1> (import *t2* "T3")
T
T1> *t2*
T3::T2
T1> (symbol-package *t2*)
#<Package "T3">
तो,
का जवाब वहाँ प्रशिक्षु के लिए एक रास्ता एक प्रतीक (मेकअप प्रतीक) के साथ बनाया है?
T1> (import (make-symbol "T4"))
T
T1> (find-symbol "T4")
T4
:INTERNAL
मैं इसे होना शामिल बिना एक प्रतीक को कोई मान निर्दिष्ट कर सकते हैं:
हां में है?
हाँ, जब तुम गुण है कि यह विशेष रूप से उसकी नाम और packagage से पहचाना जा सकता खो रहे हैं, तो आप अभी भी अपने मूल्य स्लॉट, plist, आदि .: उपयोग कर सकते हैं
T1> (let ((symbol '#:t5))
(setf (symbol-value symbol) 1)
(setf (get symbol :foo) :bar)
(setf (symbol-function symbol) (lambda()))
(values (symbol-value symbol)
(get symbol :foo)
(symbol-function symbol)))
1
:BAR
#<Anonymous Function #xC829036>
है एक प्रतीक का नाम बदलना संभव है (आंतरिक या अनियंत्रित)?
प्रतीक के नाम को संशोधित करने के परिणाम अपरिभाषित हैं।
एक अनियंत्रित प्रतीक के साथ कोई और क्या कर सकता है?
मैं वास्तव में लगता है कि वे ज्यादातर पैकेज परिभाषा में designators के रूप में इस्तेमाल कर रहे हैं, लेकिन सामान्य जवाब देने के लिए होगा: जहां हार्डकोडेड तार का उपयोग किए बिना बातें नामकरण करना चाहते हैं वे स्थितियों में उपयोगी हो सकता है और नहीं करना चाहते किसी भी पैकेज को प्रदूषित करें।
प्रतीक नाम डिफ़ॉल्ट अपकेस द्वारा हैं। FIND-SYMBOL के साथ उन्हें ढूँढना केस संवेदनशील है। –
मुझे लगता है, धन्यवाद (अब यह टिप्पणी पोस्ट करने के लिए काफी लंबा है) – sabof