2011-12-02 17 views
7

कई बार मैं अनियंत्रित प्रतीकों की धारणा में आया, लेकिन मैं पूरी तरह से स्पष्ट नहीं हूं कि वे क्या हैं।सामान्य लिस्प में अनियंत्रित प्रतीकों

क्या (प्रतीक-प्रतीक) के साथ बनाए गए प्रतीक को प्रशिक्षित करने का कोई तरीका है?
क्या मैं बिना किसी इंटर्न के प्रतीक के लिए एक मान असाइन कर सकता हूं?
क्या प्रतीक (आंतरिक या अनियंत्रित) का नाम बदलना संभव है?
एक अनियंत्रित प्रतीक के साथ कोई और क्या कर सकता है?

अद्यतन:
क्या कोड के इस टुकड़े में प्रतीकों के साथ हो रहा है?

CL-USER> (defun func() 
      (let ((var 'sym)) 
      (print (find-symbol "sym")) 
      (print var))) 
FUNC 
CL-USER> (func) 

NIL 
SYM 
SYM 

मेरे गलत समझ है:
1. ढूंढें प्रतीक प्रिंट शून्य, तो प्रतीक intered नहीं है
2. वर प्रिंट # बिना प्रतीक: शुरुआत जो यह

+3

प्रतीक नाम डिफ़ॉल्ट अपकेस द्वारा हैं। FIND-SYMBOL के साथ उन्हें ढूँढना केस संवेदनशील है। –

+0

मुझे लगता है, धन्यवाद (अब यह टिप्पणी पोस्ट करने के लिए काफी लंबा है) – sabof

उत्तर

8

अनियंत्रित प्रतीकों का उपयोग अधिकतर नाम या डिजाइनर के रूप में किया जाता है ताकि वे संकुचित पैकेज, या संबंधित कार्यों से बच सकें।

उदाहरण के लिए:

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 के रूप में इस्तेमाल कर रहे हैं, लेकिन सामान्य जवाब देने के लिए होगा: जहां हार्डकोडेड तार का उपयोग किए बिना बातें नामकरण करना चाहते हैं वे स्थितियों में उपयोगी हो सकता है और नहीं करना चाहते किसी भी पैकेज को प्रदूषित करें।

+0

एक और सवाल, क्या एक समान तरीके से एक प्रतीक को आंतरिक/अनन्य करना संभव है? – sabof

+0

मुझे प्रश्न समझ में नहीं आता है। क्या आप एक उदाहरण या अधिक विस्तृत स्पष्टीकरण दे सकते हैं? – danlei

+0

मैंने प्रश्न – sabof

1
    प्रशिक्षु है इसका मतलब में
  1. हाँ

    CL-USER> (intern (string (make-symbol "TEST"))) 
    TEST 
    :INTERNAL 
    
  2. नहीं

  3. नहीं

  4. यह आमतौर पर पैकेज घोषणा में प्रयोग किया जाता है पैकेज है, जिसमें घोषणा जगह लेता है (यदि एक साधारण प्रतीक इस्तेमाल किया गया था) या कीवर्ड पैकेज के नामस्थान को दूषित करने के लिए नहीं है, क्योंकि defpackage प्रपत्र के :export में प्रविष्टियों और :use क्लॉज किसी भी तरह स्ट्रिंग में परिवर्तित हो जाते हैं। तो, आप इसे फ़ंक्शंस में उपयोग कर सकते हैं, जो कुछ भी स्वीकार करता है और इसे तारों में परिवर्तित करता है। अधिक आम तौर पर, अनियंत्रित प्रतीकों का उपयोग अद्वितीय वस्तुओं के नाम से किया जा सकता है और कुछ भी नहीं। लेकिन आमतौर पर इस तरह के उद्देश्य के लिए कीवर्ड प्रतीकों का उपयोग किया जाता है।

+2

मैंसमझता हूं लेकिन सख्ती से बोल रहा हूं 1. आप प्रतीक को इंटर्न नहीं कर रहे हैं, लेकिन एक ही नाम के साथ एक अलग नाम बना रहे हैं – sabof

+0

@sabof अजीब बात करते हुए, आप सही हैं। –

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