Odin के दस्तावेज़ बनाना¶
Odin डोमेन पैकेज, प्रोसीजर, प्रकार और सदस्य को नाम वाले लक्ष्य देता है। Guidedog Odin सोर्स पार्स करके API पेज भी बनाता है। वह कंपाइलर या पैकेज नहीं चलाता। बने सिग्नेचर के साथ भी उपयोगी अनुबंध चाहिए।
ऑब्जेक्ट का वर्णन¶
Python मॉड्यूल की तरह पैकेज आगे के विवरण का संदर्भ है:
.. odin:package:: core:strings
:synopsis: Procedures to manipulate UTF-8 encoded strings.
:imports: rt=base:runtime
.. odin:procedure:: @(require_results) clone :: proc(s: string, allocator := context.allocator) -> (res: string, err: rt.Allocator_Error) #optional_allocator_error
Clones a string.
:param s: The string to be cloned.
:result res: The cloned string.
:result err: An allocator error, or ``nil``.
.. odin:struct:: Builder :: struct
A dynamic byte buffer.
.. odin:field:: buf: [dynamic]byte
सिग्नेचर Odin घोषणाओं की तरह एक पंक्ति में लिखे और वैसे ही दिखाए जाते हैं। नीचे के उदाहरण ऐसे दिखते हैं:
- shapes.Kind :: enum u8
-
- Circle = 1
- @(require_results) shapes.area :: proc(side: f32, scale: f32 = 1) -> (a: f32, ok: bool) #optional_ok
-
एक वर्ग को मापता है।
- पैरामीटर:
side – इसकी भुजा।
- रिटर्न:
a – इसका क्षेत्रफल।
ok – इसका प्रकार ज्ञात है या नहीं।
निर्देश और उनके स्वीकार किए सिग्नेचर:
odin:packageऔरodin:currentpackage-
core:fmtया प्रोजेक्ट के मूल के नीचेreaders/sphinxजैसा पथ दें। ऑब्जेक्ट का नाम पैकेज इंपोर्ट पथ से है:core:fmt.println।odin:currentpackageबिना लक्ष्य बनाए संदर्भ बदलता है;Noneउसे हटाता है। विकल्प::synopsis:,:platform:,:deprecated:,:no-index:और:imports:। अंतिम में सिग्नेचर के इंपोर्ट उपनामalias=packageजोड़ों (gd=core rst=readers/rst) में हैं;gd.Node_Idतबcore.Node_Idसे लिंक होता है।:private:निजी प्रकार और प्रोसीजर समूह के निजी सदस्य (State Rules catalog_text) देता है। वर्णन न होने से सिग्नेचर इन्हें पाठ दिखाता है। बने पेज इन्हें स्वतः सूचीबद्ध करते हैं। odin:procedure(याodin:proc)-
name :: proc(params) -> resultsमें नाम से पहले गुण (@(require_results)),procसे पहले#force_inline, कॉल नियम (proc "c" (...)), डिफ़ॉल्ट तर्क (x := 1,x: int = 1),$Tबहुरूपी तर्क,..परिवर्तनीय तर्क,using,#c_vararg, नाम वाले परिणाम, टैग (#optional_ok) औरwhereखंड स्वीकार हैं।name(params) -> resultsइसका छोटा रूप है। odin:procgroup-
name :: proc{a, b}: हर सदस्य अपने प्रोसीजर से लिंक होता है। odin:struct,odin:union,odin:enum,odin:bitset,odin:bitfield,odin:type-
Name :: struct($T: typeid) #packed,Name :: union #no_nil {A, B},Name :: enum u8,Name :: bit_set[Flag; u8],Name :: bit_field u32।odin:typeमें distinct प्रकार और उपनाम (Handle :: distinct uintptr,Callback :: proc(x: int) -> bool) हैं। प्रकार की सामग्री में सदस्य आते हैं। odin:fieldऔरodin:enumerator-
प्रकार के भीतर
name: Typeके साथ टैग (name: string `json:"n"`) या बिट आकार (low: u8 | 3), औरNameयाName = 3हैं। इनके नामType.memberहोते हैं। odin:const,odin:var,odin:foreign-
NAME :: 64याNAME : int : 64;name: Type,name := valueयाname: Type = value; विदेशी इंपोर्ट के लिएlibc "system:c"।
हर ऑब्जेक्ट Sphinx के :no-index:, :no-index-entry:, :no-contents-entry: और :no-typesetting: लेता है। अपने विकल्प हैं :package: (दूसरे पैकेज में वर्णन), :private: और :deprecated: message (सिग्नेचर में न हों तो @(private) और @(deprecated="message")), :availability: Windows, Linux (पहली पंक्ति में उपलब्धता), :foreign: libc (foreign ब्लॉक का प्रोसीजर)। कई सिग्नेचर पंक्तियाँ अलग लक्ष्यों पर एक ऑब्जेक्ट दिखाती हैं; ID और सूचकांक केवल पहली को मिलते हैं।
प्रकार की जगह के नाम पहले सिग्नेचर के पैकेज और प्रकार में, फिर लिखे रूप में खोजकर लिंक होते हैं। अंतर्निहित प्रकार (int, string, rawptr, typeid, any आदि), कुंजीशब्द, बहुरूपी नाम ($T और आगे T, बाहरी प्रकार सहित), ऐरे लंबाई, डिफ़ॉल्ट, स्थिरांक, टैग और where खंड केवल लिखे रूप में दिखते हैं, लिंक नहीं।
रोल और ID¶
:odin:pkg:, :odin:proc:, :odin:type: (struct, union, enum, bit set, bit field आदि), :odin:const:, :odin:var:, :odin:field:, :odin:enumerator: और :odin:obj: (कोई भी) लिंक देते हैं। Python की तरह ~ अंतिम हिस्सा दिखाता है (:odin:proc:`~core:fmt.println` में println); प्रारंभिक . किसी ऑब्जेक्ट नाम का अंत खोजता है। खोज संदर्भ के प्रकार और पैकेज, फिर मूल नाम, फिर पथ के : या / के बाद होती है। fmt.println को core:fmt.println और sphinx.Config को readers/sphinx.Config मिलता है, जैसे Odin अंतिम पथ नाम लेता है। :imports: उपनाम पहले देखा जाता है। default-domain:: odin या primary_domain = "odin" में odin: छोड़ सकते हैं।
ID Sphinx का make_id है, odin- और पूरे नाम पर: odin-core-fmt.println, odin-readers-sphinx.Config.docname। Python ID की तरह केस और बिंदु रहते हैं; पथ का : और / हाइफ़न बनते हैं। ID पढ़ने योग्य, स्थिर और समान अंतिम नाम के पैकेज में अलग हैं। पैकेज ID odin-package- तथा पथ है। सूचकांक "println (procedure in core:fmt)" जैसा है। objects.inv सभी ऑब्जेक्ट odin डोमेन और प्रकार (odin:procedure, odin:struct, odin:field आदि) में रखता है; Sphinx मॉड्यूल की तरह पैकेज पहले हैं।
सामग्री के सूचना फ़ील्ड दूसरे डोमेन की तरह समूहित होते हैं: :param name: (:type name: सहित), नाम वाले परिणाम का :result name:, :returns: और :rtype:।
स्रोत से बनाना¶
सोर्स फ़ोल्डर के सापेक्ष पैकेज की जगह बताएँ:
odin_autoapi_dirs = ["../src"]
odin_collections = {core = "/usr/local/lib/odin/core"} # optional
odin_autoapi_dirs के नीचे पैकेज सापेक्ष पथ से नाम पाता है (src/shapes/round का shapes/round)। संग्रह में Odin इंपोर्ट नाम (core:strings) है। निर्माण निर्देश autodoc की तरह चलते हैं:
.. odin:autopackage:: shapes
:members:
:undoc-members:
:member-order: groupwise
.. odin:autoproc:: shapes.area
.. odin:autotype:: Shape
odin:autopackage पैकेज और टिप्पणी लिखता है; :members: पर सभी या चुनी घोषणाएँ भी। odin:autoproc, odin:autoprocgroup, odin:autotype, odin:autoconst, odin:autovar वर्तमान पैकेज नाम या package.name की एक घोषणा देते हैं। विकल्प: :members:, :undoc-members:, :private-members: (सामान्यतः हटे @(private)), :exclude-members:, :member-order: (डिफ़ॉल्ट source में फ़ाइल नाम फिर स्थान; alphabetical; groupwise के शीर्षक "Types", "Procedures", "Procedure groups", "Constants", "Variables", "Foreign imports") और :no-index:।
दस्तावेज़ टिप्पणियाँ घोषणा के ठीक ऊपर // पंक्तियाँ या /* */ ब्लॉक, तथा फ़ील्ड या enum सदस्य के अंत की टिप्पणी हैं। ये सादा पाठ हैं, जो इस तरह reStructuredText बनता है:
- अनुच्छेद अनुच्छेद रहते हैं;
- itemपंक्तियाँ सूची रहती हैं। - खाली पंक्ति या कोलन वाली पंक्ति (
Example:) के बाद टैब या स्पेस से इंडेंट ब्लॉकcode-block:: odinहै;Output:के बादtextहै। अनुच्छेद पंक्ति के ठीक बाद के पाठ से अधिक इंडेंट पंक्ति उसी को आगे बढ़ाती है। Inputs:के बाद- name: textसे:param name:फ़ील्ड औरReturns:से:result name:बनते हैं; नाम न हो तो:returns:। यह Odin कोर लाइब्रेरी का रूप है।NOTE:याWARNING:से शुरू पंक्ति नोट या चेतावनी बनती है।`code`लिटरल पाठ है। reStructuredText के मार्कअप वाले दूसरे अक्षर (*,|, शब्द के अंत का_आदि) एस्केप होते हैं, इसलिए टिप्पणी जैसी लिखी है वैसी दिखती है और चेतावनी नहीं आती।
API पृष्ठ¶
odin_autoapi_dirs देने पर हर पैकेज का पेज पढ़ने के दौरान बनता है, sphinx-autoapi की तरह। api/shapes में odin_autoapi_options के साथ odin:autopackage:: shapes और api/index में पैकेज व सारांश हैं। पेज प्रोजेक्ट दस्तावेज़ हैं: toctree, खोज, सामान्य सूचकांक, singlehtml और PDF में आते हैं, पर सोर्स फ़ोल्डर में नहीं लिखे जाते। सेटिंग:
odin_autoapi_dirs-
पेज पाने वाले पैकेज के फ़ोल्डर, सोर्स के सापेक्ष। केवल इनके और
odin_collectionsके नीचे की फ़ाइलें पढ़ी जाती हैं। बाहर जाता लिंक अस्वीकार है। odin_collections-
core:stringsजैसे निर्देश तर्कों के लिए संग्रह नाम और फ़ोल्डर की तालिका। इन पैकेजों के पेज नहीं बनते। odin_autoapi_root-
पेज का फ़ोल्डर; डिफ़ॉल्ट
"api"। स्रोत में समान नाम का दस्तावेज़ हो तो वही रहता है और चेतावनी मिलती है। odin_autoapi_options-
डिफ़ॉल्ट
["members", "undoc-members"];private-membersजोड़ा जा सकता है। odin_autoapi_member_order-
"source"(डिफ़ॉल्ट),"alphabetical"या"groupwise"। odin_autoapi_add_toctree_entry-
true(डिफ़ॉल्ट):api/indexमूल दस्तावेज़ के पहले toctree में जुड़ता है। odin_autoapi_generate_api_docs-
true(डिफ़ॉल्ट);falseमें फ़ोल्डर केवल निर्देशों के लिए पढ़े जाते हैं।
जिस पैकेज का दस्तावेज़ नहीं, उसके प्रकार (core:io.Writer) लिंक नहीं होते। -n में nitpick_ignore_regex = [["odin:type", "(core|base):.*"]] से चेतावनी दबाएँ। Guidedog का docs/api भी ऐसे बनता है।
प्लैटफ़ॉर्म¶
पैकेज के Odin लक्ष्यों का दस्तावेज़ उसी के फ़ाइल नियमों से बनता है। *_windows.odin, *_linux_arm64.odin, *_amd64.odin केवल संबंधित लक्ष्य हैं। #+build linux, darwin, #+build !windows और पुराने //+build दायरा घटाते हैं। फ़ाइल स्तर का when ODIN_OS == .Windows केवल ODIN_OS व ODIN_ARCH तुलना करे तो शाखा उसके लक्ष्य और else बाकी हैं। *_test.odin और #+ignore हटते हैं। सब लक्ष्यों की घोषणा एक बार; कुछ की "Availability: Windows" सहित। अलग सिग्नेचर अलग लक्ष्य सहित दिखते हैं; ID पहले का है। सीमित लक्ष्य वाला पैकेज :platform: बताता है।
दोबारा बिल्ड करना¶
पेज द्वारा पढ़ी हर Odin फ़ाइल उसकी निर्भरता है। सोर्स बदलने पर अगली बिल्ड केवल उस पैकेज के पेज फिर पढ़ती है। पैकेज जुड़ने, हटने या सारांश बदलने पर सूचकांक फिर पढ़ा जाता है। guidedog serve HTML देने से पहले odin_autoapi_dirs और odin_collections का बदलाव समय देखता है। संपादन के बाद ब्राउज़र रिफ़्रेश करें।
सीमाएँ¶
- सोर्स केवल पार्स होता है, संकलन या प्रकार जाँच नहीं। प्रकार और स्थिरांक जैसे लिखे हैं वैसे दिखते हैं; 100 अक्षर से बड़ा मान हटता है। अनुमान नहीं होता।
A :: Bका प्रकार या स्थिरांक नाम से तय है: बड़े अक्षर से शुरू लेकिन पूरी तरह बड़े अक्षर नहीं, या अंतर्निहित प्रकार, तो प्रकार है। whenमेंODIN_OSऔरODIN_ARCHकी तुलना के अलावा शर्तें नहीं जाँची जातीं; दोनों शाखाएँ लिखी जाती हैं।- निजी प्रकार का नाम पाठ दिखता है क्योंकि
:private-members:के बिना उसकी प्रविष्टि नहीं। बना पैकेज उन्हें:private:में रखता है, इसलिए-nरिपोर्ट नहीं करता। core:odin/parserदोनों#optional_okऔरwhereवाला प्रोसीजर अस्वीकार करता है। फ़ाइल की सूचना दी जाती है और पढ़ा जा सका हिस्सा दस्तावेज़ बनता है।- गहरे कोड में Odin पार्सर बहुत स्टैक लेता है; कुछ सौ कोष्ठक थ्रेड स्टैक भर सकते हैं। वास्तविक कोड से कहीं गहरी फ़ाइल (लगभग 50 कोष्ठक या प्रकार स्तर, या एक कड़ी में करीब हज़ार
else)odin.autodoc.nestingचेतावनी से हटती है। शेष पैकेज लिखा जाता है।whenके&&,||,!64 स्तर तक जाँचे जाते हैं; अधिक पर बिना मूल्यांकन माना जाता है।