{"id":2658,"date":"2022-01-09T15:37:53","date_gmt":"2022-01-09T10:07:53","guid":{"rendered":"https:\/\/www.rangakrish.com\/?p=2658"},"modified":"2022-01-09T15:37:53","modified_gmt":"2022-01-09T10:07:53","slug":"universal-function-call-syntax-ufcs-in-d-language","status":"publish","type":"post","link":"https:\/\/www.rangakrish.com\/index.php\/2022\/01\/09\/universal-function-call-syntax-ufcs-in-d-language\/","title":{"rendered":"Universal Function Call Syntax (UFCS) in D Language"},"content":{"rendered":"<p>One of the many <em><strong>&#8220;cool&#8217;<\/strong><\/em> features of <em><strong>Dlang<\/strong><\/em> is <a href=\"http:\/\/ddili.org\/ders\/d.en\/ufcs.html\" target=\"_blank\" rel=\"noopener\"><em><strong>&#8220;Universal Funcion Call Syntax&#8221;<\/strong><\/em><\/a>, which permits non-member functions to be invoked using the member function call syntax. When you add to this the fact that this applies not just to user-defined types but to primitive types as well, things get interesting.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p>Let us look at some examples to understand this feature.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p>Here is our first example:<\/p>\n<figure id=\"attachment_2659\" aria-describedby=\"caption-attachment-2659\" style=\"width: 550px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example1.jpg?ssl=1\"><img data-recalc-dims=\"1\" fetchpriority=\"high\" decoding=\"async\" data-attachment-id=\"2659\" data-permalink=\"https:\/\/www.rangakrish.com\/index.php\/2022\/01\/09\/universal-function-call-syntax-ufcs-in-d-language\/example1-27\/\" data-orig-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example1.jpg\" data-orig-size=\"960,748\" data-comments-opened=\"1\" data-image-meta=\"{&quot;credit&quot;:&quot;Admin&quot;,&quot;created_timestamp&quot;:&quot;1641725012&quot;}\" data-image-title=\"Example-1\" data-image-description=\"&lt;p&gt;Example-1&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Example-1&lt;\/p&gt;\n\" data-large-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example1.jpg\" class=\"wp-image-2659\" src=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example1.jpg?resize=550%2C429&#038;ssl=1\" alt=\"Example-1\" width=\"550\" height=\"429\" srcset=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example1.jpg?resize=300%2C234&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example1.jpg?resize=768%2C598&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example1.jpg?w=960&amp;ssl=1 960w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/a><figcaption id=\"caption-attachment-2659\" class=\"wp-caption-text\"><strong>Example 1<\/strong><\/figcaption><\/figure>\n<p>Here we have a user-defined type <em><strong>&#8220;A&#8221;<\/strong><\/em> with member function <em><strong>&#8220;foo()&#8221;<\/strong><\/em>. There is also a non-member function (<em><strong>&#8220;free&#8221;<\/strong><\/em> function) called <em><strong>&#8220;bar()&#8221;<\/strong><\/em> which takes <em><strong>&#8220;A&#8221;<\/strong><\/em> as its first argument. Line 28 shows how it is posible to call <em><strong>&#8220;bar()&#8221;<\/strong><\/em> as if it is a member function of <em><strong>&#8220;A&#8221;<\/strong><\/em>, in the same manner <em><strong>&#8220;foo()&#8221;<\/strong><\/em> is called. This is called <em><strong>UFCS<\/strong><\/em> in <em><strong>Dlang<\/strong><\/em>.<\/p>\n<p>What about the other way? Can member functions be invoked using regular function call syntax? No, that is not possible. See below:<\/p>\n<figure id=\"attachment_2660\" aria-describedby=\"caption-attachment-2660\" style=\"width: 550px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example2.jpg?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" data-attachment-id=\"2660\" data-permalink=\"https:\/\/www.rangakrish.com\/index.php\/2022\/01\/09\/universal-function-call-syntax-ufcs-in-d-language\/example2-23\/\" data-orig-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example2.jpg\" data-orig-size=\"992,464\" data-comments-opened=\"1\" data-image-meta=\"{&quot;credit&quot;:&quot;Admin&quot;,&quot;created_timestamp&quot;:&quot;1641725264&quot;}\" data-image-title=\"Example 2\" data-image-description=\"&lt;p&gt;Example 2&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Example 2&lt;\/p&gt;\n\" data-large-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example2.jpg\" class=\"wp-image-2660\" src=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example2.jpg?resize=550%2C257&#038;ssl=1\" alt=\"Example 2\" width=\"550\" height=\"257\" srcset=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example2.jpg?resize=300%2C140&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example2.jpg?resize=768%2C359&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example2.jpg?w=992&amp;ssl=1 992w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/a><figcaption id=\"caption-attachment-2660\" class=\"wp-caption-text\"><strong>Example 2<\/strong><\/figcaption><\/figure>\n<p>Line 26 is OK, but not Line 32.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p>Another case to consider is having a non-member function with the same name as member function and with the first argument as the user-defined type.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p>Take a look at this example:<\/p>\n<figure id=\"attachment_2661\" aria-describedby=\"caption-attachment-2661\" style=\"width: 550px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example3.jpg?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" data-attachment-id=\"2661\" data-permalink=\"https:\/\/www.rangakrish.com\/index.php\/2022\/01\/09\/universal-function-call-syntax-ufcs-in-d-language\/example3-20\/\" data-orig-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example3.jpg\" data-orig-size=\"981,525\" data-comments-opened=\"1\" data-image-meta=\"{&quot;credit&quot;:&quot;Admin&quot;,&quot;created_timestamp&quot;:&quot;1641725725&quot;}\" data-image-title=\"Example 3\" data-image-description=\"&lt;p&gt;Example 3&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Example 3&lt;\/p&gt;\n\" data-large-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example3.jpg\" class=\"wp-image-2661\" src=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example3.jpg?resize=550%2C294&#038;ssl=1\" alt=\"Example 3\" width=\"550\" height=\"294\" srcset=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example3.jpg?resize=300%2C161&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example3.jpg?resize=768%2C411&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example3.jpg?w=981&amp;ssl=1 981w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/a><figcaption id=\"caption-attachment-2661\" class=\"wp-caption-text\"><strong>Example 3<\/strong><\/figcaption><\/figure>\n<p>Here, in addition to the member function<em><strong> &#8220;foo()&#8221;<\/strong><\/em> in <em><strong>&#8220;<\/strong><strong>A&#8221;<\/strong><\/em>, we also have a non-member function <em><strong>&#8220;foo()&#8221;<\/strong><\/em> taking <em><strong>&#8220;A&#8221;<\/strong><\/em> type as its only argument. In this case, how does <em><strong>UFCS<\/strong><\/em> work? Line 33 shows that the member function will be used even if the <em><strong>&#8220;signature&#8221;<\/strong><\/em> appears to be the same. This means <em><strong>UFCS<\/strong><\/em> comes into picture only when there is no member function with that name.<\/p>\n<p>An additional rule is that functions declared in local scope (<em><strong>&#8220;nested&#8221;<\/strong><\/em> functions) are not considered for <em><strong>UFCS<\/strong><\/em>. This is shown in the following example:<\/p>\n<figure id=\"attachment_2662\" aria-describedby=\"caption-attachment-2662\" style=\"width: 550px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example4.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2662\" data-permalink=\"https:\/\/www.rangakrish.com\/index.php\/2022\/01\/09\/universal-function-call-syntax-ufcs-in-d-language\/example4-15\/\" data-orig-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example4.jpg\" data-orig-size=\"998,652\" data-comments-opened=\"1\" data-image-meta=\"{&quot;credit&quot;:&quot;Admin&quot;,&quot;created_timestamp&quot;:&quot;1641726156&quot;}\" data-image-title=\"Example 4\" data-image-description=\"&lt;p&gt;Example 4&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Example 4&lt;\/p&gt;\n\" data-large-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example4.jpg\" class=\"wp-image-2662\" src=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example4.jpg?resize=550%2C359&#038;ssl=1\" alt=\"Example 4\" width=\"550\" height=\"359\" srcset=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example4.jpg?resize=300%2C196&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example4.jpg?resize=768%2C502&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example4.jpg?resize=140%2C90&amp;ssl=1 140w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example4.jpg?w=998&amp;ssl=1 998w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/a><figcaption id=\"caption-attachment-2662\" class=\"wp-caption-text\"><strong>Example 4<\/strong><\/figcaption><\/figure>\n<p>Line 44 shows that the nested function cannot take advantage of <em><strong>UFCS<\/strong><\/em> feature.<\/p>\n<p>Finally, it is worthwhile to point out that even <em><strong>primitive<\/strong><\/em> types in <em><strong>DLang<\/strong><\/em> can take advantage of <em><strong>UFCS<\/strong><\/em>. Here is how:<\/p>\n<figure id=\"attachment_2663\" aria-describedby=\"caption-attachment-2663\" style=\"width: 500px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example5.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2663\" data-permalink=\"https:\/\/www.rangakrish.com\/index.php\/2022\/01\/09\/universal-function-call-syntax-ufcs-in-d-language\/example5-12\/\" data-orig-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example5.jpg\" data-orig-size=\"609,431\" data-comments-opened=\"1\" data-image-meta=\"{&quot;credit&quot;:&quot;Admin&quot;,&quot;created_timestamp&quot;:&quot;1641737488&quot;}\" data-image-title=\"Example 5\" data-image-description=\"&lt;p&gt;Example 5&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Example 5&lt;\/p&gt;\n\" data-large-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example5.jpg\" class=\"wp-image-2663\" src=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example5.jpg?resize=500%2C354&#038;ssl=1\" alt=\"Example 5\" width=\"500\" height=\"354\" srcset=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example5.jpg?resize=300%2C212&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/01\/Example5.jpg?w=609&amp;ssl=1 609w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><figcaption id=\"caption-attachment-2663\" class=\"wp-caption-text\"><strong>Example 5<\/strong><\/figcaption><\/figure>\n<p>The above shows how a sequence of operations on an integer array can be elegantly expressed using <em><strong>&#8220;chaining&#8221;<\/strong><\/em>, thanks to <em><strong>UFCS<\/strong><\/em>!<\/p>\n<p>Have a great weekend!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of the many &#8220;cool&#8217; features of Dlang is &#8220;Universal Funcion Call Syntax&#8221;, which permits non-member functions to be invoked using the member function call syntax. When you add to this the fact that this applies not just to user-defined types but to primitive types as well, things get interesting.\u00a0 Let us look at some [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[302,17],"tags":[305,306],"class_list":["post-2658","post","type-post","status-publish","format-standard","hentry","category-d-language","category-programming","tag-dlang","tag-ufcs"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9OLnF-GS","jetpack-related-posts":[{"id":1091,"url":"https:\/\/www.rangakrish.com\/index.php\/2018\/10\/14\/c17-stdapply-and-stdinvoke\/","url_meta":{"origin":2658,"position":0},"title":"C++17 &#8211; std::apply() and std::invoke()","author":"admin","date":"October 14, 2018","format":false,"excerpt":"Calling a function (or function object) dynamically, through a pointer known at runtime, is a common programming scenario. Almost all languages support this use case. Lisp, for example, has apply and funcall. When using apply, you can see that the arguments are passed via a separate list object. With funcall,\u2026","rel":"","context":"In &quot;C++&quot;","block_context":{"text":"C++","link":"https:\/\/www.rangakrish.com\/index.php\/category\/c\/"},"img":{"alt_text":"Calling Member Functions","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2018\/10\/Code5.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2018\/10\/Code5.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2018\/10\/Code5.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2018\/10\/Code5.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":2152,"url":"https:\/\/www.rangakrish.com\/index.php\/2020\/09\/28\/template-based-text-generation\/","url_meta":{"origin":2658,"position":1},"title":"Template-Based Text Generation","author":"admin","date":"September 28, 2020","format":false,"excerpt":"I had written earlier about natural language generation\u00a0using my iLangGen framework. I used a \"template\" text file which was instantiated dynamically based on predefined \"grammars\" and external data. The sample application I show-cased demonstrated its utility and versatility. Today I would like to touch upon a few other \"pattern\" elements\u2026","rel":"","context":"In &quot;LISP&quot;","block_context":{"text":"LISP","link":"https:\/\/www.rangakrish.com\/index.php\/category\/lisp\/"},"img":{"alt_text":"Template File","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/09\/Template-300x195.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/09\/Template-300x195.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/09\/Template-300x195.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":2540,"url":"https:\/\/www.rangakrish.com\/index.php\/2021\/09\/19\/c-20-concepts\/","url_meta":{"origin":2658,"position":2},"title":"C++ 20: Concepts","author":"admin","date":"September 19, 2021","format":false,"excerpt":"Concepts, introduced in C++20, are predicates that act as contraints on template parameters. As you would expect, the nice thing is that the constraint checking happens as part of template instantiation at compile time and not at run time! Since templates can have type as well as non-type parameters, Concepts\u2026","rel":"","context":"In &quot;C++&quot;","block_context":{"text":"C++","link":"https:\/\/www.rangakrish.com\/index.php\/category\/c\/"},"img":{"alt_text":"Constraint on Type","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2021\/09\/Example1-300x213.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":2580,"url":"https:\/\/www.rangakrish.com\/index.php\/2021\/10\/17\/some-interesting-features-of-newlisp\/","url_meta":{"origin":2658,"position":3},"title":"Some Interesting Features of &#8220;newLisp&#8221;","author":"admin","date":"October 17, 2021","format":false,"excerpt":"newLisp is a general-purpose scripting language with a Lisp-like syntax. That is one of the reasons I wanted to take a closer look at the language. It has a compact footprint, small resource requirements, and can easily be embedded. It is available on multiple platforms, and on my Windows machine,\u2026","rel":"","context":"In &quot;newLisp&quot;","block_context":{"text":"newLisp","link":"https:\/\/www.rangakrish.com\/index.php\/category\/newlisp\/"},"img":{"alt_text":"\"amb\" Function","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2021\/10\/example1.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":3675,"url":"https:\/\/www.rangakrish.com\/index.php\/2025\/04\/24\/interfaces-without-inheritance-comparing-c-and-common-lisp\/","url_meta":{"origin":2658,"position":4},"title":"Interfaces Without Inheritance: Comparing C++ and Common Lisp","author":"admin","date":"April 24, 2025","format":false,"excerpt":"Clean interface design is a crucial aspect of software engineering since it enables code flexibility, reuse, and maintainability. Developers who prefer an object-oriented approach typically rely on inheritance to define the interface and thus establish type relationships. While this can lead to a good design if approached carefully, detractors of\u2026","rel":"","context":"In &quot;C++&quot;","block_context":{"text":"C++","link":"https:\/\/www.rangakrish.com\/index.php\/category\/c\/"},"img":{"alt_text":"Rectangle and Circle Defined","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2025\/04\/cpp2-251x300.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":4348,"url":"https:\/\/www.rangakrish.com\/index.php\/2026\/08\/29\/freeformevaluate-function-in-wolfram-mathematica\/","url_meta":{"origin":2658,"position":5},"title":"FreeformEvaluate Function in Wolfram Mathematica","author":"admin","date":"August 29, 2026","format":false,"excerpt":"Mathematica has supported free-form linguistic input for years, but the function FreeformEvaluate introduced in ver 14.1 makes that capability more functional for developers. FreeformEvaluate basically accepts a natural language expression or query and returns the corresponding answer.\u00a0 Let us look at some examples. Instead of computing the 24th Fibonacci number\u2026","rel":"","context":"In &quot;Mathematica&quot;","block_context":{"text":"Mathematica","link":"https:\/\/www.rangakrish.com\/index.php\/category\/mathematica\/"},"img":{"alt_text":"Numerical Evaluation","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2026\/08\/Image1-300x113.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2026\/08\/Image1-300x113.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2026\/08\/Image1-300x113.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/posts\/2658","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/comments?post=2658"}],"version-history":[{"count":0,"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/posts\/2658\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/media?parent=2658"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/categories?post=2658"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/tags?post=2658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}