{"id":2071,"date":"2020-08-01T19:23:24","date_gmt":"2020-08-01T13:53:24","guid":{"rendered":"https:\/\/www.rangakrish.com\/?p=2071"},"modified":"2020-08-01T19:23:24","modified_gmt":"2020-08-01T13:53:24","slug":"elixir-wrapping-lisp-calls-in-a-macro","status":"publish","type":"post","link":"https:\/\/www.rangakrish.com\/index.php\/2020\/08\/01\/elixir-wrapping-lisp-calls-in-a-macro\/","title":{"rendered":"Elixir: Wrapping Lisp Calls in a Macro"},"content":{"rendered":"<p>In the <a href=\"https:\/\/www.rangakrish.com\/index.php\/2020\/07\/19\/calling-lisp-functions-from-elixir\/\" target=\"_blank\" rel=\"noopener noreferrer\"><em><strong>last article<\/strong><\/em><\/a>, I showed how to make calls to Lisp functions from <em><strong>Elixir<\/strong><\/em>. We followed this pattern:<\/p>\n<blockquote><p><span style=\"color: #0000ff;\">1) Initialize the Lisp environment by calling <em><strong>Lisp.init<\/strong><\/em><\/span><\/p>\n<p><span style=\"color: #0000ff;\">2) Call Lisp functions as needed<\/span><\/p>\n<p><span style=\"color: #0000ff;\">3) Free the Lisp environment by calling <em><strong>Lisp.quit<\/strong><\/em><\/span><\/p><\/blockquote>\n<p>Using the powerful macro programming capabilities of <em><strong>Elixir<\/strong><\/em>, we can write a simple macro to wrap calls to <em><strong>Lisp<\/strong><\/em> functions, by adding <em><strong>Lisp.init<\/strong><\/em> and <em><strong>Lisp.quit<\/strong><\/em> automatically. This way, we do not have to worry about &#8220;forgetting&#8221; to handle initialization and termination. Such an approach is quite common when we program in <em><strong>Lisp<\/strong><\/em> itself.<\/p>\n<p>I have made a minor change in the <em><strong>Lisp NIF<\/strong><\/em> layer, corresponding to the <em><strong>&#8220;quit&#8221;<\/strong><\/em> function, to ensure that <em><strong>&#8220;init&#8221;<\/strong><\/em> and <em><strong>&#8220;quit&#8221;<\/strong><\/em> can be called multiple times as a pair. Here is the modified version:<\/p>\n<figure id=\"attachment_2072\" aria-describedby=\"caption-attachment-2072\" style=\"width: 650px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Code-change.jpg?ssl=1\"><img data-recalc-dims=\"1\" fetchpriority=\"high\" decoding=\"async\" data-attachment-id=\"2072\" data-permalink=\"https:\/\/www.rangakrish.com\/index.php\/2020\/08\/01\/elixir-wrapping-lisp-calls-in-a-macro\/code-change\/\" data-orig-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Code-change.jpg\" data-orig-size=\"1052,184\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;Admin&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1596269335&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Updated Quit Function\" data-image-description=\"&lt;p&gt;Updated Quit Function&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Updated Quit Function&lt;\/p&gt;\n\" data-large-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Code-change-1024x179.jpg\" class=\"wp-image-2072\" src=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Code-change.jpg?resize=650%2C114&#038;ssl=1\" alt=\"Updated Quit Function\" width=\"650\" height=\"114\" srcset=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Code-change.jpg?resize=1024%2C179&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Code-change.jpg?resize=300%2C52&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Code-change.jpg?resize=768%2C134&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Code-change.jpg?w=1052&amp;ssl=1 1052w\" sizes=\"(max-width: 650px) 100vw, 650px\" \/><\/a><figcaption id=\"caption-attachment-2072\" class=\"wp-caption-text\"><strong>Updated Quit Function<\/strong><\/figcaption><\/figure>\n<p><em><strong>Elixir<\/strong><\/em> macros are a major topic and we are not getting into the details here. There are several nice tutorials available on the internet. For example, see <a href=\"https:\/\/elixirschool.com\/en\/lessons\/advanced\/metaprogramming\/\" target=\"_blank\" rel=\"noopener noreferrer\"><em><strong>this<\/strong><\/em><\/a>\u00a0and <a href=\"https:\/\/curiosum.dev\/blog\/elixir-trickery-using-macros-metaprogramming\" target=\"_blank\" rel=\"noopener noreferrer\"><em><strong>this<\/strong><\/em><\/a>.<\/p>\n<p>Here is our macro:<\/p>\n<figure id=\"attachment_2073\" aria-describedby=\"caption-attachment-2073\" style=\"width: 401px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/macro.jpg?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" data-attachment-id=\"2073\" data-permalink=\"https:\/\/www.rangakrish.com\/index.php\/2020\/08\/01\/elixir-wrapping-lisp-calls-in-a-macro\/macro-3\/\" data-orig-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/macro.jpg\" data-orig-size=\"569,281\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;Admin&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1596268279&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Our Macro\" data-image-description=\"&lt;p&gt;Our Macro&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Our Macro&lt;\/p&gt;\n\" data-large-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/macro.jpg\" class=\"wp-image-2073\" src=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/macro.jpg?resize=401%2C198&#038;ssl=1\" alt=\"Our Macro\" width=\"401\" height=\"198\" srcset=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/macro.jpg?w=569&amp;ssl=1 569w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/macro.jpg?resize=300%2C148&amp;ssl=1 300w\" sizes=\"(max-width: 401px) 100vw, 401px\" \/><\/a><figcaption id=\"caption-attachment-2073\" class=\"wp-caption-text\"><strong>Our Macro<\/strong><\/figcaption><\/figure>\n<p>Macros can be difficult to understand and debug. So it helps if we have a utility function that shows how a macro call is actually expanded by <em><strong>Elixir<\/strong><\/em>. Writing such a function (a macro again!) is straightforward. I took the following code snippet from <a href=\"http:\/\/blog.maketogether.com\/building-a-macro-expansion-helper\/\" target=\"_blank\" rel=\"noopener noreferrer\"><em><strong>this article<\/strong><\/em><\/a>:<\/p>\n<figure id=\"attachment_2076\" aria-describedby=\"caption-attachment-2076\" style=\"width: 450px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/mex.jpg?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" data-attachment-id=\"2076\" data-permalink=\"https:\/\/www.rangakrish.com\/index.php\/2020\/08\/01\/elixir-wrapping-lisp-calls-in-a-macro\/mex\/\" data-orig-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/mex.jpg\" data-orig-size=\"851,278\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;Admin&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1596268444&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Understanding Macro Expansion\" data-image-description=\"&lt;p&gt;Understanding Macro Expansion&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Understanding Macro Expansion&lt;\/p&gt;\n\" data-large-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/mex.jpg\" class=\"wp-image-2076\" src=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/mex.jpg?resize=450%2C147&#038;ssl=1\" alt=\"Understanding Macro Expansion\" width=\"450\" height=\"147\" srcset=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/mex.jpg?w=851&amp;ssl=1 851w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/mex.jpg?resize=300%2C98&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/mex.jpg?resize=768%2C251&amp;ssl=1 768w\" sizes=\"(max-width: 450px) 100vw, 450px\" \/><\/a><figcaption id=\"caption-attachment-2076\" class=\"wp-caption-text\"><strong>Understanding Macro Expansion<\/strong><\/figcaption><\/figure>\n<p>Now, it is time to actually put our macro to use. Here is a sample session:<\/p>\n<figure id=\"attachment_2077\" aria-describedby=\"caption-attachment-2077\" style=\"width: 550px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Session.jpg?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2077\" data-permalink=\"https:\/\/www.rangakrish.com\/index.php\/2020\/08\/01\/elixir-wrapping-lisp-calls-in-a-macro\/session-3\/\" data-orig-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Session.jpg\" data-orig-size=\"854,536\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;Admin&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1596269275&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Sample Session\" data-image-description=\"&lt;p&gt;Sample Session&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Sample Session&lt;\/p&gt;\n\" data-large-file=\"https:\/\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Session.jpg\" class=\"wp-image-2077\" src=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Session.jpg?resize=550%2C345&#038;ssl=1\" alt=\"Sample Session\" width=\"550\" height=\"345\" srcset=\"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Session.jpg?w=854&amp;ssl=1 854w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Session.jpg?resize=300%2C188&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/08\/Session.jpg?resize=768%2C482&amp;ssl=1 768w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/a><figcaption id=\"caption-attachment-2077\" class=\"wp-caption-text\"><strong>Sample Session<\/strong><\/figcaption><\/figure>\n<p>Since we are calling a macro, we have to <em><strong>&#8220;require Lisp&#8221;<\/strong><\/em> first. Additionally, for convenience, I am <em><strong>importing<\/strong><\/em> the same package. This allows us to use the functions in the package without explicitly using the package prefix.<\/p>\n<p>You can also see how &#8220;<em><strong>mex&#8221;<\/strong><\/em>\u00a0dumps the expanded macro call.\u00a0<em><strong>Lisp.init<\/strong><\/em>\u00a0and <em><strong>Lisp.quit <\/strong><\/em>are automatically inserted at the beginning and end respectively by our <em><strong>&#8220;with_lisp&#8221;<\/strong><\/em> macro.<\/p>\n<p>The updated <em><strong>NIF &#8220;C&#8221;<\/strong><\/em> source and the <em><strong>Elixir<\/strong><\/em> code are available <a href=\"http:\/\/www.rangakrish.com\/downloads\/Elixir-macro.zip\" target=\"_blank\" rel=\"noopener noreferrer\"><em><strong>here<\/strong><\/em><\/a>.<\/p>\n<p>Have a nice weekend!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the last article, I showed how to make calls to Lisp functions from Elixir. We followed this pattern: 1) Initialize the Lisp environment by calling Lisp.init 2) Call Lisp functions as needed 3) Free the Lisp environment by calling Lisp.quit Using the powerful macro programming capabilities of Elixir, we can write a simple macro [&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_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_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}},"categories":[242,18,17],"tags":[243,19,246,245],"class_list":["post-2071","post","type-post","status-publish","format-standard","hentry","category-elixir","category-lisp","category-programming","tag-elixir","tag-lisp","tag-macro","tag-nif"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9OLnF-xp","jetpack-related-posts":[{"id":2057,"url":"https:\/\/www.rangakrish.com\/index.php\/2020\/07\/19\/calling-lisp-functions-from-elixir\/","url_meta":{"origin":2071,"position":0},"title":"Calling Lisp Functions from Elixir","author":"admin","date":"July 19, 2020","format":false,"excerpt":"In the last article\u00a0I showed how we can simulate the idea of Lisp's \"closure\" in Elixir. Today, I would like to demonstrate how we can call Lisp functions from Elixir using the NIF interface. What is the need to integrate Elixir with another language? I can think of two reasons:\u2026","rel":"","context":"In &quot;Elixir&quot;","block_context":{"text":"Elixir","link":"https:\/\/www.rangakrish.com\/index.php\/category\/elixir\/"},"img":{"alt_text":"Using the Lisp Functions","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/07\/Session.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/07\/Session.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/07\/Session.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/07\/Session.jpg?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":2042,"url":"https:\/\/www.rangakrish.com\/index.php\/2020\/07\/05\/closure-in-lisp-vs-elixir\/","url_meta":{"origin":2071,"position":1},"title":"Closure in Lisp vs Elixir","author":"admin","date":"July 5, 2020","format":false,"excerpt":"I started learning Elixir\u00a0a week ago. Although this has been at the top of my To-do list for quite a while, I couldn't take it up due to other commitments.\u00a0 I love Elixir. It is a great functional programming language. Having programmed in Lisp for a long time, I immediately\u2026","rel":"","context":"In &quot;Elixir&quot;","block_context":{"text":"Elixir","link":"https:\/\/www.rangakrish.com\/index.php\/category\/elixir\/"},"img":{"alt_text":"Program Output","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/07\/elixir-output2.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/07\/elixir-output2.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/07\/elixir-output2.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2020\/07\/elixir-output2.jpg?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":3017,"url":"https:\/\/www.rangakrish.com\/index.php\/2023\/02\/16\/calling-external-dll-functions-from-julia\/","url_meta":{"origin":2071,"position":2},"title":"Calling External DLL Functions from Julia","author":"admin","date":"February 16, 2023","format":false,"excerpt":"Julia supports calling external functions, especially those written in \u201cC\u201d language. As Julia documentation says, such calls do not involve any \u201cboilerplate\u201d code and hence are efficient. In today\u2019s article, I am going to show how to call functions defined in a DLL (Windows 64 bit). Instead of using direct\u2026","rel":"","context":"In &quot;Julia&quot;","block_context":{"text":"Julia","link":"https:\/\/www.rangakrish.com\/index.php\/category\/julia\/"},"img":{"alt_text":"The \"lispEval\" Function","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2023\/02\/code-300x117.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2023\/02\/code-300x117.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2023\/02\/code-300x117.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":2645,"url":"https:\/\/www.rangakrish.com\/index.php\/2021\/12\/25\/calling-lisp-functions-from-d-language\/","url_meta":{"origin":2071,"position":3},"title":"Calling Lisp Functions from D Language","author":"admin","date":"December 25, 2021","format":false,"excerpt":"After exploring \"newLisp\" in the past few posts, I would like to start looking at the \"D Programming Language\"\u00a0(DLang). DLang\u00a0has been around since 2001. It was originally created by Walter Bright and later Andrei Alexandrescu joined the team in 2007. The main inspiration for DLang was C++, although it uses\u2026","rel":"","context":"In &quot;D Language&quot;","block_context":{"text":"D Language","link":"https:\/\/www.rangakrish.com\/index.php\/category\/d-language\/"},"img":{"alt_text":"Lisp Function Called from D","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2021\/12\/Lisp-300x107.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2021\/12\/Lisp-300x107.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2021\/12\/Lisp-300x107.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":963,"url":"https:\/\/www.rangakrish.com\/index.php\/2018\/06\/24\/calling-go-functions-from-lisp-part-2\/","url_meta":{"origin":2071,"position":4},"title":"Calling Go Functions from Lisp &#8211; Part 2","author":"admin","date":"June 24, 2018","format":false,"excerpt":"In my earlier article Calling Go Functions from Lisp, I explained the steps for making calls to Go functions from another language, specifically LispWorks Lisp. Today, I want to give a slightly more\u00a0 interesting example showing the use of Go channels\u00a0through exported functions. Go is widely admired for its native\u2026","rel":"","context":"In &quot;Golang&quot;","block_context":{"text":"Golang","link":"https:\/\/www.rangakrish.com\/index.php\/category\/golang\/"},"img":{"alt_text":"Go Functions","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2018\/06\/Go-Functions.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2815,"url":"https:\/\/www.rangakrish.com\/index.php\/2022\/05\/29\/setting-up-function-hooks-in-lisp\/","url_meta":{"origin":2071,"position":5},"title":"Setting Up Function Hooks in Lisp","author":"admin","date":"May 29, 2022","format":false,"excerpt":"Lisp is known to be a highly dynamic language, where functions are first-class\u00a0objects. It is possible to define and undefine functions on the fly as well as attach hooks to existing functions. These are in addition to the ability to pass functions as parameters to other functions and returning a\u2026","rel":"","context":"In &quot;LISP&quot;","block_context":{"text":"LISP","link":"https:\/\/www.rangakrish.com\/index.php\/category\/lisp\/"},"img":{"alt_text":"Function Object","src":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/05\/Function-Object1-300x58.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/05\/Function-Object1-300x58.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.rangakrish.com\/wp-content\/uploads\/2022\/05\/Function-Object1-300x58.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/posts\/2071","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=2071"}],"version-history":[{"count":0,"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/posts\/2071\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/media?parent=2071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/categories?post=2071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rangakrish.com\/index.php\/wp-json\/wp\/v2\/tags?post=2071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}