FORTH: सेल्फ डिफाइनिंग शब्द

किले की भाषा में कुछ परियोजनाएं होने दें, जिसमें एक ही प्रकार के पर्याप्त संख्या में चर का उपयोग किया जाता है।
उदाहरण के लिए: x, y, z, x ', y', z ', x' ', y' ', z' ', s, m and so ...
उन्हें निर्धारित करने के लिए, आपको हर बार शब्द VARIABLE लिखना होगा, और यह बोझिल, नीरस और बदसूरत है। क्या इसे और अधिक मजेदार बनाने का कोई तरीका है?
संकेत दें कि आगे चर को परिभाषित किया जाएगा और उनके नाम लिखे जाएंगे।
कुछ इस तरह:
 चर:
   xyzx 'y' z '
   x '' y '' z ''
   एस.एम.
 ; VARIABLES



एसपी-फोर्थ में लागू फोर्ट भाषा दुभाषिया को याद करें, अगर यह संदर्भ शब्दकोश में एक शब्द नहीं मिलता है, तो उसी संदर्भ शब्दकोश में NOTFOUND शब्द खोजता है, जिसे वह निष्पादित करता है। NOTFOUND इनपुट पैरामीटर्स इनपुट स्ट्रीम से प्रतिस्थापन के पता और काउंटर हैं। तो, आपको NOTFOUND को फिर से परिभाषित करने की आवश्यकता है ताकि यह वही करे जो हमें चाहिए।

आपको क्या चाहिए?
इस शब्द को न लें और इसे एक चर के रूप में वर्तमान शब्दकोश के शीर्ष पर संकलित करें। मुझे परिभाषा याद है
  : वार्ले सृजन 0 ;;

लेकिन शब्द क्रिएट स्वयं इनपुट स्ट्रीम से अगले शब्द का चयन करता है, और हमें एक पंक्ति से एक एड्रेस प्रविष्टि और स्टैक पर एक काउंटर बनाने की आवश्यकता है। सौभाग्य से इस मामले के लिए, शब्द बना है, जो केवल स्टैक से पता और लाइन काउंटर लेता है और एक शब्दकोश प्रविष्टि बनाता है। दुर्भाग्य से, यह, NOTFOUND की तरह, मानक ANSI-94 शब्द सेट का हिस्सा नहीं है।
इस तरह से
 : NOTFOUND (अतिरिक्त यू -) निर्मित 0,; 

लेकिन, अगर हम इस तरह की परिभाषा को आधार फोरम की सूची में रखते हैं, तो हम संख्याओं को दर्ज करने की क्षमता खो देते हैं। इसलिए आपको इस नए NOTFOUND को किसी अन्य संदर्भ में छिपाने की आवश्यकता है। चलो चर शब्दकोश मिलता है।
 VOCABULARY चर 

और इसे चालू करें।
 इसके अलावा परिवर्तन के चर

वहां NOTFOUND की परिभाषा रखें

वर्तमान संदर्भ वापस करें
 पूर्ववर्ती परिभाषाएँ


इस प्रकार, शब्द VARIABLES: संदर्भ को चर पर स्विच करता है और आवश्यक NOTFOUND उपलब्ध कराता है
 : संस्करण: ALSO चर;

समापन शब्द; VARIABLES एक संदर्भ लौटाएगा। यह स्वाभाविक रूप से चर के संदर्भ में होना चाहिए।

वह है, कुल:
 VOCABULARY चर 
 इसके अलावा परिवर्तन के चर

 : NOTFOUND (अतिरिक्त यू -) निर्मित 0,; 
 :; वरियवेज़ प्रीवियस; 

 पूर्ववर्ती परिभाषाएँ

 : संस्करण: ALSO चर;

इसलिए, केवल चार लाइनों में, हमने एसपी-फोर्थ दुभाषिया का विस्तार किया और चर के विवरण को सरल बनाया।
लेकिन एक समान दृष्टिकोण का उपयोग VALUE चर, स्थिरांक और आम तौर पर सामान्य निष्पादन शब्दार्थ के साथ किसी भी शब्द के लिए किया जा सकता है। वे शब्द जो परिभाषित शब्द का उपयोग करके परिभाषित किए गए हैं। सिद्धांत रूप में, शब्दों को परिभाषित करने के जोड़े रखना उपयोगी है। एक एकल परिभाषा के लिए, और एक समूह परिभाषा के लिए रखा गया। दरअसल, परिभाषित शब्द सामान्य शब्दार्थ के साथ शब्दों के समूह बनाने में सक्षम होने के लिए बनाया गया है। और यह सुविधाजनक है अगर ये परिभाषाएं पाठ पर नहीं फैली हैं, लेकिन एक ब्लॉक में एकत्र की जाती हैं।

आइए इसे VALUE चर के लिए लागू करने का प्रयास करें।
 VOCABULARY मान
 इसके अलावा मूल्य निर्धारण
 : कुछ नहीं ...

और यहाँ हम कुछ परेशानी में आते हैं। योग्यता शब्द VALUE को CREATE के माध्यम से परिभाषित नहीं किया गया है। इसे निम्नानुसार परिभाषित किया गया है:
 : मूल्य  
        हैडर
        ['] _CONSTANT-CODE संकलन ,,
        ['] _TOVALUE-CODE संकलन,
 ;

सौभाग्य से, शब्द हेडर, जो इनपुट स्ट्रीम से एक स्ट्रिंग लेता है, शब्द शेर्ड के रूप में एक जोड़ी है, जो सृजित शब्द का पर्याय है।
बस एक को दूसरे के साथ बदलें और शब्द का आवश्यक संस्करण प्राप्त करें।
 : मान्य (एन एड्र यू ---)
       SHEADER
       ['] _CONSTANT-CODE संकलन ,,
       ['] _TOVALUE-CODE संकलन,
 ;


तो:
 VOCABULARY मान
 इसके अलावा मूल्य निर्धारण

 :; मान्य पूर्व प्राप्ति;
 : नॉटआउट 0;

 पूर्ववर्ती परिभाषाएँ 
  
 : मूल्य: ALSO मान 0;

लेकिन एक खामी है। सभी VALUE शून्य पर आरंभिक हैं। इसे खत्म करना अच्छा होगा।
कार्यान्वयन के लिए कई विकल्प हो सकते हैं।
आप बस रिकॉर्ड कर सकते हैं
 मान:
   ११ आ   
   22 बी.बी. 
   33 सी.सी.
 ? मूल्यों

यह अपठनीय है।

आइए इस तरह से लिखने की कोशिश करें:
 मान:
    आ = ११
    बब = २२
    cc = 33 
 ? मूल्यों

यह सुंदर दिखता है।

जाहिर है, मूल्यों के संदर्भ में "समान" शब्द मौजूद होना चाहिए। किसी को अगला शब्द चुनना होगा और उसे एक संख्या के रूप में व्याख्या करना होगा। यानी LITERAL का लगभग पर्यायवाची होना। एक अन्य "बराबर" को अंतिम परिभाषित VALUE चर के लिए इस मान को असाइन करना चाहिए।

हम लिखते हैं
 VOCABULARY मान
 इसके अलावा मूल्य निर्धारण

 :; मान्य पूर्व प्राप्ति;
 : = BL WORD; LITERAL LATEST NAME> 9 + EXECUTE;
 : नॉटआउट 0;

 पूर्ववर्ती परिभाषाएँ 
  
 : मूल्य: ALSO मान 0;


ऐसा विकल्प
 मान:
   ११ से आ   
   22 से बी.बी. 
   33 से सी.सी.
 ? मूल्यों
यह मूल्यवान है कि यह भाषा के प्रतिमान से बाहर नहीं होता है, इसके अलावा, यह आपको गणना मूल्यों के साथ VALUE चर को आरंभ करने की अनुमति देता है।
 मान:
        ११ से आ   
   22 1980 * टू बी.बी. 
   आब बीबी + को सी.सी.
 ? मूल्यों

इसे लागू करने के लिए, आपको NOTFOUND को फिर से परिभाषित करने की आवश्यकता नहीं है। केवल शब्द का अर्थ बदल दिया जाएगा। VALUES के बीच: टर्मिनेटर शब्द:: VALUES TO को एक सामान्य VALUE की तरह कार्य करना चाहिए।
 VOCABULARY मान
 इसके अलावा मूल्य निर्धारण

 :; मान्यताओं का मूल्य;
 : मूल्य के लिए;

 पूर्ववर्ती परिभाषाएँ 
  
 : मूल्य: ALSO मान;


आप स्थिरांक के लिए लेखन का एक समान तरीका बना सकते हैं।
 स्थिरांक:
        11 आईएस आ   
   22 1980 * आईएसबीएन 
   आ बब + आईएस
 ;

इस पद्धति का कार्यान्वयन, मुझे लगता है, स्पष्ट है।

सामान्य तौर पर, यह अभियान एक नए प्रकार के परिभाषित शब्द बनाता है - समूह परिभाषित शब्द। एक सरल परिभाषित शब्द आपको ऐसे शब्द बनाने की अनुमति देता है जो सामान्य शब्दार्थ से एकजुट होते हैं। समान संपत्ति रखने वाले समूह को स्रोत पाठ के एक भाग में एक ही प्रकार के शब्दों की परिभाषाओं को केंद्रित करने की आवश्यकता होती है। जो इसकी पठनीयता और संगत को सकारात्मक रूप से प्रभावित करता है।
एसपी-एसपी-फोर्थ के लिए एक और अधिक सुखद इसके अलावा, शब्द का समूह कार्यान्वयन है WINAPI:। विशेष रूप से, Winctl लाइब्रेरी में, WinAPI की परिभाषाएं पूरे पाठ में बिखरी हुई हैं, जो उदास दिखती हैं।
एक विकल्प के रूप में:
 WINAPIS:
     LIB: USER32.DLL
              PostQuitMessage
              PostMessageA
              SetActiveWindow
     LIB: GDI32.DLL
              CreateFontA
              GetDeviceCaps
              DeleteDC
     LIB: COMCTL32.DLL
              InitCommonControlsEx
 ? जीत

ऐसा करने के लिए, इस पर एक नज़र डालें कि कैसे WINAPI शब्द लागू किया गया है:
spf_win_defwords.f

 : __WIN: (पैराम्स "प्रोसीजरनाम" "लाइब्रेरीनेम" -)
   यहां> आर
   0, winproc का \ पता
   पुस्तकालय के नाम का 0, \ पता
   फ़ंक्शन नाम का 0, \ पता
   , मापदंडों का # #
   IS-TEMP-WL 0 =
   यदि
     यहाँ WinAPLINK @, WINAPLINK!  (लिंक)
   तब
   यहाँ DUP आर @ सेल + सेल +!
   PARSE-NAME CHARS HERE SWAP DUP ALLOT MOVE 0 C, \ फ़ंक्शन नाम
   यहाँ DUP आर> सेल +!
   PARSE-NAME CHARS HERE SWAP DUP ALLOT MOVE 0 C, \ _ लाइब्रेरी का नाम
   LoadLibraryA DUP 0 = IF -2009 THROW THEN \ ABORT "लाइब्रेरी नहीं मिली"
   GetProcAddress 0 = IF -2010 THROW THEN \ ABORT "प्रक्रिया नहीं मिली"
 ;

 : WINAPI: ("प्रोसीज़रनाम" "लाइब्रेरीनेम" -)
   (Win32 प्रक्रियाओं को आयात करने के लिए उपयोग किया जाता है।
     परिणामी परिभाषा को ProcedureName नाम दिया जाएगा।
     Winproc फ़ील्ड का पता पहले के समय पर भरा जाएगा
     परिणामी शब्दकोश प्रविष्टि का निष्पादन।
     प्राप्त "आयात" प्रक्रिया मापदंडों को कॉल करने के लिए
     रिवर्स ऑर्डर में डेटा स्टैक पर धक्का दिया
     इस प्रक्रिया के C कॉल में।  परिणाम परिणाम
     स्टैक पर धकेल दिया जाएगा।
   )
   नई-WINAPI?
   अगर हेडर
   वरना
     -1
     > @ @ हेडर में!
   तब
   ['] _WAPAPI- कोड संकलन,
   __WIN:
 ;


जाहिरा तौर पर DLL के विलंबित लोडिंग को लागू किया गया है। WinAPI कॉल कोड का एक लिंक आयातित फ़ंक्शन के नाम के साथ एक शब्दकोश प्रविष्टि में संकलित किया जाता है, फिर कुछ मापदंडों और फिर लाइब्रेरी फ़ाइल का नाम और उसमें प्रक्रिया। फिर, ऐसी फ़ाइल की उपस्थिति और ऐसी प्रक्रिया होती है।
हमारी इच्छाओं को यह कोड रीमेक करने के लिए, हम यह निर्धारित करेंगे कि प्रत्येक शब्द क्या करेगा।
; WINAPIS - केवल संदर्भ को पुनर्स्थापित करता है।
LIB: - इनपुट स्ट्रीम से अगले शब्द में प्रवेश करता है और इसे एक अस्थायी बफर में संग्रहीत करता है। इसे सत्यापन के साथ जोड़ा जा सकता है।
शेष शब्दों को प्रक्रियाओं के नाम के रूप में माना जाता है।

तो:
string to stack.f

 SP @ वैल्यू स्पस्टोर 
 : एसपी @ एसपी को बचाने के लिए;
 : sp- रिस्टोर स्पस्टोर एसपी!  ;
 : s-allot (n बाइट्स - addr) sp-save spstore SWAP-ALIGNED DUP> R CELL- CELL- SP!  आर>;
 : ss (- addr u) NextWord 2> RR @ s-allot DUP DUP R @ + 0!  2R >> R SWAP R @ CMOVE R>;
 : s-free spstore CELL + SP!  ;
 : 3DUP 2 PICK 2 PICK 2 PICK;


winapis.f

 VOCABULARY winlibs
 इसके अलावा विनफाइन्सेस की परिभाषाएँ

 :; विनैपिस एस-फ्री प्रीवियस;

 : LIB: (- addr u id) s-free ss CR OVER LoadLibraryA DUP 0 = IF -2009 THROW THEN;

 : NOTFOUND (एड्र यू आईडी एड्र यू - एड्र यू आईडी) 
           2> आर 3 डीयूपी 2 आर>    
           2DUP शेड
           ['] _WAPAPI- कोड संकलन, 
           यहां> आर  
           0, winproc का \ पता
           पुस्तकालय के नाम का 0, \ पता 
           फ़ंक्शन नाम का 0, \ पता
           -1, \ # पैरामीटर के
           IS-TEMP-WL 0 =
                      यदि
                         यहाँ WinAPLINK @, WINAPLINK!  (लिंक)
                      तब 
               यहाँ DUP आर @ सेल + सेल +!  > आर 
                यहाँ पर स्वैप डुप एलॉट मो 0 0, R> \ function नाम दिया गया है
               यहाँ आर> सेल +!  2> आर  
                 यहाँ पर स्वैप डुप अलॉट मोव 0 सी, 2 आर> \ लाइब्रेरी नाम है 
               SWAP GetProcAddress 0 = IF -2010 THROW THEN \ ABORT "प्रक्रिया नहीं मिली"
 ;

  पूर्ववर्ती परिभाषाएँ

 : WINAPIS: sp-save 1 2 3 ALSO winlibs; 




Source: https://habr.com/ru/post/In220365/


All Articles