CINXE.COM
The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language—Stephen Wolfram Writings
<!DOCTYPE html> <html lang="en" prefix="fb: http://www.facebook.com/2008/fbml, og: http://ogp.me/ns#"> <head> <!-- begin framework head en --> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta charset="utf-8"> <title>The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language—Stephen Wolfram Writings</title> <meta name="description" content="The Wolfram Function Repository makes it possible for anyone to easily add functionality to the Wolfram Language. Automation and design principles make every function work. Each function has documentation and examples."> <meta property="og:title" content="The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language—Stephen Wolfram Writings"> <meta property="og:description" content="The Wolfram Function Repository makes it possible for anyone to easily add functionality to the Wolfram Language. Automation and design principles make every function work. Each function has documentation and examples."> <meta name="twitter:title" content="The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language—Stephen Wolfram Writings"> <meta name="twitter:description" content="The Wolfram Function Repository makes it possible for anyone to easily add functionality to the Wolfram Language. Automation and design principles make every function work. Each function has documentation and examples."> <link rel="stylesheet" href="/common/framework/css/framework.en.css"> <script src="//www.wolframcdn.com/consent/cookie-consent.js"></script> <script src="/common/javascript/wal/latest/walLoad.js"></script> <script defer src="/common/js/announcements/script.js"></script> <script src="/common/framework/js/head.en.js"></script> <script src="/common/js/jquery/3.7.1/jquery.min.js"></script> <script src="/common/js/jquery/plugins/migrate/3.5.2/jquery.migrate.min.js"></script> <script src="/common/javascript/analytics.js"></script> <!-- end framework head en --> <script src="https://writings.stephenwolfram.com/wp-content/themes/sw-writings/jquery.lazy.min.js"></script> <script> $(function() { $('.lazy').Lazy({ effect: 'fadeIn', effectTime: 250, threshold:200 }); }); </script> <script type="text/javascript" src="https://writings.stephenwolfram.com/wp-content/themes/sw-writings/sw.js"></script> <link rel="stylesheet" href="//www.wolframcdn.com/fonts/source-sans-pro/1.0/global.css"> <link rel="stylesheet" href="//www.wolframcdn.com/fonts/hack/3.003/global.css"> <link rel="stylesheet" href="//www.wolframcdn.com/fonts/mathematica/1.0/all.css"> <link rel="stylesheet" href="https://writings.stephenwolfram.com/wp-content/themes/sw-writings/clipboard.css" type="text/css" media="all" /> <link rel="stylesheet" href="https://writings.stephenwolfram.com/wp-content/themes/sw-writings/python-pygments.css" type="text/css" media="all" /> <link rel="stylesheet" href="/common/js/clipboard/2.0/clipboard.css"> <link rel="stylesheet" href="/common/templates/www.stephenwolfram.com/css/responsive-header.css" /> <link rel="stylesheet" href="https://writings.stephenwolfram.com/wp-content/themes/sw-writings/style.css" type="text/css" media="all" /> <link rel="alternate" type="application/rss+xml" title="Stephen Wolfram Writings RSS Feed" href="https://writings.stephenwolfram.com/feed/" /> <link rel="alternate" type="application/atom+xml" title="Stephen Wolfram Writings Atom Feed" href="https://writings.stephenwolfram.com/feed/atom/" /> <script type="text/javascript" src="https://files.wolframcdn.com/pub/writings.stephenwolfram.com/js/menu.js?5db8f077951d5e4ef6fbad86daf24214146552f3ae141ac21f7cf2aef767799678b244ec4070f219c19860ab58d8271a"></script> <link rel="stylesheet" href="/common/javascript/jquery/ui/1.10.2/themes/base/jquery.ui.all.css"> <link rel="stylesheet" href="/common/javascript/jquery/plugins/colorbox/colorbox.css"> <script src="/common/javascript/jquery/ui/1.10.2/ui/jquery.ui.core.js"></script> <script src="/common/javascript/jquery/ui/1.10.2/ui/jquery.ui.widget.js"></script> <script src="/common/javascript/jquery/ui/1.10.2/ui/jquery.ui.mouse.js"></script> <script src="/common/javascript/jquery/ui/1.10.2/ui/jquery.ui.slider.js"></script> <script src="/common/javascript/jquery/plugins/colorbox/jquery.colorbox.js"></script> <link rel="stylesheet" href="/common/javascript/jquery/plugins/magnific/magnific.css"> <link rel="stylesheet" href="/common/javascript/jquery/plugins/magnific/magnific-types.css"> <script src="/common/javascript/jquery/plugins/magnific/magnific.min.js"></script> <script src="/common/javascript/jquery/plugins/magnific/magnific-types.js"></script> <link rel='dns-prefetch' href='//s.w.org' /> <link rel="alternate" type="application/rss+xml" title="Stephen Wolfram Writings » The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language Comments Feed" href="https://writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language/feed/" /> <script type="text/javascript"> window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/2.2.1\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/2.2.1\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/writings.stephenwolfram.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=4.7.2"}}; !function(a,b,c){function d(a){var b,c,d,e,f=String.fromCharCode;if(!k||!k.fillText)return!1;switch(k.clearRect(0,0,j.width,j.height),k.textBaseline="top",k.font="600 32px Arial",a){case"flag":return k.fillText(f(55356,56826,55356,56819),0,0),!(j.toDataURL().length<3e3)&&(k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57331,65039,8205,55356,57096),0,0),b=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57331,55356,57096),0,0),c=j.toDataURL(),b!==c);case"emoji4":return k.fillText(f(55357,56425,55356,57341,8205,55357,56507),0,0),d=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55357,56425,55356,57341,55357,56507),0,0),e=j.toDataURL(),d!==e}return!1}function e(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var f,g,h,i,j=b.createElement("canvas"),k=j.getContext&&j.getContext("2d");for(i=Array("flag","emoji4"),c.supports={everything:!0,everythingExceptFlag:!0},h=0;h<i.length;h++)c.supports[i[h]]=d(i[h]),c.supports.everything=c.supports.everything&&c.supports[i[h]],"flag"!==i[h]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[i[h]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(g=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1)):(a.attachEvent("onload",g),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),f=c.source||{},f.concatemoji?e(f.concatemoji):f.wpemoji&&f.twemoji&&(e(f.twemoji),e(f.wpemoji)))}(window,document,window._wpemojiSettings); </script> <style type="text/css"> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 .07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <link rel='stylesheet' id='howToCiteCss-css' href='https://writings.stephenwolfram.com/wp-content/themes/sw-writings/HowToCite/style.css?ver=4.7.2' type='text/css' media='all' /> <script type='text/javascript' src='https://writings.stephenwolfram.com/wp-content/themes/sw-writings/HowToCite/HowToCite.js?ver=4.7.2'></script> <link rel='https://api.w.org/' href='https://writings.stephenwolfram.com/wp-json/' /> <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://writings.stephenwolfram.com/wp-includes/wlwmanifest.xml" /> <link rel='prev' title='Remembering Murray Gell-Mann (1929–2019), Inventor of Quarks' href='https://writings.stephenwolfram.com/2019/05/remembering-murray-gell-mann-1929-2019-inventor-of-quarks/' /> <link rel='next' title='A Few Thoughts about Deep Fakes' href='https://writings.stephenwolfram.com/2019/06/a-few-thoughts-about-deep-fakes/' /> <link rel='shortlink' href='https://writings.stephenwolfram.com/?p=20755' /> <link rel="alternate" type="application/json+oembed" href="https://writings.stephenwolfram.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwritings.stephenwolfram.com%2F2019%2F06%2Fthe-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language%2F" /> <link rel="alternate" type="text/xml+oembed" href="https://writings.stephenwolfram.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwritings.stephenwolfram.com%2F2019%2F06%2Fthe-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language%2F&format=xml" /> <link rel='canonical' href='https://writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language/'/> <style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style> </head> <body id="blog" class="post-template-default single single-post postid-20755 single-format-standard"> <a name="top"></a> <div id="wrapper"> <header id="header"> <div class="inner"> <button class="hamburger">≡</button> <h1 id="logo"> <a href="https://www.stephenwolfram.com">Stephen Wolfram <svg viewBox="6.252 51.944 1031.673 96.468"> <g id="logoSVG"> <path d="M643.657,60.162c1.429-0.357,2.501-0.714,3.572-0.714h0.536V53.91h-34.121v5.538h0.536 c4.287,0.357,7.503,1.072,9.468,1.965c1.787,0.894,2.68,1.965,2.68,3.216c0,1.072-0.179,2.322-0.357,3.751 s-0.893,4.288-1.965,8.218c-1.429,5.716-3.395,12.505-5.538,20.544c-2.144,7.682-4.645,16.436-7.503,26.439L588.456,55.16h-6.968 l-22.33,66.812c-4.823-16.971-8.218-29.297-10.719-37.693c-2.501-8.575-4.287-15.006-5.181-18.758c0-0.357-0.179-1.072-0.357-1.786 c-0.179-0.715-0.179-1.251-0.179-1.608c0-1.072,1.607-1.608,3.037-1.965c2.322-0.536,5.002-0.714,8.218-0.893h0.536V53.91h-38.23 v5.538h0.536c1.071,0,2.322,0.357,3.751,0.714c1.43,0.357,2.502,0.894,3.573,1.608c1.251,0.893,2.144,1.787,2.858,2.68 s1.251,2.144,1.607,3.394c1.608,5.538,4.646,16.257,9.111,32.514c4.466,16.078,8.933,31.799,13.22,46.805l0.179,0.357h6.432 l23.581-69.314l22.509,68.957l0.179,0.357h6.61l0.178-0.357c4.646-14.827,9.111-29.119,13.041-42.339 c4.109-13.22,7.504-24.832,10.54-34.657c0.715-2.144,1.43-3.751,2.323-5.002c0.893-1.25,2.144-2.144,3.572-3.215 C640.978,61.234,642.406,60.698,643.657,60.162z" /> <path d="M693.856,87.673c-2.858-3.037-6.253-5.359-10.183-6.967c-3.931-1.608-8.039-2.501-12.506-2.501 c-4.287,0-8.396,0.893-12.147,2.501c-3.931,1.607-7.324,3.93-10.183,6.967c-2.858,3.037-5.359,6.789-6.968,11.076 c-1.607,4.288-2.501,9.111-2.501,14.47c0,4.823,0.894,9.647,2.322,13.935c1.608,4.287,3.752,8.039,6.61,11.076 s6.253,5.537,10.004,7.324c3.931,1.786,8.218,2.68,12.862,2.68c4.288,0,8.396-0.894,12.327-2.502 c3.751-1.607,7.146-3.93,10.183-6.967s5.359-6.788,6.967-11.076c1.608-4.287,2.501-9.11,2.501-14.291s-0.893-10.004-2.501-14.292 C699.037,94.462,696.715,90.71,693.856,87.673z M690.998,113.041c0,4.287-0.357,8.218-1.251,11.791 c-0.714,3.395-1.965,6.609-3.751,9.289l0,0c-1.608,2.68-3.752,4.823-6.253,6.252c-2.501,1.43-5.538,2.323-8.575,2.323 c-3.394,0-6.431-0.715-8.753-2.144c-2.501-1.43-4.467-3.573-6.074-6.253s-2.858-5.896-3.752-9.29 c-0.714-3.572-1.25-7.502-1.25-11.969c0-3.93,0.357-7.86,1.071-11.434c0.715-3.572,1.787-6.788,3.395-9.289 c1.608-2.68,3.573-5.002,6.074-6.61s5.538-2.501,9.11-2.501c3.216,0,6.074,0.714,8.575,2.144s4.466,3.395,6.253,5.896 c1.607,2.68,2.858,5.716,3.751,9.468C690.641,104.467,690.998,108.754,690.998,113.041z" /> <path d="M760.49,126.082c-0.714,1.787-1.786,4.109-3.394,6.967c-1.608,2.859-3.037,5.002-4.288,6.432 c-0.356,0.357-0.893,0.715-1.786,1.072s-1.786,0.535-2.858,0.715c-1.071,0.178-2.322,0.356-3.395,0.356 c-1.25,0-2.322,0.179-3.572,0.179c-2.501,0-4.466,0-5.896-0.179c-1.25-0.179-2.322-0.536-2.858-0.894 c-0.715-0.535-1.071-1.25-1.25-2.322c-0.179-1.071-0.357-2.68-0.357-4.645V89.46c0-0.893,0.179-1.787,0.535-2.68 c0.357-0.714,0.894-1.25,1.787-1.608c0.536-0.179,1.607-0.536,2.858-0.714c1.25-0.357,2.501-0.357,3.216-0.536h0.535v-4.287 h-28.583v4.287h0.536c0.715,0,1.786,0.179,3.037,0.536c1.25,0.357,2.144,0.714,2.858,1.072c0.893,0.357,1.607,1.072,1.786,1.608 c0.357,0.714,0.536,1.608,0.536,2.501v46.983c0,1.071-0.179,1.966-0.536,2.68c-0.357,0.715-0.894,1.251-1.786,1.608 c-0.536,0.178-1.43,0.357-2.858,0.535c-1.43,0.179-2.501,0.179-3.216,0.357h-0.536v4.287h51.986l1.429-20.543h-4.108 L760.49,126.082z" /> <path d="M768.708,83.922h0.536c0.715,0,1.965,0.179,3.216,0.536c1.429,0.357,2.501,0.714,3.216,1.072 c0.893,0.357,1.607,1.072,1.786,1.608c0.357,0.714,0.536,1.608,0.536,2.501v47.341c0,1.071-0.179,1.965-0.536,2.68 c-0.357,0.714-0.894,1.251-1.786,1.608c-0.357,0.178-1.072,0.356-2.858,0.535c-1.608,0.179-2.68,0.179-3.752,0.357h-0.536v4.287 h29.298v-4.287h-0.536c-0.714,0-1.965-0.179-3.394-0.536c-1.787-0.356-2.68-0.536-2.858-0.714 c-0.894-0.357-1.608-1.072-1.965-1.787c-0.357-0.715-0.536-1.607-0.536-2.501v-22.151h6.967c1.965,0,3.573,0.178,5.002,0.535 c1.251,0.357,2.322,1.072,3.216,2.145c0.536,0.714,1.072,1.965,1.607,3.572c0.536,1.607,0.894,3.216,0.894,4.467v0.535h4.466 V98.928h-4.466v0.357c-0.179,1.607-0.536,3.037-0.894,4.466c-0.535,1.429-1.071,2.322-1.607,3.037 c-0.894,0.893-1.786,1.607-3.037,2.143c-1.25,0.537-2.858,0.715-5.181,0.715h-6.967V84.458h10.54c1.607,0,3.037,0,4.466,0.179 c1.251,0,2.501,0.179,3.395,0.357c1.786,0.179,3.572,1.787,5.538,4.466c1.965,2.68,3.394,5.359,3.93,7.682l0.179,0.357h4.288V80.17 h-52.165V83.922L768.708,83.922z" /> <path d="M952.534,141.624c-1.072-0.356-1.966-0.536-2.68-1.071c-1.072-0.715-1.787-1.43-2.323-2.145 c-0.535-0.715-1.071-1.607-1.429-2.857l-21.795-56.452l-0.179-0.357h-4.287l-0.179,0.357c-3.037,8.039-6.609,17.15-10.54,27.333 c-3.93,10.182-7.503,19.472-10.897,27.689c-0.714,1.607-1.25,2.858-1.965,3.572c-0.715,0.895-1.607,1.787-2.68,2.502 c-0.715,0.535-1.607,0.893-2.858,1.072c-0.536,0.178-1.071,0.178-1.607,0.356c-0.357,0-0.715-0.179-1.251-0.179 c-1.071-0.178-2.144-0.535-2.858-0.893c-1.071-0.536-2.144-1.251-3.215-2.145c-1.072-0.893-2.323-2.144-3.573-3.93 c-3.037-4.109-5.717-7.682-7.86-10.719c-1.965-2.858-4.645-6.252-7.682-10.183c2.144-0.715,4.108-1.429,5.896-2.322 c1.965-1.072,3.751-2.144,5.002-3.573c1.607-1.43,2.68-3.215,3.572-5.181c0.715-1.965,1.251-4.288,1.251-6.789 c0-2.858-0.536-5.359-1.787-7.503c-1.25-1.965-2.68-3.751-4.645-5.002s-4.287-2.144-6.788-2.858 c-2.501-0.536-5.181-0.893-7.86-0.893H826.59v4.287h0.535c0.894,0,1.965,0.179,3.037,0.357c1.251,0.179,2.144,0.536,2.858,0.715 c1.072,0.357,1.607,0.893,1.965,1.607c0.357,0.715,0.357,1.608,0.357,2.68v47.341c0,1.072-0.179,1.965-0.536,2.68 c-0.356,0.715-0.893,1.25-1.786,1.607c-0.536,0.18-1.429,0.357-2.858,0.537c-1.429,0.178-2.501,0.178-3.216,0.356h-0.535v4.288 h28.583v-4.288h-0.536c-0.894,0-2.144-0.179-3.395-0.356c-1.25-0.18-2.322-0.357-2.858-0.537c-0.893-0.357-1.607-0.893-1.965-1.607 s-0.536-1.607-0.536-2.68v-19.83h5.896c3.573,4.646,6.967,9.29,10.004,13.578c3.037,4.466,6.61,9.825,10.54,15.898l0.179,0.18 h14.471h3.93h21.616v-4.288h-0.536c-2.322-0.179-4.466-0.536-6.431-1.251c-1.786-0.535-2.501-1.429-2.501-2.322 c0-0.535,0-1.071,0.179-1.965c0.179-0.893,0.356-1.965,0.893-3.215c0.357-1.43,0.894-2.859,1.43-4.467 c0.536-1.43,1.25-3.215,1.965-5.359h22.331l5.359,14.291c0.178,0.357,0.178,0.537,0.178,0.895c0,0.356,0,0.714,0,0.893 c0,0.357-0.714,0.893-1.965,1.25c-1.607,0.537-3.572,0.715-5.895,0.894h-0.536v4.288h28.94v-4.288h-0.536 C954.499,141.981,953.605,141.803,952.534,141.624z M928.238,118.579h-18.222l9.11-23.581L928.238,118.579z M866.069,96.963 c0,4.467-1.429,8.039-4.108,10.719s-6.253,3.93-10.183,3.93h-5.538V84.637h7.324c3.931,0,7.146,1.072,9.29,3.394 C864.998,90.175,866.069,93.211,866.069,96.963z" /> <path d="M1037.211,141.981c-0.714,0-1.965-0.179-3.215-0.357c-1.43-0.179-2.322-0.536-2.858-0.894 c-0.894-0.535-1.608-1.071-1.965-1.786c-0.357-0.714-0.536-1.429-0.536-2.501V89.281c0-0.893,0.179-1.786,0.536-2.68 c0.356-0.714,0.893-1.25,1.786-1.608c0.536-0.178,1.607-0.357,2.858-0.714c1.25-0.179,2.322-0.357,3.216-0.357h0.535v-4.287h-22.33 v0.536c0,0.357-0.179,1.25-0.715,3.216c-0.357,1.607-0.894,3.215-1.429,4.645l-15.542,40.016L979.33,79.992l-0.178-0.357h-23.046 v4.287h0.536c1.25,0,2.68,0.357,3.93,0.715c1.251,0.357,2.502,0.893,3.395,1.786c0.715,0.715,1.43,1.608,1.787,2.858 s0.714,2.68,0.714,4.645v33.585c0,4.108-0.179,7.146-0.536,8.932c-0.356,1.607-1.071,2.858-1.965,3.752 c-0.715,0.715-1.965,1.072-3.394,1.429c-1.43,0.357-2.858,0.536-4.288,0.715h-0.357v4.288h27.333v-4.288h-0.536 c-0.357,0-1.429-0.179-4.108-0.894c-1.966-0.535-3.395-1.072-3.931-1.786c-0.893-0.715-1.607-2.144-1.965-3.931 c-0.536-1.965-0.715-4.822-0.715-8.574v-38.23l21.08,56.452h3.037l22.152-55.559v46.805c0,1.071-0.179,1.966-0.536,2.68 c-0.357,0.715-1.072,1.251-1.965,1.786c-0.536,0.357-1.608,0.536-3.216,0.715s-3.037,0.357-3.93,0.357h-0.536v4.287h29.833v-4.287 L1037.211,141.981z" /> <path d="M64.133,103.572L64.133,103.572c-1.786-1.965-3.93-3.572-6.252-5.001s-4.823-2.68-7.503-3.751 c-2.858-1.25-5.717-2.501-8.754-3.573c-3.037-1.072-6.074-2.323-9.111-3.93c-3.394-1.608-6.074-3.752-7.86-6.253 c-1.786-2.501-2.68-5.716-2.68-9.468c0-3.573,1.429-6.789,4.109-9.29c2.68-2.501,6.074-3.751,10.004-3.751 c3.751,0,6.967,0.714,9.468,2.144c2.501,1.429,4.824,3.394,6.61,5.895c1.787,2.501,3.395,5.359,4.466,8.575 c1.25,3.215,2.144,6.431,3.216,10.004l0.178,0.357h6.074l-0.536-31.62h-5.895l-2.501,4.288c-2.68-1.608-5.538-3.037-8.754-4.288 c-3.394-1.25-7.146-1.965-11.433-1.965c-3.751,0-7.324,0.715-10.719,1.965c-3.394,1.25-6.431,3.037-8.932,5.359 c-2.68,2.322-4.824,5.002-6.252,8.039c-1.429,3.037-2.144,6.431-2.144,10.004c0,6.074,1.429,11.255,4.288,15.006 s6.967,6.967,12.148,9.289c2.68,1.251,5.716,2.502,9.29,3.752c3.573,1.25,6.789,2.501,9.646,3.752 c3.93,1.607,6.967,3.93,8.933,6.967c1.965,3.037,3.037,6.432,3.037,10.004c0,2.501-0.357,4.645-0.893,6.432 c-0.714,1.786-1.608,3.395-2.858,4.823s-3.037,2.501-5.181,3.216s-4.645,1.071-7.503,1.071c-3.93,0-7.325-0.714-10.183-2.144 c-2.858-1.43-5.538-3.395-7.682-5.896c-2.322-2.679-4.287-5.538-5.538-8.575c-1.608-3.215-2.858-6.788-3.931-10.539l-0.178-0.357 H6.252l0.894,32.334h5.895l2.68-4.466c2.858,1.786,6.252,3.216,10.183,4.466c4.109,1.251,8.218,1.965,12.327,1.965 c8.932,0,16.435-2.68,22.509-8.039c6.074-5.358,9.111-12.146,9.111-20.365c0-3.395-0.536-6.431-1.429-9.11 S66.099,105.717,64.133,103.572z" /> <path d="M81.462,96.784h4.288l0.179-0.357c0.357-1.072,0.714-2.323,1.429-3.93c0.714-1.608,1.607-3.037,2.501-4.466 c0.893-1.429,1.965-2.68,3.037-3.751c1.072-1.072,1.965-1.608,3.037-1.787c1.25-0.179,2.68-0.179,4.109-0.357 c1.429,0,2.68,0,3.751,0h2.323v54.308c0,1.25-0.179,2.145-0.715,2.858c-0.357,0.715-1.072,1.251-2.144,1.608 c-0.715,0.357-1.965,0.535-3.752,0.714c-1.786,0.179-3.215,0.357-4.108,0.357H94.86v4.288h33.049v-4.288h-0.536 c-0.893,0-2.322-0.179-4.109-0.536c-1.786-0.357-3.037-0.715-3.573-0.893c-1.072-0.357-1.787-1.072-2.144-1.787 c-0.357-0.715-0.536-1.786-0.536-2.68v-53.95h2.322c1.25,0,2.68,0,4.109,0.178c1.429,0,2.68,0.179,3.752,0.357 c0.893,0.179,1.965,0.715,3.037,1.787s2.144,2.322,3.037,3.751s1.787,2.858,2.501,4.466c0.714,1.607,1.25,2.858,1.608,3.93 l0.179,0.357h4.108V77.312H81.462V96.784z" /> <path d="M200.439,125.725c-0.357,1.43-1.429,3.752-3.037,6.789s-3.037,5.359-4.466,6.788 c-0.536,0.536-1.25,0.894-2.501,1.251c-1.251,0.357-2.501,0.535-3.752,0.715c-1.072,0.178-2.68,0.178-4.287,0.178h-4.109 c-2.68,0-4.645,0-6.074-0.178c-1.429-0.18-2.322-0.537-3.215-1.072c-0.715-0.536-1.25-1.251-1.429-2.322 c-0.357-1.072-0.357-2.68-0.357-4.645v-20.188h7.146c1.965,0,3.573,0.179,4.823,0.536c1.072,0.356,2.144,1.071,3.216,2.322 c0.536,0.714,1.072,1.965,1.607,3.573c0.536,1.607,0.894,3.215,1.072,4.823v0.536h4.466V96.963h-4.466v0.357 c-0.179,1.25-0.536,2.858-0.894,4.287c-0.536,1.43-1.072,2.68-1.786,3.573c-0.715,1.071-1.787,1.786-2.858,2.144 s-2.858,0.715-5.181,0.715h-7.146V82.136h10.183c1.787,0,3.216,0,4.645,0.178c1.429,0,2.501,0.179,3.573,0.357 c1.787,0.179,3.751,1.608,5.717,4.288c2.144,2.68,3.394,5.181,4.109,7.503l0.179,0.357h4.466V77.491H146.31v4.288h0.536 c0.893,0,1.965,0.179,3.394,0.536c1.429,0.357,2.501,0.715,3.395,1.072c1.072,0.536,1.607,1.072,1.965,1.786 c0.357,0.715,0.536,1.608,0.536,2.68v48.949c0,1.072-0.179,1.965-0.536,2.68s-1.072,1.25-1.965,1.607 c-0.357,0.18-1.072,0.357-3.037,0.536c-1.608,0.179-2.858,0.357-3.751,0.357h-0.536v4.288h57.167l1.429-21.08h-4.288 L200.439,125.725z" /> <path d="M258.499,81.957c-3.93-3.037-9.29-4.645-15.721-4.645h-31.441V81.6h0.536c0.894,0,1.787,0.179,3.037,0.357 c1.072,0.179,2.322,0.536,3.573,0.893c1.072,0.357,1.608,0.893,1.965,1.787c0.357,0.893,0.536,1.786,0.536,2.858v49.127 c0,1.071-0.179,2.144-0.536,2.858c-0.357,0.715-0.894,1.25-1.787,1.607c-0.536,0.18-1.429,0.357-2.858,0.536 s-2.501,0.357-3.394,0.357h-0.536v4.288h30.012v-4.288h-0.536c-1.25,0-2.501-0.179-3.93-0.357s-2.322-0.356-2.858-0.536 c-1.072-0.357-1.608-0.893-1.965-1.607c-0.357-0.715-0.536-1.787-0.536-2.68v-20.365h7.146c3.216,0,6.432-0.357,9.29-1.251 c2.858-0.894,5.717-2.144,8.218-3.93s4.466-4.108,5.896-6.968c1.429-2.857,2.144-6.074,2.144-9.646 C264.573,89.46,262.608,85.172,258.499,81.957z M251.353,101.25c-0.357,1.608-1.072,3.037-2.144,4.646l0,0 c-1.072,1.429-2.68,2.858-4.645,3.751c-2.144,1.072-4.823,1.608-8.217,1.608h-4.466V82.314h6.252c2.68,0,4.824,0.357,6.61,1.25 c1.787,0.715,3.216,1.965,4.288,3.395s1.787,2.858,2.144,4.823c0.357,1.787,0.715,3.751,0.715,5.359 C251.71,98.213,251.532,99.821,251.353,101.25z" /> <path d="M314.415,81.778h0.536c0.893,0,1.965,0.179,3.037,0.536c1.25,0.357,2.144,0.715,3.037,1.072 c0.894,0.357,1.608,1.072,1.965,1.786c0.357,0.715,0.536,1.608,0.536,2.501v20.187H292.62V87.316c0-1.072,0.179-1.965,0.536-2.68 c0.357-0.715,0.893-1.25,1.965-1.608c0.536-0.179,1.608-0.536,2.858-0.715c1.25-0.178,2.322-0.357,3.216-0.357h0.536v-4.288 h-29.119v4.288h0.536c0.893,0,1.965,0.179,3.037,0.536c1.251,0.357,2.144,0.715,3.037,1.072c0.894,0.357,1.608,1.072,1.965,1.787 c0.357,0.715,0.536,1.608,0.536,2.501v49.127c0,1.071-0.179,2.144-0.536,2.858c-0.357,0.715-1.072,1.25-1.965,1.607 c-0.357,0.179-1.072,0.357-2.858,0.536c-1.429,0.179-2.501,0.179-3.394,0.357h-0.536v4.288h29.119v-4.288h-0.536 c-0.715,0-1.787-0.179-3.216-0.536c-1.25-0.357-2.322-0.535-2.68-0.893c-1.072-0.537-1.608-1.072-1.965-1.787 c-0.357-0.715-0.536-1.607-0.536-2.68V113.22h30.906v23.76c0,1.071-0.179,2.144-0.536,2.858s-1.072,1.25-1.965,1.607 c-0.357,0.179-1.072,0.357-2.858,0.536c-1.429,0.179-2.501,0.179-3.395,0.357h-0.536v4.288h29.119v-4.288h-0.536 c-0.715,0-1.787-0.179-3.216-0.536c-1.25-0.357-2.322-0.535-2.68-0.893c-1.072-0.537-1.607-1.072-1.965-1.787 s-0.536-1.607-0.536-2.68V87.316c0-1.072,0.179-1.965,0.536-2.68c0.357-0.715,0.893-1.25,1.965-1.608 c0.536-0.179,1.608-0.536,2.858-0.715c1.25-0.178,2.322-0.357,3.216-0.357h0.536v-4.288h-29.119V81.778z" /> <path d="M406.596,125.725c-0.357,1.43-1.43,3.752-3.037,6.789s-3.037,5.359-4.466,6.788 c-0.536,0.536-1.251,0.894-2.501,1.251c-1.251,0.357-2.501,0.535-3.752,0.715c-1.072,0.178-2.68,0.178-4.288,0.178h-4.109 c-2.68,0-4.645,0-6.074-0.178c-1.429-0.18-2.322-0.537-3.216-1.072c-0.714-0.536-1.25-1.251-1.429-2.322 c-0.357-1.072-0.357-2.68-0.357-4.645v-20.188h7.146c1.965,0,3.573,0.179,4.824,0.536c1.072,0.356,2.144,1.071,3.037,2.322 c0.536,0.714,1.072,1.965,1.608,3.573c0.536,1.607,0.894,3.215,1.072,4.823v0.536h4.466V96.963h-4.288v0.357 c-0.179,1.25-0.536,2.858-0.893,4.287c-0.536,1.43-1.072,2.68-1.787,3.573c-0.714,1.071-1.787,1.786-2.858,2.144 s-2.858,0.715-5.181,0.715h-7.146V82.136h10.183c1.787,0,3.215,0,4.645,0.178c1.429,0,2.501,0.179,3.573,0.357 c1.786,0.179,3.751,1.608,5.716,4.288c2.144,2.68,3.395,5.181,4.109,7.503l0.179,0.357h4.466V77.491h-53.415v4.288h0.536 c0.893,0,1.965,0.179,3.394,0.536c1.429,0.357,2.501,0.715,3.395,1.072c1.072,0.536,1.608,1.072,1.965,1.786 c0.357,0.715,0.536,1.608,0.536,2.68v48.949c0,1.072-0.179,1.965-0.536,2.68c-0.357,0.715-1.072,1.25-1.965,1.607 c-0.357,0.18-1.072,0.357-3.037,0.536c-1.608,0.179-2.858,0.357-3.751,0.357h-0.536v4.288h57.167l1.429-21.08h-4.287 L406.596,125.725z" /> <path d="M460.01,81.778h0.536c1.072,0,2.501,0.357,4.467,0.893c1.965,0.536,3.394,1.072,4.287,1.608 c0.894,0.714,1.607,1.965,1.965,3.93c0.536,2.144,0.715,5.181,0.715,8.932v30.905l-37.337-50.735h-20.187V81.6h0.536 c1.071,0,2.68,0.536,4.645,1.25s3.395,1.608,4.466,2.68c0.715,0.714,1.43,1.787,1.965,3.216c0.536,1.429,0.715,2.858,0.715,4.287 v33.407c0,4.467-0.179,7.503-0.536,9.289c-0.357,1.787-1.071,3.037-2.144,3.752c-0.357,0.357-1.25,0.715-3.573,1.43 c-1.965,0.535-3.394,0.893-4.287,0.893h-0.536v4.287h28.762v-4.287h-0.535c-0.715,0-2.145-0.357-4.467-0.893 c-2.144-0.537-3.572-1.251-4.287-1.787c-0.894-0.893-1.607-2.322-2.144-4.287c-0.536-2.145-0.715-5.002-0.715-8.933V92.318 l40.374,54.665h4.823V96.784c0-3.394,0.179-6.252,0.536-8.575c0.357-2.144,1.071-3.573,2.144-4.288 c0.715-0.536,1.965-0.893,3.752-1.429c1.786-0.536,3.215-0.714,3.93-0.714h0.536v-4.288h-28.583v4.288H460.01z" /> </g> </svg> </a> </h1> <span class="pipe"></span><a href="https://writings.stephenwolfram.com" class="writings">Writings <svg viewBox="312.131 0 419.71 200"> <g id="writingsSVG"> <path d="M420.941,131.488L420.941,131.488c-2.154-0.07-4.128-1.223-5.248-3.064c-1.103-1.731-2.139-3.562-3.054-5.183 c-6.891-12.237-15.998-23.771-29.493-37.375c-4.692-4.847-10.108-8.938-16.053-12.128l-0.562-0.331 c-0.253-0.143-0.518-0.287-0.793-0.419c-1.489-0.672-1.886-0.551-1.93-0.54c-0.044,0.011-0.32,0.143-0.794,1.279 c-1.599,3.751-2.9,7.622-3.892,11.577c-0.97,3.969-1.797,8.06-2.591,12.029c-0.496,2.502-0.992,5.006-1.543,7.497l-0.066,0.353 c-0.452,2.105-1.202,5.635-5.447,5.998s-5.777-3.054-6.681-5.104c-0.612-1.382-1.128-2.804-1.543-4.256l-12.734-44.102 l-9.515-32.822c-0.188-0.662-0.419-1.312-0.662-2.007c-1.612,0.425-3.331,0.079-4.652-0.937c-1.169-1.037-1.676-2.569-1.533-4.774 c0.099-1.72,0.265-3.451,0.43-5.116c0.077-0.915,0.165-1.841,0.243-2.756c0.077-0.916,0.154-1.775,0.154-2.58 c0-1.577,0-5.767,4.575-6.538c4.829-0.816,6.362,2.205,7.167,4.961c2.602,8.923,5.175,17.85,7.718,26.781 c2.94,10.327,5.902,20.658,8.887,30.992l7.21,25.126c0-0.187,0.077-0.386,0.121-0.573c0.287-1.213,0.551-2.425,0.827-3.638 c0.893-3.947,1.819-8.038,2.855-12.04c0.585-1.913,1.412-3.743,2.458-5.447c2.205-3.958,4.686-5.16,9.118-4.41 c2.019,0.292,3.979,0.898,5.81,1.797c7.361,3.686,14.045,8.592,19.769,14.509c6.957,7.365,13.099,14.146,18.743,20.739 c2.205,2.602,4.267,5.424,6.219,8.147c0.353,0.508,0.717,1.004,1.103,1.512c-0.254-3.782-0.496-7.564-0.75-11.346 c-0.397-5.961-0.786-11.922-1.169-17.883l-0.221-3.374c-0.297-4.311-0.595-8.82-0.694-13.23c-0.209-9.173-1.742-18.401-3.22-27.332 l-0.396-2.403c-0.441-2.668-1.103-5.38-1.72-8.004c-0.475-1.985-0.971-4.035-1.378-6.086c-0.855-4.224-0.504-8.603,1.014-12.635 c0.419-1.103,1.521-4.102,4.686-4.102h0.133c2.315,0.066,3.858,1.566,4.575,4.41c0.188,0.717,0.375,1.444,0.552,2.205 c0.752,2.622,1.323,5.293,1.709,7.994l0.661,5.314c1.301,10.408,2.646,21.18,3.518,31.831c1.014,12.381,1.764,24.983,2.48,37.167 c0.279,4.483,0.551,8.975,0.815,13.473c0.375,5.942,0.75,12.261,0.948,18.512c0.09,1.93-0.381,3.845-1.355,5.513 C424.734,130.367,422.921,131.432,420.941,131.488z" /> <path d="M560.82,121.918c-3.308,0-4.686-2.635-5.248-3.704c-3.562-6.747-7.111-14.102-9.03-22.249l-0.396-1.665 c-0.771-3.241-1.576-6.615-2.117-9.923c0.013-1.077-0.841-1.965-1.918-1.996H542c-2.724-0.529-5.513-1.103-8.302-1.51 c-3.849-0.596-8.313-1.279-12.757-1.808c-1.102-0.077-2.206-0.077-3.308,0c0.177,1.323,0.342,2.547,0.519,3.782 c0.777,6.479,2.329,12.842,4.619,18.952c1.5,3.826,3.308,5.977,6.229,7.178s5.513,2.437,7.597,3.406 c0.761,0.359,1.498,0.768,2.205,1.225l1.025,0.617l1.995,1.169l-1.488,1.786c-1.442,1.78-3.745,2.627-5.998,2.205 c-3.095-0.257-6.168-0.736-9.194-1.434c-2.815-0.649-5.268-2.369-6.836-4.796c-0.562-0.86-1.169-1.698-1.819-2.569 c-0.97-1.266-1.864-2.587-2.679-3.957c-2.28-4.252-3.774-8.879-4.41-13.661c-0.552-3.473-1.103-6.946-1.731-10.496l-0.54-3.197 c-4.367-0.299-8.754-0.181-13.099,0.353l0.529,2.867c0.673,3.627,1.312,7.056,2.205,10.441c0.894,3.385,1.886,6.615,2.889,9.923 c0.849,2.768,1.731,5.635,2.514,8.49c0.348,1.506,0.507,3.051,0.475,4.598c0,0.572,0,1.102,0.065,1.676l0.1,1.367l-1.257,0.562 c-2.58,1.169-4.829,0.64-6.317-1.499l-0.529-0.75c-0.899-1.121-1.642-2.36-2.205-3.683l-0.231-0.64 c-1.687-4.531-3.429-9.229-4.752-13.991c-1.103-3.903-1.963-7.895-2.812-11.764c-0.396-1.83-0.805-3.668-1.224-5.513 c-0.133-0.551-0.287-1.103-0.463-1.687c-0.773,0.015-1.542-0.109-2.271-0.364c-1.563-0.438-2.897-1.46-3.727-2.855 c-0.364-0.772-1.301-3.473,2.304-5.722l0.1-0.066c0.385-0.28,0.824-0.475,1.29-0.573c0.849-0.143,0.959-0.166,0.706-1.852 c-0.298-1.734,0.214-3.509,1.389-4.818c1.165-1.224,2.827-1.845,4.51-1.687c3.1,0.222,5.565,2.688,5.788,5.788 c0.012,0.17,0.033,0.34,0.066,0.507c0.146,0.207,0.312,0.399,0.496,0.573c3.638,0,7.343-0.066,10.937-0.166h1.103l-0.231-2.37 c-0.253-2.79-0.529-5.678-0.849-8.49c-1.235-10.768-2.492-21.536-3.771-32.304l-0.65-5.513c-0.316-2.69-0.644-5.38-0.981-8.071 l-0.529-4.333c-0.463-3.892,1.389-6.615,4.851-7.111c1.54-0.276,3.123,0.126,4.345,1.103c1.509,1.381,2.349,3.346,2.304,5.392 c0,1.18,0,2.359,0,3.506c0,1.621,0,3.143,0.133,4.653c0.419,4.608,0.926,9.283,1.411,13.815c0.242,2.282,0.496,4.575,0.728,6.869 c0.254,2.458,0.496,4.928,0.75,7.387c0.33,3.396,0.672,6.802,1.036,10.198c0.408,3.859,0.849,7.718,1.279,11.533l0.396,3.506 l27.045,3.793c0.122-0.32,0.254-0.629,0.375-0.948c1.103-2.624,3.308-3.848,5.513-3.032c1.719,0.695,3.066,2.079,3.716,3.815 c0.425,1.399,0.695,2.841,0.805,4.3c0.066,0.606,0.133,1.213,0.231,1.808c1.673,11.613,4.4,23.049,8.148,34.168 c0.198,0.562,0.451,1.102,0.716,1.72c0.265,0.617,0.662,1.499,0.938,2.326c0.211,0.739,0.318,1.503,0.319,2.271 c0,0.286,0,0.573,0.056,0.87l0.177,1.765l-1.742,0.353C561.76,121.861,561.291,121.912,560.82,121.918z" /> <path d="M713.775,141.665h-0.783c-4.397-0.225-8.778-0.703-13.12-1.434l-1.676-0.243c-1.169-0.164-4.719-0.672-4.41-4.498 c0.045-1.053,0.538-2.036,1.356-2.701c1.103-0.882,2.745-1.102,4.994-0.771c1.314,0.244,2.645,0.391,3.98,0.441 c3.958,0,8.181,0,12.426-0.133c1.009-0.105,1.985-0.422,2.866-0.926c1.323-0.684,2.139-1.5,2.304-2.293 c0.023-1.015-0.376-1.993-1.102-2.701c-2.385-2.823-4.964-5.476-7.719-7.939c-4.686-4.266-8.621-7.64-12.392-10.617 c-9.328-7.364-16.538-14.575-21.875-22.05c-6.482-8.986-4.498-17.222,4.719-24.509c7.718-6.119,16.473-7.607,28.666-4.686 c2.836,0.819,5.523,2.084,7.961,3.749c1.499,0.737,2.562,2.139,2.866,3.782c0.231,1.995-1.103,3.594-2.139,4.619 c-1.506,1.441-3.162,2.716-4.939,3.804c-1.394,0.779-3.111,0.685-4.41-0.243c-0.896-1.023-1.271-2.402-1.015-3.738 c0.054-0.484,0.161-0.961,0.32-1.422c-0.759-0.597-1.703-0.909-2.669-0.882c-0.874-0.022-1.744-0.122-2.602-0.298l-0.794-0.132 c-5.887-0.94-11.882,0.845-16.295,4.852c-1.657,1.266-2.753,3.13-3.055,5.193c-0.005,2.044,0.827,4,2.305,5.413 c6.737,7.715,14.114,14.848,22.051,21.323c4.663,3.704,9.019,7.872,13.23,11.919c1.422,1.355,2.845,2.723,4.289,4.079 c1.154,1.159,2.128,2.486,2.888,3.937c2.01,3.247,2.394,7.245,1.037,10.815c-1.52,3.435-4.545,5.971-8.192,6.868 C719.905,141.135,716.852,141.613,713.775,141.665z" /> <path d="M449.178,120.717h-0.54c-2.794-0.27-5.002-2.486-5.26-5.281c-0.396-2.459-0.782-4.906-1.103-7.365 c-0.871-5.578-1.764-11.367-2.866-16.979c-0.882-4.476-2.205-8.997-3.451-13.374c-0.298-1.103-0.606-2.084-0.904-3.131 c-0.272-0.779-0.643-1.52-1.103-2.205c-0.242-0.43-0.484-0.871-0.705-1.301c-1.643-3.308-0.904-6.527,1.83-8.125 c1.455-0.852,3.194-1.075,4.818-0.618c1.691,0.449,3.133,1.557,4.002,3.076c0.425,0.733,0.74,1.524,0.938,2.348 c0.97,4.179,1.94,8.357,2.921,12.624c0.364-2.205,0.761-4.41,1.246-6.692c0.802-3.429,1.985-6.757,3.528-9.923 c3.528-7.442,11.963-11.235,21.488-9.658c0.86,0.137,1.691,0.416,2.459,0.827c2.078,1.004,3.285,3.222,2.999,5.513 c-0.408,3.109-3.374,3.572-4.631,3.76c-0.782,0.118-1.577,0.118-2.359,0c-0.254,0-0.519-0.066-0.783-0.077 c-6.615-0.375-8.82,1.94-10.573,6.361c-3.01,7.497-4.035,15.149-5.05,24.377c-0.342,3.175-0.375,6.482-0.407,9.691 c0,1.93,0,3.914-0.133,5.888c-0.088,1.962-0.38,3.909-0.871,5.81C454.156,118.88,451.844,120.756,449.178,120.717z" /> <path d="M546.135,59.25c-0.18,0.011-0.36,0.011-0.541,0c-1.195-0.199-2.178-1.051-2.547-2.205 c-1.289-4.091-2.514-8.093-3.506-12.128c-0.684-2.823,1.103-5.513,4.212-6.406c2.506-0.891,5.259,0.417,6.152,2.921 c0.49,1.245,0.888,2.523,1.19,3.826c0.133,0.507,0.265,1.025,0.408,1.532l0.54,1.896l-1.015,0.287c0,0.221-0.055,0.452-0.077,0.673 c-0.198,1.665-0.396,3.385-0.661,5.083c-0.184,1.078-0.618,2.097-1.268,2.977C548.365,58.657,547.29,59.231,546.135,59.25z" /> <path d="M482.981,53.561l-1.709-1.103c-4.697-2.844-5.612-7.155-6.108-10.959c-0.375-2.933,1.688-5.436,4.918-5.954 c3.23-0.519,5.512,1.025,6.174,3.859c0.904,4.013,0.177,8.048-2.205,12.348L482.981,53.561z" /> <path d="M677.094,55.876c-0.234-2.991-1.067-5.903-2.447-8.567c-1.051-2.274-3.35-3.711-5.854-3.66 c-4.201,0.022-7.277,0.97-9.714,2.988c-6.683,5.544-11.577,12.939-14.068,21.257c-3.003,9.579-4.396,19.59-4.123,29.625v1.488 c0.079,1.039,0.079,2.082,0,3.12c-0.664,0.172-1.338,0.304-2.018,0.397c-0.761,0.132-1.676,0.286-2.778,0.507 c-7.332,1.488-13.804,0.187-19.317-3.87c-5.034-3.883-9.357-8.609-12.777-13.969c-1.104-1.665-2.205-3.308-3.309-4.972 c-2.381-3.672-4.84-7.464-7.562-11.025c-2.459-3.22-5.546-5.017-8.678-5.017c-2.23,0.031-4.364,0.915-5.965,2.47 c-0.705-1.478-1.443-2.966-2.281-4.41c-1.057-1.778-2.251-3.47-3.572-5.061c-1.531-1.875-4.287-2.165-6.175-0.651 c-1.95,1.261-2.644,3.786-1.609,5.866c0.156,0.351,0.345,0.687,0.562,1.003c0.083,0.115,0.157,0.236,0.22,0.364 c0.606,1.478,1.257,2.944,1.919,4.41c1.519,3.218,2.822,6.533,3.903,9.923c3.045,10.105,4.471,20.628,4.223,31.18 c0.006,2.899,0.347,5.789,1.014,8.61c0.257,1.77,1.383,3.293,2.999,4.058c1.786,0.659,3.784,0.373,5.314-0.761 c2.012-1.247,3.07-3.586,2.679-5.92l-0.595-5.679c-0.529-5.304-1.136-10.783-1.632-16.163l-0.056-0.65 c-0.496-5.259-0.948-10.221,0.231-15.127c0.091-0.323,0.221-0.634,0.387-0.926c1.428,1.102,2.626,2.473,3.527,4.036 c4.058,7.012,9.129,15.148,16.075,22.348c7.276,7.553,16.703,10.86,27.993,9.835l7.409-0.673c0,0.1,0,0.21,0,0.309 c0.231,1.456,0.452,2.823,0.629,4.19c0.221,1.741,0.407,3.483,0.595,5.226c0.375,3.43,0.75,6.979,1.4,10.452 c1.136,6.13,2.371,12.337,3.562,18.335c1.521,7.476,3.054,15.215,4.41,22.834c0.698,4.063,0.831,8.204,0.396,12.305 c-0.118,1.707-1.104,3.235-2.612,4.046c-1.84,0.905-4.008,0.839-5.789-0.177c-1.195-0.703-2.506-1.191-3.869-1.444 c-1.101-0.138-2.206,0.21-3.029,0.952c-1.564,1.41-1.689,3.822-0.278,5.388c2.844,3.539,6.218,5.325,10.055,5.325 c0.231,0,0.452,0,0.661-0.021c2.165-0.037,4.312-0.409,6.362-1.104c3.429-1.312,7.497-3.451,8.5-8.512 c0.565-2.493,0.763-5.057,0.585-7.607c-0.529-5.469-1.225-11.874-2.404-18.423c-1.18-6.55-2.458-13.175-3.682-19.593 c-1.511-7.717-3.043-15.699-4.41-23.561l-0.122-0.694c-0.672-3.749-1.334-7.618-0.672-11.29l1.422-0.85 c1.715-0.924,3.322-2.033,4.796-3.307c3.513-3.107,6.731-6.533,9.614-10.232c1.267-1.897,2.209-3.991,2.79-6.196 c0.297-0.893,0.562-1.731,0.882-2.547C674.238,77.376,677.832,67.145,677.094,55.876z M665.771,69.735l-1.411,3.914 c-1.532,4.245-3.109,8.644-4.752,12.922c-1.693,4.485-4.831,8.278-8.92,10.783c-0.011-0.118-0.011-0.235,0-0.353 c0.232-11.874,1.896-21.125,5.271-29.107c2.58-6.031,6.186-10.287,11.025-12.977c0.471,0.565,0.693,1.297,0.617,2.028 C667.788,61.286,667.168,65.623,665.771,69.735z" /> </g> </svg> </a> <nav id="nav"> <ul> <li> <ul class="links"> <li class="about"><a href="//www.stephenwolfram.com/about/">ABOUT</a></li> <li class="blog"><a href="//writings.stephenwolfram.com">WRITINGS</a></li> <li class="publications"><a href="//www.stephenwolfram.com/publications/">PUBLICATIONS</a></li> <li class="media"><a href="//www.stephenwolfram.com/media/">MEDIA</a></li> <li class="scrapbook"><a href="//www.stephenwolfram.com/scrapbook/">SCRAPBOOK</a></li> <li class="contact"><a href="//www.stephenwolfram.com/contact/">CONTACT</a></li> </ul> </li> <li> <ul class="social"> <li><a class="twitter" href="//x.com/stephen_wolfram" class="big-social-icon twitter" title="X" target="_blank"></a></li> <li><a class="facebook" href="//www.facebook.com/Stephen-Wolfram-188916357807416/" class="big-social-icon facebook" title="Facebook" target="_blank"></a></li> <li><a class="linkedin" href="//www.linkedin.com/in/stephenwolfram" class="big-social-icon linkedin" title="LinkedIn" target="_blank"></a></li> <li><a class="soundcloud" href="https://soundcloud.com/stephenwolfram/" class="big-social-icon soundcloud" title="SoundCloud" target="_blank"></a></li> <li><a class="twitch" href="https://www.twitch.tv/stephen_wolfram" class="big-social-icon twitch" title="Twitch" target="_blank"></a></li> </ul> </li> </ul> </nav> </div> <div class="stripe"></div> </header> <script> $('.hamburger').click(function(e){ e.stopPropagation(); $('.links').toggleClass('show'); $('#header > .inner').toggleClass('open'); if($('.overlay').length < 1 && !$('.links').hasClass('hide')) { $('#header').append('<div class="overlay">'); } else { $('.overlay').remove(); } }); $('body').click(function(){ $('.links').removeClass('show'); $('.overlay').remove(); $('#header > .inner').removeClass('open'); }); </script> <div class="writings-sidebar-additions"> <div class="inner"> <div class="sidebar-additions"> <div class="recent-categories"><a href="https://writings.stephenwolfram.com">Recent</a> | <div class="categories-list-wrapper"> <button class="categories">Categories</button> <div class="categories-list-menu hide"> <ul class="categories-list"> <li><a href="/category/artificial-intelligence">Artificial Intelligence</a></li><li><a href="/category/big-picture">Big Picture</a></li><li><a href="/category/companies-and-business">Companies & Business</a></li><li><a href="/category/computational-science">Computational Science</a></li><li><a href="/category/computational-thinking">Computational Thinking</a></li><li><a href="/category/data-science">Data Science</a></li><li><a href="/category/education">Education</a></li><li><a href="/category/future-perspectives">Future Perspectives</a></li><li><a href="/category/historical-perspectives">Historical Perspectives</a></li><li><a href="/category/language-and-communication">Language & Communication</a></li><li><a href="/category/life-and-times">Life & Times</a></li><li><a href="/category/life-science">Life Science</a></li><li><a href="/category/mathematica">Mathematica</a></li><li><a href="/category/mathematics">Mathematics</a></li><li><a href="/category/new-kind-of-science">New Kind of Science</a></li><li><a href="/category/new-technology">New Technology</a></li><li><a href="/category/personal-analytics">Personal Analytics</a></li><li><a href="/category/philosophy">Philosophy</a></li><li><a href="/category/physics">Physics</a></li><li><a href="/category/ruliology">Ruliology</a></li><li><a href="/category/software-design">Software Design</a></li><li><a href="/category/wolfram-alpha">Wolfram|Alpha</a></li><li><a href="/category/wolfram-language">Wolfram Language</a></li><li><a href="/category/other">Other</a></li> </ul> </div> </div> </div> <span class="pipe">|</span> <form class="search-link" method="get" action="https://writings.stephenwolfram.com/"> <svg version="1.0" class="search-button" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 18.2 18.5" enable-background="new 0 0 18.2 18.5" xml:space="preserve"> <g> <path class="circle" fill="#c42c1f" d="M7.7,14.2H7.6c-3.6,0-6.5-2.9-6.5-6.4V7.7c0-3.5,2.9-6.4,6.5-6.4h0.1 c3.6,0,6.5,2.9,6.5,6.4v0.1C14.2,11.3,11.3,14.2,7.7,14.2z M7.6,2.5c-2.9,0-5.2,2.3-5.2,5.1v0.1c0,2.8,2.3,5.1,5.2,5.1h0.1 c2.9,0,5.2-2.3,5.2-5.1V7.7C12.9,4.8,10.6,2.5,7.6,2.5L7.6,2.5z" /> <g> <path class="handle" fill="#c42c1f" d="M16.8,15.4l-4.4-4.4l-1.5,1.6l4.4,4.5c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3 C17.2,16.5,17.2,15.8,16.8,15.4z" /> </g> </g> </svg> <input class="search-field hide" type="text" value="" name="s" placeholder="Search Writings" /> <span class="close hide">×</span> </form> </div> </div> </div> <div class="inner"> <div id="content"><script type="text/javascript"> $(document).ready(function() { $("#join-small").addClass('join-small-js'); $("#exit-button").addClass('exit-button-js'); $("#respond").addClass('respond-js'); }); </script> <article id="postid-20755" > <div id="toc-bar-wrap"> <div id="toc-bar"> <div id="toc-bar-inner"> <span class="toc-button">Contents</span> <div class="toc-menu hide"> <ul class="table-of-contents"> <li class="toplink"><a href="#top">Top</a></li> <li><a href='#what-the-wolfram-language-makes-possible'>What the Wolfram Language Makes Possible</a></li> <li><a href='#low-cost-high-payoff'>Low Cost, High Payoff</a></li> <li><a href='#contributing-to-the-repository'>Contributing to the Repository</a></li> <li><a href='#what-should-be-in-the-respository'>What Should Be in the Repository</a></li> <li><a href='#the-ecosystem-of-the-repository'>The Ecosystem of the Repository</a></li> <li><a href='#how-it-works'>How It Works</a></li> <li><a href='#some-subtleties'>Some Subtleties</a></li> <li><a href='#what-happens-when-the-repository-gets-big'>What Happens When the Repository Gets Big?</a></li> </ul> </div> <span class="toc-title">The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language</span> </div> </div> </div> <h1 class="blog-post-title">The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language</h1> <time class="date" datetime="2019-06-11">June 11, 2019</time> <div class="post_content" > <h2 id="what-the-wolfram-language-makes-possible">What the Wolfram Language Makes Possible</h2> <p class='Text'>We’re on an exciting path these days with the <a href='http://www.wolfram.com/language/'>Wolfram Language</a>. Just three weeks ago we launched the <a href='https://writings.stephenwolfram.com/2019/05/launching-today-free-wolfram-engine-for-developers/'>Free Wolfram Engine for Developers</a> to help people integrate the Wolfram Language into large-scale software projects. Now, today, we’re launching the <a href='https://resources.wolframcloud.com/FunctionRepository/'>Wolfram Function Repository</a> to provide an organized platform for functions that are built to extend the Wolfram Language—and we’re opening up the Function Repository for anyone to contribute.</p> <p class='Text'>The Wolfram Function Repository is something that’s made possible by the unique nature of the Wolfram Language as not just a programming language, but <a href='https://writings.stephenwolfram.com/2019/05/what-weve-built-is-a-computational-language-and-thats-very-important/'>a full-scale computational language</a>. In a traditional programming language, adding significant new functionality typically involves building whole libraries, which may or may not work together. But in the Wolfram Language, there’s <a href='https://reference.wolfram.com/language/'>so much already built into the language</a> that it’s possible to add significant functionality just by introducing individual new functions—which can immediately integrate into the coherent design of the whole language.</p> <p class='Text'>To get it started, we’ve already got <a href='https://resources.wolframcloud.com/FunctionRepository/all'>532 functions</a> in the Wolfram Function Repository, in 26 categories:</p> <p><a href='https://resources.wolframcloud.com/FunctionRepository'><img src="https://content.wolfram.com/sites/43/2019/06/function-repository.png" alt="The Wolfram Function Repository" title="The Wolfram Function Repository" width="550" height="589" class="aligncenter size-full wp-image-20772" srcset="https://content.wolfram.com/sites/43/2019/06/function-repository.png 620w, https://content.wolfram.com/sites/43/2019/06/function-repository-280x300.png 280w" sizes="(max-width: 550px) 100vw, 550px" /></a><br /> <span id="more-20755"></span></p> <p class='Text'> Just like the <a href='https://reference.wolfram.com/language/'>6000+ functions that are built into</a> the Wolfram Language, each function in the Function Repository has a documentation page, with a description and examples:</p> <p><a href="https://resources.wolframcloud.com/FunctionRepository/resources/LogoQRCode"><img src="https://content.wolfram.com/sites/43/2019/06/logoqrcode.png" alt="LogoQRCode" title="LogoQRCode" width="550" height="529" class="aligncenter size-full wp-image-20812" srcset="https://content.wolfram.com/sites/43/2019/06/logoqrcode.png 620w, https://content.wolfram.com/sites/43/2019/06/logoqrcode-300x288.png 300w" sizes="(max-width: 550px) 100vw, 550px" /></a></p> <p class='Text'>Go to the page, click to copy the “function blob”, paste it into your input, and then use the function just like a built-in Wolfram Language function (all necessary downloading etc. is already handled automatically in <a href='https://writings.stephenwolfram.com/2019/04/version-12-launches-today-big-jump-for-wolfram-language-and-mathematica/'>Version 12.0</a>): </p> <table class='InCell'> <tbody> <tr> <td colspan='1' rowspan='1' class='Input'> <div> <img class='' src="https://content.wolfram.com/sites/43/2020/07/wfr0717img1.png" alt='ResourceFunction' title='ResourceFunction' width='371' height='169' /> </div> <div class='IFL'> <span class='close' id='3_out'>&#10005</span></p> <pre class='text' id='3_out_text'>ResourceFunction["LogoQRCode"]["wolfr.am/E72W1Chw", CloudGet["https://wolfr.am/EcBjBfzw"]]</pre> </p></div> </td> </tr> </tbody> </table> <p class='Text'>And what’s critical here is that in introducing <tt><a href='https://resources.wolframcloud.com/FunctionRepository/resources/LogoQRCode'>LogoQRCode</a></tt> you don’t, for example, have to set up a “library to handle images”: there’s already a consistent and carefully designed way to represent and <a href='https://reference.wolfram.com/language/guide/ImageProcessing.html'>work with images</a> in the Wolfram Language—that immediately fits in with everything else in the language:</p> <table class='InCell'> <tbody> <tr> <td colspan='1' rowspan='1' class='Input'> <div> <img class='' src="https://content.wolfram.com/sites/43/2020/07/wfr0717img2.png" alt='ImageTransformation' title='Table' width='614' height='208' /> </div> <div class='IFL'> <span class='close' id='4_out'>&#10005</span></p> <pre class='text' id='4_out_text'>Table[ImageTransformation[ ResourceFunction["LogoQRCode"]["wolfr.am/E72W1Chw", ColorNegate[CloudGet["https://wolfr.am/EcBjBfzw"]]], #^k &], {k, 1, 2, .25}]</pre> </p></div> </td> </tr> </tbody> </table> <p class='Text'>I’m hoping that—with the help of the <a href='https://community.wolfram.com/'>amazing and talented community</a> that’s grown up around the Wolfram Language over the past few decades—the Wolfram Function Repository is going to allow rapid and dramatic expansion in the range of (potentially very specialized) functions available for the language. Everything will leverage both the content of the language, and the <a href='http://www.wolfram.com/language/principles/'>design principles</a> that the language embodies. (And, of course, the Wolfram Language has a <a href='https://writings.stephenwolfram.com/2018/06/weve-come-a-long-way-in-30-years-but-you-havent-seen-anything-yet/'>30+ year history of design stability</a>.)</p> <p class='Text'>Inside the functions in the Function Repository there may be tiny pieces of Wolfram Language code, or huge amounts. There may be calls to <a href='https://reference.wolfram.com/language/guide/AccessingExternalServicesAndAPIs.html'>external APIs and services</a>, or to <a href='https://reference.wolfram.com/language/ref/ExternalEvaluate.html'>external libraries in other languages</a>. But the point is that when it comes to user-level functionality everything will fit together, because it’s all based on the consistent design of the Wolfram Language—and every function will automatically “just work”.</p> <p class='Text'>We’ve set it up to be as easy as possible to contribute to the Wolfram Function Repository—essentially just by <a href='https://resources.wolframcloud.com/FunctionRepository/Unnamed-Function.nb'>filling out a simple notebook</a>. There’s automation that helps ensure that everything meets our design guidelines. And we’re focusing on coverage, not depth—and (though we’re putting in place an expert review process) we’re not insisting on anything like the same kind of <a href='https://www.stephenwolfram.com/livestreams/'>painstaking design analysis</a> or the same rigorous standards of completeness and robustness that we apply to built-in functions in the language.</p> <p class='Text'>There are lots of tradeoffs and details. But our goal is to optimize the Wolfram Function Repository both for utility to users, and for ease of contribution. As it grows, I’ve no doubt that we’ll have to invent new mechanisms, not least for organizing a large number of functions, and finding the ones one wants. But it’s very encouraging to see that it’s off to such a good start. I myself <a href='https://resources.wolframcloud.com/FunctionRepository/search/?i=stephen+wolfram'>contributed a number of functions</a> to the initial collection. Many are based on code that I’ve had for a long time. It only took me minutes to submit them to the Repository. But now that they’re in the Repository, I can—for the first time ever—immediately use the functions whenever I want, without worrying about finding files, loading packages, etc. </p> <h2 id="low-cost-high-payoff">Low Cost, High Payoff</h2> <p class='Text'>We’ve had ways for people to share Wolfram Language code since even before the web (our first major centralized effort was <a href='https://www.wolfram.com/mathematica/scrapbook/1991/06/07/1991_mathsource-2/'>MathSource</a>, built for Mathematica in 1991, using CD-ROMs, etc.). But there’s something qualitatively different—and much more powerful—about the Wolfram Function Repository. </p> <p class='Text'>We’ve worked very hard for more than 30 years to maintain the design integrity of the Wolfram Language, and this has been crucial in allowing the Wolfram Language to become not just a programming language, but a <a href='https://writings.stephenwolfram.com/2019/05/what-weve-built-is-a-computational-language-and-thats-very-important/'>full-scale computational language</a>. And now what the Wolfram Function Repository does is to leverage all this design effort to let new functions be added that fit consistently into the framework of the language.</p> <p class='Text'>Inside the implementation of each function, all sorts of things can be going on. But what’s critical is that to the user, the function is presented in a very definite and uniform way. In a sense, the built-in functions of the Wolfram Language provide 6000+ consistent examples of how functions should be designed (and our <a href='https://writings.stephenwolfram.com/2017/12/what-do-i-do-all-day-livestreamed-technology-ceoing/'>livestreamed design reviews</a> include <a href='https://www.stephenwolfram.com/livestreams/'>hundreds of hours of the process of doing that design</a>). But more than that, what ultimately makes the Wolfram Function Repository able to work well is the symbolic character of the Wolfram Language, and all the very rich structures that are already built into the language. If you’ve got a function that deals with images—or <a href='https://reference.wolfram.com/language/guide/SparseArrays.html'>sparse arrays</a>, or <a href='https://reference.wolfram.com/language/guide/MolecularStructureAndComputation.html'>molecular structures</a>, or <a href='https://reference.wolfram.com/language/ref/GeoPosition.html'>geo positions</a>, or whatever—there’s already a consistent symbolic representation of those in the language, and by using that, your function is immediately compatible with other functions in the system.</p> <p class='Text'>Setting up a repository that really works well is an interesting meta-design problem. Give too little freedom and one can’t get the functionality one wants. Give too much freedom and one won’t be able to maintain enough consistency. We’ve had several previous examples that have worked very well. The <a href='https://demonstrations.wolfram.com/'>Wolfram Demonstrations Project</a>—launched in 2007 and now (finally) running interactively on the web—contains more than 12,000 contributed interactive demonstrations. The <a href='https://datarepository.wolframcloud.com/'>Wolfram Data Repository</a> has 600+ datasets that can immediately be used in the Wolfram Language. And the <a href='https://resources.wolframcloud.com/NeuralNetRepository/'>Wolfram Neural Net Repository</a> adds neural nets by the week (118 so far) that immediately plug into the <tt><a href='http://reference.wolfram.com/language/ref/NetModel.html'>NetModel</a></tt> function in the Wolfram Language.</p> <p class='Text'>All these examples have the feature that the kind of thing that’s being collected is well collimated. Yes, the details of what actual Demonstration or neural net or whatever one has can vary a lot, but the fundamental structure for any given repository is always the same. So what about a repository that adds extensions to the Wolfram Language? The Wolfram Language is set up to be extremely flexible—so it can basically be extended and changed in any way. And this is tremendously important in making it possible to quickly build all sorts of large-scale systems in the Wolfram Language. But with this flexibility comes a cost. Because the more one makes use of it, the more one ends up with a separated tower of functionality—and the less one can expect that (without tremendous design effort) what one builds will consistently fit in with everything else.</p> <p class='Text'>In traditional programming languages, there’s already a very common problem with libraries. If you use one library, it might be OK. But if you try to use several, there’s no guarantee that they fit together. Of course, it doesn’t help that in a traditional programming language—as opposed to a full computational language—there’s no expectation of even having consistent built-in representations for anything but basic data structures. But the problem is bigger than that: whenever one builds a large-scale tower of functionality, then without the kind of immense centralized design effort that we’ve put into the Wolfram Language, one won’t be able to achieve the consistency and coherence needed for everything to always work well together.</p> <p class='Text'>So the idea of the Wolfram Function Repository is to avoid this problem by just adding bite-sized extensions in the form of individual functions—that are much easier to design in a consistent way. Yes, there are things that cannot conveniently be done with individual functions (and we’re soon going to be releasing a streamlined mechanism for distributing larger-scale packages). But with everything that’s already built into the Wolfram Language there’s an amazing amount that individual functions can do. And the idea is that with modest effort it’s possible to create very useful functions that maintain enough design consistency that they fit together and can be easily and widely used.</p> <p class='Text'>It’s a tradeoff, of course. With a larger-scale package one can introduce a whole new world of functionality, which can be extremely powerful and valuable. But if one wants to have new functionality that will fit in with everything else, then—unless one’s prepared to spend immense design effort—it’ll have to be smaller scale. The idea of the Wolfram Function Repository is to hit a particular sweet spot that allows for powerful functionality to be added while making it manageably easy to maintain good design consistency. </p> <h2 id="contributing-to-the-repository">Contributing to the Repository</h2> <p class='Text'>We’ve worked hard to make it easy to contribute to the Wolfram Function Repository. On the desktop (already in <a href='https://writings.stephenwolfram.com/2019/04/version-12-launches-today-big-jump-for-wolfram-language-and-mathematica/'>Version 12.0</a>), you can just go to <span class='computer-voice'>File</span> > <span class='computer-voice'>New</span> > <span class='computer-voice'>Repository Item</span> > <span class='computer-voice'>Function Repository Item</span> and you’ll get a “<a href='https://resources.wolframcloud.com/FunctionRepository/Unnamed-Function.nb'>Definition Notebook</a>” (programmatically, you can also use <tt><a href='http://reference.wolfram.com/language/ref/CreateNotebook.html'>CreateNotebook</a>["FunctionResource"]</tt>):</p> <p><a href='https://resources.wolframcloud.com/FunctionRepository/Unnamed-Function.nb'><img src="https://content.wolfram.com/sites/43/2019/06/definition-notebook.png" alt="Definition notebook" title="Definition notebook" width="550" height="539" class="aligncenter size-full wp-image-20770" srcset="https://content.wolfram.com/sites/43/2019/06/definition-notebook.png 620w, https://content.wolfram.com/sites/43/2019/06/definition-notebook-300x294.png 300w" sizes="(max-width: 550px) 100vw, 550px" /></a></p> <p class='Text'>There are two basic things you have to do: first, actually give the code for your function and, second, give documentation that shows how the function should be used. </p> <p class='Text'>Press the Open Sample button at the top to see an example of what you need to do:</p> <p><a href='https://resources.wolframcloud.com/FunctionRepository/resources/PositionLargest'><img src="https://content.wolfram.com/sites/43/2019/06/open-sample.png" alt="PositionLargest" title="PositionLargest" width="618" height="416" class="alignnone size-full wp-image-20776" srcset="https://content.wolfram.com/sites/43/2019/06/open-sample.png 618w, https://content.wolfram.com/sites/43/2019/06/open-sample-300x201.png 300w" sizes="(max-width: 618px) 100vw, 618px" /></a></p> <p class='Text'>Essentially, you’re trying to make something that’s like a built-in function in the Wolfram Language. Except that it can be doing something much more specific than a built-in function ever would. And the expectations for how complete and robust it is are much lower.</p> <p class='Text'>But you’ll need a name for your function, that fits in with Wolfram Language function naming principles. And you’ll need documentation that follows the same pattern as for built-in functions. I’ll say more later about these things. But for now, just notice that in the row of buttons at the top of the Definition Notebook there’s a <a href='https://resources.wolframcloud.com/FunctionRepository/style-guidelines'>Style Guidelines</a> button that explains more about what to do, and there’s a Tools button that provides tools—especially for formatting documentation. </p> <p class='Text'>When you think you’re ready, press the Check button. It’s OK if you haven’t gotten all the details right yet. Because Check will automatically go through and do lots of style and consistency checks. Often it will make immediate suggestions for you to approve (“This line should end with a colon” and it’ll offer to put the colon in). Sometimes it will ask you to add or change something yourself. We’ll be continually adding to the automatic functionality of Check, but basically its goal to try to ensure that anything you submit to the Function Repository is already guaranteed to follow as many of the style guidelines as possible.</p> <p><img src="https://content.wolfram.com/sites/43/2019/06/check-comments.png" alt="Check comments" title="Check comments" width="616" height="718" class="aligncenter size-full wp-image-20811" srcset="https://content.wolfram.com/sites/43/2019/06/check-comments.png 616w, https://content.wolfram.com/sites/43/2019/06/check-comments-257x300.png 257w" sizes="(max-width: 616px) 100vw, 616px" /></p> <p class='Text'>OK, so after you run Check, you can use Preview. Preview generates a preview of the documentation page that you’ve defined for your function. You can choose to create a preview either in a desktop notebook, or in the cloud. If you don’t like something you see in the preview, just go back and fix it, and press Preview again.</p> <p class='Text'>Now you’re ready to deploy your function. The Deploy button provides four options:</p> <p><img src="https://content.wolfram.com/sites/43/2019/06/deploy-button.png" alt="Deploy" title="Deploy" width="620" height="141" class="alignnone size-full wp-image-20771" srcset="https://content.wolfram.com/sites/43/2019/06/deploy-button.png 620w, https://content.wolfram.com/sites/43/2019/06/deploy-button-300x68.png 300w" sizes="(max-width: 620px) 100vw, 620px" /></p> <p class='Text'>The big thing you can do is to submit your function to the Wolfram Function Repository, so it’s available to everyone forever. But you can also deploy your function for more circumscribed use. For example, you can have the function just deployed locally on your computer, so it will be available whenever you use that particular computer. Or you can deploy it to your <a href='http://www.wolframcloud.com/'>cloud account</a>, so it will be available to you whenever you’re connected to the cloud. You can also deploy a function publicly through your cloud account. It won’t be in the central Wolfram Function Repository, but you’ll be able to give anyone a URL that’ll let them get your function from your account. (In the future, we’ll also be supporting organization-wide central repositories.)</p> <p class='Text'>OK, let’s say you’re ready to actually submit your function to the Wolfram Function Repository. Then, needless to say, you press Submit to Repository. So what happens then? Well, your submission immediately goes into a queue for review and approval by our team of curators. </p> <p class='Text'>As your submission goes through the process (which will typically take a few days) you’ll get status messages—as well as maybe suggestions. But as soon as your function is approved, it’ll immediately be published in the Wolfram Function Repository, and available for anyone to use. (And it’ll show up in <a href='https://resources.wolframcloud.com/FunctionRepository/recent'>New Functions digests</a>, etc. etc.)</p> <h2 id="what-should-be-in-the-respository">What Should Be in the Repository</h2> <p class='Text'>We have very high standards for the completeness, robustness—and overall quality—of the 6000+ functions that we’ve painstakingly built into the Wolfram Language over the past 30+ years. The goal of the Wolfram Function Repository is to leverage all the structure and functionality that already exists in the Wolfram Language to add as many as possible, much more lightweight, functions.</p> <p class='Text'>Yes, functions in the Wolfram Function Repository need to follow the design principles of the Wolfram Language—so they fit in with other functions, and with users’ expectations about how functions should work. But they don’t need to have the same completeness or robustness.</p> <p class='Text'>In the built-in functions of the Wolfram Language, we work hard to make things be as general as possible. But in the Wolfram Function Repository, there’s nothing wrong with having a function that just handles some very specific, but useful, case. <tt><a href='https://resources.wolframcloud.com/FunctionRepository/resources/SendMailFromNotebook'>SendMailFromNotebook</a></tt> can accept notebooks in one specific format, and produce mail in one specific way. <tt><a href='https://resources.wolframcloud.com/FunctionRepository/resources/PolygonalDiagram'>PolygonalDiagram</a></tt> makes diagrams only with particular colors and labeling. And so on.</p> <p class='Text'>Another thing about built-in functions is that we go to great pains to handle all the corner cases, to deal with bad input properly, and so on. In the Function Repository it’s OK to have a function that just handles the main cases—and ignores everything else.</p> <p class='Text'>Obviously it’s better to have functions that do more, and do it better. But the optimization for the Function Repository—as opposed to for the built-in functions of the Wolfram Language—is to have more functions, covering more functionality, rather than to deepen each function.</p> <p class='Text'>What about testing the functions in the Function Repository? The expectations are considerably lower than for built-in functions. But—particularly when functions depend on external resources such as APIs—it’s important to be continually running regression tests, which is what automatically happens behind the scenes. In the Definition Notebook, you can explicitly give (in the Additional Information section) as many tests as you want, defined either by input and output lines or by full symbolic <tt><a href='http://reference.wolfram.com/language/ref/VerificationTest.html'>VerificationTest</a></tt> objects. In addition, the system tries to turn the documentation examples you give into tests (though this can sometimes be quite tricky, e.g. for a function whose result depends on random numbers, or the time of day).</p> <p class='Text'>There’ll be a whole range of implementation complexity to the functions in the Function Repository. Some will be just a single line of code; others might involve thousands or tens of thousands of lines, probably spread over many subsidiary functions. When is it worth adding a function that takes only very little code to define? Basically, if there’s a <a href='https://writings.stephenwolfram.com/2010/10/the-poetry-of-function-naming/'>good name for the function</a>—that people would readily understand if they saw it in a piece of code—then it’s worth adding. Otherwise, it’s probably better just to write the code again each time you need to use it.</p> <p class='Text'>The primary purpose of the Function Repository (as its name suggests) is to introduce new functions. If you want to introduce new data, or <a href='https://datarepository.wolframcloud.com/type/Entity-Store/'>new entities</a>, then use the <a href='https://datarepository.wolframcloud.com/'>Wolfram Data Repository</a>. But what if you want to introduce new kinds of objects to compute with? </p> <p class='Text'>There are really two cases. You might want a new kind of object that’s going to be used in new functions in the Function Repository. And in that case, you can always just write down a symbolic representation of it, and use it in the input or output of functions in the Function Repository.</p> <p class='Text'>But what if you want to introduce an object and then define how existing functions in the Wolfram Language should operate on it? Well, the Wolfram Language has always had an easy mechanism for that, called <a href='https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#6972'>upvalues</a>. And with certain restrictions (particularly for functions that <a href='https://reference.wolfram.com/language/guide/EvaluationControl.html'>don’t evaluate their arguments</a>), the Function Repository lets you just introduce a function, and define upvalues for it. (To set expectations: getting a major new construct fully integrated everywhere in the Wolfram Language is typically a very significant undertaking, that can’t be achieved just with upvalues—and is the kind of thing we do as part of the long-term development of the language, but isn’t what the Function Repository is set up to deal with.)</p> <p class='Text'>But, OK, so what can be in the code for functions in the Function Repository? <a href='https://reference.wolfram.com/language/'>Anything built into the Wolfram Language</a>, of course (at least so long as it doesn’t pose a <a href='https://reference.wolfram.com/language/guide/FileOperations.html'>security risk</a>). Also, any function from the Function Repository. But there are other possibilities, too. A function in the Function Repository can call an API, either in the <a href='https://reference.wolfram.com/language/guide/CreatingAnInstantAPI.html'>Wolfram Cloud</a> or <a href='https://reference.wolfram.com/language/guide/AccessingExternalServicesAndAPIs.html'>elsewhere</a>. Of course, there’s a risk associated with this. Because there’s no guarantee that the API won’t change—and make the function in the Function Repository stop working. And to recognize issues like this, there’s always a note on the documentation page (under Requirements) for any function that relies on more than just built-in Wolfram Language functionality. (Of course, when real-world data is involved, there can be issues even with this functionality—because actual data in the world changes, and even sometimes changes its definitions.)</p> <p class='Text'>Does all the code for the Wolfram Function Repository have to be written in the Wolfram Language? The code inside an external API certainly doesn’t have to be. And, actually, nor even does local code. In fact, if you find a function in pretty much any external language or library, you should be able to make a wrapper that allows it to be used in the Wolfram Function Repository. (Typically this will involve using <tt><a href='http://reference.wolfram.com/language/ref/ExternalEvaluate.html'>ExternalEvaluate</a></tt> or <tt><a href='http://reference.wolfram.com/language/ref/ExternalFunction.html'>ExternalFunction</a></tt> in the Wolfram Language code.)</p> <p class='Text'>So what’s the point of doing this? Basically, it’s to leverage the whole integrated Wolfram Language system and its unified design. You get the underlying implementation from an external library or language—but then you’re using the Wolfram Language’s rich symbolic structure to create a convenient top-level function that makes it easy for people to use whatever functionality has been implemented. And, at least in a perfect world, all the details of loading libraries and so on will be automatically taken care of through the Wolfram Language. (In practice, there can sometimes be issues <a href='https://reference.wolfram.com/language/workflow/ConfigurePythonForExternalEvaluate.html'>getting external languages set up</a> on a particular computer system—and in the cloud there are additional security issues to worry about.) </p> <p class='Text'>By the way, when you first look at typical external libraries, they often seem far too complicated to just be covered by a few functions. But in a great many cases, most of the complexity comes from building up the infrastructure needed for the library—and all the functions to support that. When one’s using the Wolfram Language, however, the infrastructure is usually already built in, and so one doesn’t need to expose all those support functions—and one only needs to create functions for the few “topmost” applications-oriented functions in the library.</p> <h2 id="the-ecosystem-of-the-repository">The Ecosystem of the Repository</h2> <p class='Text'>If you’ve written functions that you use all the time, then send them in to the Wolfram Function Repository! If nothing else, it’ll be much easier for you to use the functions yourself. And, of course, if you use the functions all the time, it’s likely other people will find them useful too.</p> <p class='Text'>Of course, you may be in a situation where you can’t—or don’t want to—share your functions, or where they access private resources. And in such cases, you can just deploy the functions to your own cloud account, <a href='https://reference.wolfram.com/language/workflow/SetACloudObjectsPermissions.html'>setting permissions</a> for who can access them. (If your organization has a <a href='https://www.wolfram.com/enterprise-private-cloud/'>Wolfram Enterprise Private Cloud</a>, then this will soon be able to host its own private Function Repository, which can be administered within your organization, and set to force review of submissions, or not.)</p> <p class='Text'>Functions you submit to the Wolfram Function Repository don’t have to be perfect; they just have to be useful. And—a bit like the “Bugs” section in classic Unix documentation—there’s a section in the Definition Notebook called “Author Notes” in which you can describe limitations, issues, etc. that you’re already aware of about your function. In addition, when you submit your function you can include Submission Notes that’ll be read by the curation team. </p> <p class='Text'>Once a function is published, its documentation page always has two links at the bottom: “<a href='https://resources.wolframcloud.com/FunctionRepository/feedback-form'>Send a message about this function</a>”, and “<a href='https://community.wolfram.com/content?curTag=wolfram%20function%20repository'>Discuss on Wolfram Community</a>”. If you send a message (say reporting a bug), you can check a box saying you want your message and contact information to be passed to the author of the function. </p> <p class='Text'>Often you’ll just want to use functions from the Wolfram Function Repository like built-in functions, without looking inside them. But if you want to “look inside”, there’s always a Source Notebook button at the top. Press it and you’ll get your own copy of the original Definition Notebook that was submitted to the Function Repository. Sometimes you might just want to look at this as an example. But you can also make your own modifications. Maybe you’ll want to deploy these on your computer or in your cloud account. Or maybe you’ll want to submit these to the Function Repository, perhaps as a better version of the original function.</p> <p class='Text'>In the future, we might support Git-style forking in the Function Repository. But for now, we’re keeping it simpler, and we’re always having just one canonical version of each function. And basically (unless they abandon it and don’t respond to messages) the original author of the function gets to control updates to it—and gets to submit new versions, which are then reviewed and, if approved, published.</p> <p class='Text'>OK, so how does versioning work? Right now, as soon as you use a function from the Function Repository its definition will get permanently stored on your computer (or in your cloud account, if you’re using the cloud). If there’s a new version of the function, then when you next use the function, you’ll get a message letting you know this. And if you want to update to the new version, you can do that with <tt><a href='http://reference.wolfram.com/language/ref/ResourceUpdate.html'>ResourceUpdate</a></tt>. (The “function blob” actually stores more information about versioning, and in the future we’re planning on making this conveniently accessible.)</p> <p class='Text'>One of the great things about the Wolfram Function Repository is that any Wolfram Language program anywhere can use functions from it. If the program appears in a notebook, it’s often nice to format Function Repository functions as easy-to-read “function blobs” (perhaps with appropriate versioning set). </p> <p class='Text'>But you can always refer to any Function Repository function using a textual <tt><a href='http://reference.wolfram.com/language/ref/ResourceFunction.html'>ResourceFunction</a>[...]</tt>. And this is convenient if you’re directly writing code or scripts for the Wolfram Engine, say with <a href='https://www.wolfram.com/developer/'>an IDE or textual code editor</a>. (And, yes, the Function Repository is fully compatible with the <a href='https://writings.stephenwolfram.com/2019/05/launching-today-free-wolfram-engine-for-developers/'>Free Wolfram Engine for Developers</a>.)</p> <h2 id="how-it-works">How It Works</h2> <p class='Text'>Inside the Wolfram Function Repository it’s using exactly the same <a href='https://reference.wolfram.com/language/guide/WolframResourceSystem.html'>Resource System</a> framework as <a href='https://resources.wolframcloud.com/'>all our other repositories</a> (<a href='https://datarepository.wolframcloud.com/'>Data Repository</a>, <a href='https://resources.wolframcloud.com/NeuralNetRepository/'>Neural Net Repository</a>, <a href='https://demonstrations.wolfram.com/'>Demonstrations Project</a>, etc.) And like everything else in the Resource System, a <tt><a href='http://reference.wolfram.com/language/ref/ResourceFunction.html'>ResourceFunction</a></tt> is ultimately based on a <tt><a href='http://reference.wolfram.com/language/ref/ResourceObject.html'>ResourceObject</a></tt>.</p> <p class='Text'>Here’s a <tt><a href='http://reference.wolfram.com/language/ref/ResourceFunction.html'>ResourceFunction</a></tt>:</p> <table class='InCell'> <tbody> <tr> <td colspan='1' rowspan='1' class='Input'> <div> <img class='' src="https://content.wolfram.com/sites/43/2020/07/wfr0717img3.png" alt='ResourceFunction' title='ResourceFunction' width='323' height='62' /> </div> <div class='IFL'> <span class='close' id='5_out'>&#10005</span></p> <pre class='text' id='5_out_text'>ResourceFunction["StringIntersectingQ"]</pre> </p></div> </td> </tr> </tbody> </table> <p class='Text'>It’s somewhat complicated inside, but you can see some of what’s there using <tt><a href='http://reference.wolfram.com/language/ref/Information.html'>Information</a></tt>: </p> <table class='InCell'> <tbody> <tr> <td colspan='1' rowspan='1' class='Input'> <div> <img class='' src="https://content.wolfram.com/sites/43/2019/06/sw607img4_.png" alt='Information' title='Information' width='535' height='247' /> </div> <div class='IFL'> <span class='close' id='6_out'>&#10005</span></p> <pre class='text' id='6_out_text'>Information[ResourceFunction["StringIntersectingQ"]]</pre> </p></div> </td> </tr> </tbody> </table> <p class='Text'>So how does setting up a resource function work? The simplest is the purely local case. Here’s an example that takes a function (here, just a pure function) and defines it as a resource function for this session: </p> <table class='InCell'> <tbody> <tr> <td colspan='1' rowspan='1' class='Input'> <div> <img class='' src="https://content.wolfram.com/sites/43/2020/07/wfr0717img5.png" alt='DefineResourceFunction' title='DefineResourceFunction' width='343' height='62' /> </div> <div class='IFL'> <span class='close' id='7_out'>&#10005</span></p> <pre class='text' id='7_out_text'>DefineResourceFunction[1 + # &, "AddOne"]</pre> </p></div> </td> </tr> </tbody> </table> <p class='Text'>Once you’ve made the definition, you can use the resource function:</p> <table class='InCell'> <tbody> <tr> <td colspan='1' rowspan='1' class='Input'> <div> <img class='' src="https://content.wolfram.com/sites/43/2020/07/wfr0717img6.png" alt='ResourceFunction' title='ResourceFunction' width='161' height='62' /> </div> <div class='IFL'> <span class='close' id='8_out'>&#10005</span></p> <pre class='text' id='8_out_text'>ResourceFunction["AddOne"][100]</pre> </p></div> </td> </tr> </tbody> </table> <p class='Text'>Notice that in this function blob, there’s a black icon <span class='InlineFormula'><img src="https://content.wolfram.com/sites/43/2020/07/button2x.png" width='21' height='17' align='absmiddle' class="inline-img"></span>. This indicates the function blob refers to an in-memory resource function defined for your current session. For a resource function that’s permanently stored on your computer, or in a cloud account, there’s a gray icon <span class='InlineFormula'><img src="https://content.wolfram.com/sites/43/2019/06/icon-gray.png" align='absmiddle' class="inline-img"></span>. And for an official resource function in the Wolfram Function Repository there’s an orange icon <span class='InlineFormula'><img src="https://content.wolfram.com/sites/43/2019/06/icon-orange.png" align='absmiddle' class="inline-img"></span>. </p> <p class='Text'>OK, so what happens when you use the Deploy menu in a Definition Notebook? First, it’ll take everything in the Definition Notebook and make a symbolic <tt><a href='http://reference.wolfram.com/language/ref/ResourceObject.html'>ResourceObject</a></tt> out of it. (And if you’re using a textual IDE—or a program—you can also explicitly create the <tt><a href='http://reference.wolfram.com/language/ref/ResourceObject.html'>ResourceObject</a></tt>.) </p> <p class='Text'>Deploying locally on your computer uses <tt><a href='http://reference.wolfram.com/language/ref/LocalCache.html'>LocalCache</a></tt> on the resource object to store it as a <tt><a href='http://reference.wolfram.com/language/ref/LocalObject.html'>LocalObject</a></tt> in your file system. Deploying in your cloud account uses <tt><a href='http://reference.wolfram.com/language/ref/CloudDeploy.html'>CloudDeploy</a></tt> on the resource object, and deploying publicly in the cloud uses <tt><a href='http://reference.wolfram.com/language/ref/CloudPublish.html'>CloudPublish</a></tt>. In all cases, <tt><a href='http://reference.wolfram.com/language/ref/ResourceRegister.html'>ResourceRegister</a></tt> is also used to register the name of the resource function so that <tt><a href='http://reference.wolfram.com/language/ref/ResourceFunction.html'>ResourceFunction</a>["</tt><em>name</em><tt>"]</tt> will work.</p> <p class='Text'>If you press Submit to Function Repository, then what’s happening underneath is that <tt><a href='http://reference.wolfram.com/language/ref/ResourceSubmit.html'>ResourceSubmit</a></tt> is being called on the resource object. (And if you’re using a textual interface, you can call <tt><a href='http://reference.wolfram.com/language/ref/ResourceSubmit.html'>ResourceSubmit</a></tt> directly.)</p> <p class='Text'>By default, the submission is made under the name associated with your Wolfram ID. But if you’re submitting on behalf of a group or an organization, then you can <a href='https://resources.wolframcloud.com/FunctionRepository/request-publisher-id'>set up a separate Publisher ID</a>, and you can instead use this as the name to associate with your submissions. </p> <p class='Text'>Once you’ve submitted something to the Function Repository, it’ll go into the queue for review. If you get comments back, they’ll usually be in the form of a notebook with extra “comment cells” added. You can always check on the status of your submission by going to the <a href='https://resources.wolframcloud.com/publisher/submissions'>Resource System Contributor Portal</a>. But as soon as it’s approved, you’ll be notified (by email), and your submission will be live on the Wolfram Function Repository.</p> <h2 id="some-subtleties">Some Subtleties</h2> <p class='Text'>At first, it might seem like it should be possible to take a Definition Notebook and just put it verbatim into the Function Repository. But actually there are quite a few subtleties—and handling them requires doing some fairly sophisticated metaprogramming, symbolically processing both the code defining the function, and the Definition Notebook itself. Most of this happens internally, behind the scenes. But it has some consequences that are worth understanding if you’re going to contribute to the Function Repository.</p> <p class='Text'>Here’s one immediate subtlety. When you fill out the Definition Notebook, you can just refer to your function everywhere by a name like <tt>MyFunction</tt>—that looks like an ordinary name for a function in the Wolfram Language. But for the Function Repository documentation, this gets replaced by <tt><a href='http://reference.wolfram.com/language/ref/ResourceFunction.html'>ResourceFunction</a>["MyFunction"]</tt>—which is what users will actually use. </p> <p class='Text'>Here’s another subtlety: when you create a resource function from a Definition Notebook, all the dependencies involved in the definition of the function need to be captured and explicitly included. And to guarantee that the definitions remain modular, one needs to put everything in a unique <a href='https://reference.wolfram.com/language/ref/$Context.html'>namespace</a>. (Needless to say, the <a href='https://resources.wolframcloud.com/FunctionRepository/search/?i=Function+Resource+Utility'>functions that do all this</a> are in the Function Repository.) </p> <p class='Text'>Usually you’ll never see any evidence of the internal context used to set up this namespace. But if for some reason you return an unevaluated symbol from the innards of your function, then you’ll see that the symbol is in the internal context. However, when the Definition Notebook is processed, at least the symbol corresponding to the function itself is <a href='https://resources.wolframcloud.com/FunctionRepository/resources/FormatAsResourceFunction'>set up to be displayed elegantly</a> as a function blob rather than as a raw symbol in an internal context.</p> <p class='Text'>The Function Repository is about defining new functions. And these functions may have options. Often these options will be ones (like, say, <tt><a href='http://reference.wolfram.com/language/ref/Method.html'>Method</a></tt> or <tt><a href='http://reference.wolfram.com/language/ref/ImageSize.html'>ImageSize</a></tt>) that have already been used for built-in functions, and for which built-in symbols already exist. But sometimes a new function may need new options. To maintain modularity, one might like these options to be symbols defined in a unique internal context (or to be something like whole resource functions in their own right). But to keep things simple, the Function Repository allows new options to be given in definitions as strings. And, as a courtesy to the final user, these definitions (assuming they’ve used <tt><a href='http://reference.wolfram.com/language/ref/OptionValue.html'>OptionValue</a></tt> and <tt><a href='http://reference.wolfram.com/language/ref/OptionsPattern.html'>OptionsPattern</a></tt>) are also processed so that when the functions are used, the options can be given not only strings but also as global symbols with the same name. </p> <p class='Text'>Most functions just do what they do each time they are called. But some functions need initialization before they can run in a particular session—and to deal with this there’s an Initialization section in the Definition Notebook.</p> <p class='Text'>Functions in the Function Repository can immediately make use of other functions that are already in the Repository. But how do you set up definitions for the Function Repository that involve two (or more) functions that refer to each other? Basically you just have to deploy them in your session, so you can refer to them as <tt><a href='http://reference.wolfram.com/language/ref/ResourceFunction.html'>ResourceFunction</a>["</tt><em>name</em><tt>"]</tt>. Then you can create the examples you want, and then submit the functions.</p> <h2 id="what-happens-when-the-repository-gets-big">What Happens When the Repository Gets Big?</h2> <p class='Text'>Today we’re just launching the Wolfram Function Repository. But over time we expect it to grow dramatically, and as it grows there are a variety of issues that we know will come up.</p> <p class='Text'>The first is about function names and their uniqueness. The Function Repository is designed so that—like for built-in functions in the Wolfram Language—one can refer to any given function just by giving its name. But this inevitably means that the names of functions have to be globally unique across the Repository—so that, for example, there can be only one <tt><a href='http://reference.wolfram.com/language/ref/ResourceFunction.html'>ResourceFunction</a>["MyFavoriteFunction"]</tt> in the Repository. </p> <p class='Text'>This might seem like a big issue. But it’s worth realizing it’s basically the same issue as for things like internet domains or social network handles. And the point is that one simply has to have a registrar—and that’s one of the roles we’re playing for the Wolfram Function Repository. (For private versions of the Repository, their administrators can be registrars.) Of course an internet domain can be registered without having anything on it, but in the Function Repository the name of a function can only be registered if there’s an actual function definition to go with it.</p> <p class='Text'>And part of our role in managing the Wolfram Function Repository is to ensure that the name picked for a function is reasonable given the definition of the function—and that it fits in with Wolfram Language naming conventions. We’ve now had 30+ years of experience in naming built-in functions in the Wolfram Language, and our curation team brings that experience to the Function Repository. Of course, there are always tradeoffs. For example, it might seem nice to have a short name for some function. But it’s better to “name defensively” with a longer, more specific name, because then it’s less likely to collide with something one wants to do in the future.</p> <p class='Text'>(By the way, just adding some kind of contributor tag to disambiguate functions wouldn’t achieve much. Because unless one insists on always giving the tag, one will end up having to define a default tag for any given function. Oh, and allocating contributor tags again requires global coordination.)</p> <p class='Text'>As the Wolfram Function Repository grows, one of the issues that’s sure to arise is the discoverability of functions. Yes, there’s <a href='https://resources.wolframcloud.com/FunctionRepository/resources/ResourceFunctionSearch'>search functionality</a> (and Definition Notebooks can include keywords, etc.). But for built-in functions in the Wolfram Language there’s all sorts of cross-linking in documentation which helps “advertise” functions. Functions in the Function Repository can link to built-in functions. But what about the other way around? We’re going to be experimenting with various schemes to expose Function Repository functions on the documentation pages for built-in functions. </p> <p class='Text'>For built-in functions in the Wolfram Language, there’s also a level of discoverability provided by the <a href='https://reference.wolfram.com/language/'>network of “guide pages”</a> that give organized lists of functions relevant to particular areas. It’s always complicated to appropriately balance guide pages—and as the Wolfram Language has grown, it’s common for guide pages to have to be completely refactored. It’s fairly easy to put functions from the Function Repository into broad categories, and even to successively break up these categories. But it’s much more valuable to have properly organized guide pages. It’s not yet clear how best to produce these for the whole Function Repository. But for example <tt><a href='https://resources.wolframcloud.com/FunctionRepository/resources/CreateResourceObjectGallery'>CreateResourceObjectGallery</a></tt> in the Function Repository lets anyone put up a webpage containing their “picks” from the repository:</p> <p><img src="https://content.wolfram.com/sites/43/2019/06/resource-gallery.png" alt="Resource gallery" title="Resource gallery" width="450" height="319" class="aligncenter size-full wp-image-20827" srcset="https://content.wolfram.com/sites/43/2019/06/resource-gallery.png 620w, https://content.wolfram.com/sites/43/2019/06/resource-gallery-300x212.png 300w" sizes="(max-width: 450px) 100vw, 450px" /></p> <p class='Text'>The Wolfram Function Repository is set up to be a permanent repository of functions, where any function in it will always just work. But of course, there may be new versions of functions. And we fully expect some functions to be obsoleted over time. The functions will still work if they’re used in programs. But their documentation pages will point to new, better functions.</p> <p class='Text'>The Wolfram Function Repository is all about providing new functions quickly—and exploring new frontiers for how the Wolfram Language can be used. But we fully expect that some of what’s explored in the Function Repository will eventually make sense to become built-in parts of the core Wolfram Language. We’ve had a slightly similar flow over the past decade from <a href='https://writings.stephenwolfram.com/2019/05/wolframalpha-at-10/#wolfram-alpha-meets-wolfram-language'>functionality that was originally introduced in Wolfram|Alpha</a>. And one of the lessons is that to achieve the standards of quality and coherence that we insist on for anything built into the Wolfram Language is a lot of work—that usually dwarfs the original implementation effort. But even so, a function in the Function Repository can serve as a very useful proof of concept for a future function built into the Wolfram Language.</p> <p class='Text'>And of course the critical thing is that a function in the Function Repository is something that’s available for everyone to use right now. Yes, an eventual built-in function could be much better and stronger. But the Function Repository lets people get access to new functions immediately. And, crucially, it lets those new functions be contributed by anyone.</p> <p class='Text'>Earlier in the history of the Wolfram Language this wouldn’t have worked so well. But now there is so much already built into the language—and so strong an understanding of the design principles of the language—that it’s feasible to have a large community of people add functions that will maintain the design consistency to make them broadly useful.</p> <p class='Text'>There’s incredible talent in the community of Wolfram Language users. (And, of course, that community includes many of the world’s top people in R&D across a vast range of fields.) I’m hoping that the Wolfram Function Repository will provide an efficient platform for that talent to be exposed and shared. And that together we’ll be able to create something that dramatically expands the domain to which the computational paradigm can be applied. </p> <p class='Text'>We’ve taken the Wolfram Language a long way in 30+ years. Now, together, let’s take it much further. And let’s use the Function Repository—as well as things like the Free Wolfram Engine for Developers—as a platform for doing that.</p> </div> <div class="post_foot single"> <div class="category"> <div class="citingsOuterWrapper"> <div class="citingsInnerWrapper"> <button type="button" class="citingsOpenButton"> <span class="citingsOpenButtonText">Cite this as</span> </button> <button type="button" class="citingsCloseButton"> <div class="citingsCloseButtonIcon"></div> </button><span class="citingClosedPlainText citingText wolfram-c2c-wrapper" data-C2C-Inline="Stephen Wolfram (2019), "The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language," Stephen Wolfram Writings. writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language." data-C2C-type="text/plain">Stephen Wolfram (2019), "The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language," Stephen Wolfram Writings. writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language.</span><div class="citing"><div class="citingType">Text</div><div class="citingText wolfram-c2c-wrapper" data-C2C-Inline="Stephen Wolfram (2019), "The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language," Stephen Wolfram Writings. writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language." data-C2C-type="text/plain">Stephen Wolfram (2019), "The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language," Stephen Wolfram Writings. writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language.</div></div><div class="citing"><div class="citingType">CMS</div><div class="citingText wolfram-c2c-wrapper" data-C2C-Inline="Wolfram, Stephen. "The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language." Stephen Wolfram Writings. June 11, 2019. writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language." data-C2C-type="text/plain">Wolfram, Stephen. "The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language." Stephen Wolfram Writings. June 11, 2019. writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language.</div></div><div class="citing"><div class="citingType">APA</div><div class="citingText wolfram-c2c-wrapper" data-C2C-Inline="Wolfram, S. (2019, June 11). The Wolfram Function Repository: Launching an open platform for extending the Wolfram Language. Stephen Wolfram Writings. writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language." data-C2C-type="text/plain">Wolfram, S. (2019, June 11). The Wolfram Function Repository: Launching an open platform for extending the Wolfram Language. Stephen Wolfram Writings. writings.stephenwolfram.com/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language.</div></div> </div> <div class="citingsShowSpacer"></div></div> <p>Posted in: <a href="https://writings.stephenwolfram.com/category/mathematica/" rel="category tag">Mathematica</a>, <a href="https://writings.stephenwolfram.com/category/new-technology/" rel="category tag">New Technology</a>, <a href="https://writings.stephenwolfram.com/category/software-design/" rel="category tag">Software Design</a>, <a href="https://writings.stephenwolfram.com/category/wolfram-language/" rel="category tag">Wolfram Language</a></p> </div> </div> <div id="comments_wrapper"> <span id="comments"></span> <div id="respond"> <!-- <h3 class="comments-heading"><div class="cancel-comment-reply"><a rel="nofollow" id="cancel-comment-reply-link" href="/2019/06/the-wolfram-function-repository-launching-an-open-platform-for-extending-the-wolfram-language/#respond" style="display:none;">cancel [x]</a></div></h3> --> <div id="join-small"> <input type="text" id="fakeComment" placeholder="Join the discussion"> </div> <form action="https://writings.stephenwolfram.com/wp-comments-post.php" method="post" id="commentform"> <div id="join-big"> <div id="exit-button"><div id="exit-image"></div><div style="clear: both;"></div></div> <div id="comment-area"> <textarea name="comment" id="comment" tabindex="1"></textarea> <p><span id="commentError" style="display:none">Please enter your comment (at least 5 characters).</span></p> </div> <div class="level"> <div class="half-length"><label for="author">Name (required)</label></div> <div class="half-length "><div class="pad-left"><label for="email">Email (will not be published; required)</label></div></div> <div style="clear:both;"></div> </div> <div> <div class="half-length"><input type="text" name="author" id="author" value="" size="22" tabindex="2" aria-required='true' /><p><span id="nameError" style="display:none">Please enter your name.</span></p></div> <div class="half-length "><div class="pad-left"><input type="text" name="email" id="email" value="" size="22" tabindex="3" aria-required='true' /></div> <p><span id="emailError" style="margin-left: 10px; display:none">Please enter a valid email address.</span></p></div> <div style="clear:both;"></div> </div> <div class="level"> <div class="half-length"><label for="url">Website</label></div> <div style="clear:both;"></div> <div class="half-length"><input type="text" name="url" id="url" value="" size="22" tabindex="4" /></div> <div style="clear:both;"></div> <p><input name="submit" type="submit" id="submit" class="button" tabindex="5" value="Submit comment »" onclick="return checkCommentFields()" /></p> <div style="clear:both;"></div> </div> <div class="post_separator_no_margin"></div> </div> <input type='hidden' name='comment_post_ID' value='20755' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> <p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="ede08e64c3" /></p><p style="display: none;"><input type="hidden" id="ak_js" name="ak_js" value="20"/></p> </form> </div><!-- respond --> </div><!-- wrapper --> <script type="text/javascript"> function checkCommentFields() { if($(".socialLoggedIn").is(":visible")) return true; var ret = true; if($("#author").val().trim().length < 2) { $("#nameError").fadeIn(); ret = false; } else { $("#nameError").fadeOut(); } if(!validEmail($("#email").val().trim())) { $("#emailError").fadeIn(); ret = false; } else { $("#emailError").fadeOut(); } if($("#comment").val().trim().length < 5) { $("#commentError").fadeIn(); ret = false; } else { $("#commentError").fadeOut(); } return ret; } $(document).ready(function(){ $('.comment-author a').attr("target", "_blank"); if(window.location.href.indexOf("comment-page-1") > -1) { $('#comment-section').removeClass('hide'); } $("#author").keyup(function() { if($("#nameError").is(":visible") && $("#author").val().trim().length >= 2) $("#nameError").fadeOut(); }); $("#email").keyup(function() { if($("#emailError").is(":visible") && validEmail($("#email").val().trim())) $("#emailError").fadeOut(); }); $("#comment").keyup(function() { if($("#commentError").is(":visible") && $("#comment").val().trim().length >= 5) $("#commentError").fadeOut(); }); }); function validEmail(email) { signPos = email.indexOf("@"); dotPos = email.lastIndexOf("."); if (email.length < 6 || signPos == -1 || dotPos == -1 || (dotPos < signPos) || (dotPos - signPos == 1) || dotPos == email.length-1 ) { return false; } return true; } </script> <div id="footer_recent_posts"> <p class="sidebar-heading">Related Writings</p> <div class="sidebar_post_wrapper"> <div class="sidebar_thumbnail"> <a href="https://writings.stephenwolfram.com/2024/07/yet-more-new-ideas-and-new-functions-launching-version-14-1-of-wolfram-language-mathematica/" rel="bookmark" title="Permanent Link to Yet More New Ideas and New Functions: Launching Version 14.1 of Wolfram Language & Mathematica" > <img width="128" height="108" src="https://content.wolfram.com/sites/43/2024/07/swblog-v14.1-icon.png" class="lazy wp-post-image" alt="" title="" /> </a> </div> <div class="sidebar_post"> <p><a href="https://writings.stephenwolfram.com/2024/07/yet-more-new-ideas-and-new-functions-launching-version-14-1-of-wolfram-language-mathematica/" rel="bookmark" title="Permanent Link to Yet More New Ideas and New Functions: Launching Version 14.1 of Wolfram Language & Mathematica" >Yet More New Ideas and New Functions: Launching Version 14.1 of Wolfram Language & Mathematica</a></p> <p><time datetime="2024-07-31">July 31, 2024</time></p> </div> </div> <div class="sidebar_post_wrapper"> <div class="sidebar_thumbnail"> <a href="https://writings.stephenwolfram.com/2024/01/the-story-continues-announcing-version-14-of-wolfram-language-and-mathematica/" rel="bookmark" title="Permanent Link to The Story Continues: Announcing Version 14 of Wolfram Language and Mathematica" > <img width="128" height="108" src="https://content.wolfram.com/sites/43/2024/01/swblog-v14.0-icon.png" class="lazy wp-post-image" alt="" title="" /> </a> </div> <div class="sidebar_post"> <p><a href="https://writings.stephenwolfram.com/2024/01/the-story-continues-announcing-version-14-of-wolfram-language-and-mathematica/" rel="bookmark" title="Permanent Link to The Story Continues: Announcing Version 14 of Wolfram Language and Mathematica" >The Story Continues: Announcing Version 14 of Wolfram Language and Mathematica</a></p> <p><time datetime="2024-01-09">January 9, 2024</time></p> </div> </div> <div class="sidebar_post_wrapper"> <div class="sidebar_thumbnail"> <a href="https://writings.stephenwolfram.com/2023/10/how-to-think-computationally-about-ai-the-universe-and-everything/" rel="bookmark" title="Permanent Link to How to Think Computationally about AI, the Universe and Everything" > <img width="128" height="108" src="https://content.wolfram.com/sites/43/2023/10/icon-sw-ted-2023.png" class="lazy wp-post-image" alt="" title="" /> </a> </div> <div class="sidebar_post"> <p><a href="https://writings.stephenwolfram.com/2023/10/how-to-think-computationally-about-ai-the-universe-and-everything/" rel="bookmark" title="Permanent Link to How to Think Computationally about AI, the Universe and Everything" >How to Think Computationally about AI, the Universe and Everything</a></p> <p><time datetime="2023-10-27">October 27, 2023</time></p> </div> </div> <div class="sidebar_post_wrapper"> <div class="sidebar_thumbnail"> <a href="https://writings.stephenwolfram.com/2023/09/expression-evaluation-and-fundamental-physics/" rel="bookmark" title="Permanent Link to Expression Evaluation and Fundamental Physics" > <img width="128" height="108" src="https://content.wolfram.com/sites/43/2023/09/multicomp-icon.png" class="lazy wp-post-image" alt="" title="" /> </a> </div> <div class="sidebar_post"> <p><a href="https://writings.stephenwolfram.com/2023/09/expression-evaluation-and-fundamental-physics/" rel="bookmark" title="Permanent Link to Expression Evaluation and Fundamental Physics" >Expression Evaluation and Fundamental Physics</a></p> <p><time datetime="2023-09-29">September 29, 2023</time></p> </div> </div> </div> </article> </div> <div id="sidebar"> <form class="headerSearchBox" method="get" action="https://writings.stephenwolfram.com/" id="search"> <input class="searchboxsub" type="text" value="" name="s" id="query_1" placeholder="Search Writings" /> <input type="submit" class="headerSearchSubmit" value="" title="Search"> </form> <div class="sidebar-pod related-writings"></div> <div class="sidebar-pod recent-writings"> <p class="sidebar-heading">Recent Writings</p> <div class="sidebar-inner"> <div id="postContainer"> <div class="sidebar_post_wrapper"> <div class="sidebar_thumbnail"><a href="https://writings.stephenwolfram.com/2024/10/on-the-nature-of-time/" rel="bookmark" title="Permanent Link to On the Nature of Time" ><img src="https://content.wolfram.com/sites/43/2024/10/swblog-time-icon-v2.png" alt=""></a></div> <div class="sidebar_post"> <p><a href="https://writings.stephenwolfram.com/2024/10/on-the-nature-of-time/" rel="bookmark" title="Permanent Link to On the Nature of Time" >On the Nature of Time</a></p> <p><time datetime="2024-10-08">October 8, 2024</time></p> </div> </div> <div class="sidebar_post_wrapper"> <div class="sidebar_thumbnail"><a href="https://writings.stephenwolfram.com/2024/09/nestedly-recursive-functions/" rel="bookmark" title="Permanent Link to Nestedly Recursive Functions" ><img src="https://content.wolfram.com/sites/43/2024/09/swblog-recursive-icon.png" alt=""></a></div> <div class="sidebar_post"> <p><a href="https://writings.stephenwolfram.com/2024/09/nestedly-recursive-functions/" rel="bookmark" title="Permanent Link to Nestedly Recursive Functions" >Nestedly Recursive Functions</a></p> <p><time datetime="2024-09-27">September 27, 2024</time></p> </div> </div> <div class="sidebar_post_wrapper"> <div class="sidebar_thumbnail"><a href="https://writings.stephenwolfram.com/2024/08/five-most-productive-years-what-happened-and-whats-next/" rel="bookmark" title="Permanent Link to Five Most Productive Years: What Happened and What’s Next" ><img src="https://content.wolfram.com/sites/43/2024/08/swblog-5years-icon.png" alt=""></a></div> <div class="sidebar_post"> <p><a href="https://writings.stephenwolfram.com/2024/08/five-most-productive-years-what-happened-and-whats-next/" rel="bookmark" title="Permanent Link to Five Most Productive Years: What Happened and What’s Next" >Five Most Productive Years: What Happened and What’s Next</a></p> <p><time datetime="2024-08-29">August 29, 2024</time></p> </div> </div> <div class="sidebar_post_wrapper"> <div class="sidebar_thumbnail"><a href="https://writings.stephenwolfram.com/2024/08/whats-really-going-on-in-machine-learning-some-minimal-models/" rel="bookmark" title="Permanent Link to What’s Really Going On in Machine Learning? Some Minimal Models" ><img src="https://content.wolfram.com/sites/43/2024/08/swblog-ml-icon-v2.png" alt=""></a></div> <div class="sidebar_post"> <p><a href="https://writings.stephenwolfram.com/2024/08/whats-really-going-on-in-machine-learning-some-minimal-models/" rel="bookmark" title="Permanent Link to What’s Really Going On in Machine Learning? Some Minimal Models" >What’s Really Going On in Machine Learning? Some Minimal Models</a></p> <p><time datetime="2024-08-22">August 22, 2024</time></p> </div> </div> <div class="sidebar_post_wrapper"> <div class="sidebar_thumbnail"><a href="https://writings.stephenwolfram.com/2024/07/yet-more-new-ideas-and-new-functions-launching-version-14-1-of-wolfram-language-mathematica/" rel="bookmark" title="Permanent Link to Yet More New Ideas and New Functions: Launching Version 14.1 of Wolfram Language & Mathematica" ><img src="https://content.wolfram.com/sites/43/2024/07/swblog-v14.1-icon.png" alt=""></a></div> <div class="sidebar_post"> <p><a href="https://writings.stephenwolfram.com/2024/07/yet-more-new-ideas-and-new-functions-launching-version-14-1-of-wolfram-language-mathematica/" rel="bookmark" title="Permanent Link to Yet More New Ideas and New Functions: Launching Version 14.1 of Wolfram Language & Mathematica" >Yet More New Ideas and New Functions: Launching Version 14.1 of Wolfram Language & Mathematica</a></p> <p><time datetime="2024-07-31">July 31, 2024</time></p> </div> </div> </div> </div> <a href="/all-by-date" class="all-by-date chevron-after">All by date</a> </div> <div class="sidebar-pod popular-categories"> <p class="sidebar-heading">Popular Categories</p> <div class="categories-list-row sidebar-inner"> <ul class="categories-list"> <li><a href="/category/artificial-intelligence">Artificial Intelligence</a></li><li><a href="/category/big-picture">Big Picture</a></li><li><a href="/category/companies-and-business">Companies & Business</a></li><li><a href="/category/computational-science">Computational Science</a></li><li><a href="/category/computational-thinking">Computational Thinking</a></li><li><a href="/category/data-science">Data Science</a></li><li><a href="/category/education">Education</a></li><li><a href="/category/future-perspectives">Future Perspectives</a></li><li><a href="/category/historical-perspectives">Historical Perspectives</a></li><li><a href="/category/language-and-communication">Language & Communication</a></li><li><a href="/category/life-and-times">Life & Times</a></li><li><a href="/category/life-science">Life Science</a></li><li><a href="/category/mathematica">Mathematica</a></li><li><a href="/category/mathematics">Mathematics</a></li><li><a href="/category/new-kind-of-science">New Kind of Science</a></li><li><a href="/category/new-technology">New Technology</a></li><li><a href="/category/personal-analytics">Personal Analytics</a></li><li><a href="/category/philosophy">Philosophy</a></li><li><a href="/category/physics">Physics</a></li><li><a href="/category/ruliology">Ruliology</a></li><li><a href="/category/software-design">Software Design</a></li><li><a href="/category/wolfram-alpha">Wolfram|Alpha</a></li><li><a href="/category/wolfram-language">Wolfram Language</a></li><li><a href="/category/other">Other</a></li> </ul> </div> </div> <div class="sidebar-pod writings-by-year"> <p class="sidebar-heading">Writings by Year</p> <div class="sidebar-archive sidebar-inner"> <ul> <li><a href="/all-by-date/#2024">2024</a></li><li><a href="/all-by-date/#2023">2023</a></li><li><a href="/all-by-date/#2022">2022</a></li><li><a href="/all-by-date/#2021">2021</a></li><li><a href="/all-by-date/#2020">2020</a></li><li><a href="/all-by-date/#2019">2019</a></li><li><a href="/all-by-date/#2018">2018</a></li><li><a href="/all-by-date/#2017">2017</a></li><li><a href="/all-by-date/#2016">2016</a></li><li><a href="/all-by-date/#2015">2015</a></li><li><a href="/all-by-date/#2014">2014</a></li><li><a href="/all-by-date/#2013">2013</a></li><li><a href="/all-by-date/#2012">2012</a></li><li><a href="/all-by-date/#2011">2011</a></li><li><a href="/all-by-date/#2010">2010</a></li><li><a href="/all-by-date/#2009">2009</a></li><li><a href="/all-by-date/#2008">2008</a></li><li><a href="/all-by-date/#2007">2007</a></li><li><a href="/all-by-date/#2006">2006</a></li><li><a href="/all-by-date/#2004">2004</a></li><li><a href="/all-by-date/#2003">2003</a></li> <li><a href="/all-by-date/">All</a></li> </ul> </div> </div> <span id="side-images"> <a href="https://www.amazon.com/Idea-Makers-Personal-Perspectives-Notable/dp/1579550037"><img src="https://content.wolfram.com/sites/43/2022/06/book-idea-makers-1.png" width="254" height="" alt=""/></a> </span> </div> </div><!-- end of "inner" --> <footer id="footer"> <div class="inner"> © Stephen Wolfram, LLC <span class="footer-sep">|</span> Open content: <a href="//creativecommons.org/licenses/by-sa/4.0/" target="_blank"> <svg id="icon-cc-by-sa" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 110 32"> <g transform="translate(76 0)"> <path d="M15.7,0.9c4.2,0,7.7,1.5,10.7,4.4c2.9,2.9,4.4,6.4,4.4,10.6c0,4.2-1.4,7.7-4.3,10.6c-3,3-6.6,4.4-10.7,4.4 c-4.1,0-7.6-1.5-10.6-4.4C2.2,23.5,0.7,20,0.7,15.9c0-4.1,1.5-7.6,4.4-10.6C8.1,2.3,11.6,0.9,15.7,0.9z M15.8,3.6 c-3.4,0-6.3,1.2-8.7,3.6c-2.4,2.5-3.7,5.4-3.7,8.7c0,3.3,1.2,6.2,3.6,8.6c2.4,2.4,5.3,3.6,8.7,3.6c3.3,0,6.2-1.2,8.7-3.7 c2.4-2.3,3.5-5.2,3.5-8.6c0-3.4-1.2-6.3-3.6-8.7C22.1,4.8,19.2,3.6,15.8,3.6z M9.1,13.8c0.3-1.8,1-3.3,2.2-4.3 c1.2-1,2.7-1.5,4.4-1.5c2.4,0,4.2,0.8,5.6,2.3s2.1,3.5,2.1,5.8c0,2.3-0.7,4.2-2.2,5.7c-1.4,1.5-3.3,2.3-5.6,2.3 c-1.7,0-3.2-0.5-4.4-1.5c-1.2-1-2-2.5-2.2-4.3h3.8c0.1,1.8,1.2,2.7,3.3,2.7c1.1,0,1.9-0.5,2.5-1.4c0.6-0.9,1-2.1,1-3.6 c0-1.6-0.3-2.8-0.9-3.6c-0.6-0.8-1.4-1.2-2.5-1.2c-2,0-3.1,0.9-3.4,2.7h1.1l-3,3l-3-3L9.1,13.8L9.1,13.8z" fill="currentColor"></path> </g> <g transform="translate(5 0)"> <path d="M59.4,5.2c-2.9-2.9-6.4-4.3-10.7-4.3c-4.1,0-7.7,1.4-10.6,4.3c-2.9,3-4.4,6.6-4.4,10.7s1.5,7.6,4.4,10.6 c3,2.9,6.5,4.4,10.6,4.4c4.1,0,7.7-1.5,10.7-4.5c2.9-2.8,4.3-6.3,4.3-10.5C63.7,11.7,62.3,8.1,59.4,5.2z M57.5,24.5 c-2.5,2.4-5.4,3.7-8.7,3.7c-3.4,0-6.2-1.2-8.7-3.6c-2.4-2.4-3.6-5.3-3.6-8.6c0-3.3,1.2-6.2,3.7-8.7c2.4-2.4,5.2-3.6,8.7-3.6 c3.4,0,6.3,1.2,8.7,3.6c2.4,2.4,3.6,5.3,3.6,8.7C61.1,19.3,59.9,22.2,57.5,24.5z" fill="currentColor"></path> <path d="M46.7,8.3c0-1.4,0.7-2.1,2.1-2.1s2.1,0.7,2.1,2.1c0,1.4-0.7,2.1-2.1,2.1C47.3,10.4,46.7,9.7,46.7,8.3z" fill="currentColor"></path> <path d="M52.8,18.3h-1.7v7.3h-4.7v-7.3h-1.7c0,0,0-4.1,0-6.1c0-0.6,0.4-1,1-1c2,0,4,0,6,0c0.6,0,1,0.4,1,1 C52.8,14.2,52.8,18.3,52.8,18.3z" fill="currentColor"></path> </g> <g id="cc-logo"> <path d="M15.7,0.9c4.2,0,7.8,1.5,10.7,4.4c1.4,1.4,2.5,3,3.2,4.8c0.7,1.8,1.1,3.7,1.1,5.8c0,2.1-0.4,4-1.1,5.8 c-0.7,1.8-1.8,3.4-3.2,4.8c-1.4,1.4-3.1,2.6-5,3.3c-1.8,0.8-3.8,1.2-5.8,1.2c-2,0-3.9-0.4-5.7-1.1c-1.8-0.8-3.5-1.9-4.9-3.3 c-1.4-1.4-2.5-3.1-3.3-4.9c-0.8-1.8-1.1-3.7-1.1-5.7c0-2,0.4-3.9,1.1-5.7c0.8-1.8,1.9-3.5,3.3-4.9C8,2.3,11.6,0.9,15.7,0.9z M15.8,3.6c-3.4,0-6.3,1.2-8.7,3.6C6,8.3,5,9.7,4.4,11.2c-0.6,1.5-1,3.1-0.9,4.7c0,1.6,0.3,3.2,0.9,4.6C5,22,6,23.4,7.1,24.5 c1.1,1.1,2.5,2.1,4,2.7c1.5,0.6,3,0.9,4.7,0.9c1.6,0,3.2-0.3,4.7-0.9c1.5-0.6,2.9-1.6,4.1-2.7c2.3-2.3,3.5-5.2,3.5-8.6 c0-1.7-0.3-3.2-0.9-4.7c-0.6-1.5-1.5-2.8-2.7-4C22.1,4.8,19.2,3.6,15.8,3.6z M15.6,13.4l-2,1c-0.2-0.4-0.5-0.8-0.8-0.9 c-0.3-0.2-0.6-0.3-0.9-0.3c-1.3,0-2,0.9-2,2.7c0,0.8,0.2,1.4,0.5,1.9c0.3,0.5,0.8,0.7,1.5,0.7c0.9,0,1.5-0.4,1.9-1.3l1.8,0.9 c-0.4,0.7-0.9,1.3-1.6,1.7c-0.7,0.4-1.5,0.6-2.3,0.6c-1.3,0-2.4-0.4-3.2-1.2c-0.8-0.8-1.2-2-1.2-3.4c0-1.4,0.4-2.6,1.2-3.4 c0.8-0.8,1.9-1.3,3.1-1.3C13.4,11.2,14.8,11.9,15.6,13.4L15.6,13.4z M24.2,13.4l-2,1c-0.2-0.4-0.5-0.8-0.8-0.9 c-0.3-0.2-0.6-0.3-0.9-0.3c-1.3,0-2,0.9-2,2.7c0,0.8,0.2,1.4,0.5,1.9c0.3,0.5,0.8,0.7,1.5,0.7c0.9,0,1.5-0.4,1.8-1.3l1.9,0.9 c-0.4,0.7-1,1.3-1.7,1.7c-0.7,0.4-1.5,0.6-2.3,0.6c-1.4,0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-2-1.2-3.4c0-1.4,0.4-2.6,1.2-3.4 c0.8-0.8,1.9-1.3,3.1-1.3C22.1,11.2,23.4,11.9,24.2,13.4L24.2,13.4z" fill="currentColor"></path> </g> </svg> </a> (code: <a href="//creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank"> <svg id="icon-cc-by-nc-sa" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 146 32"> <g transform="translate(5 0)"> <path d="M59.4,5.2C56.5,2.3,53,0.9,48.7,0.9c-4.1,0-7.7,1.4-10.6,4.3c-2.9,3-4.4,6.6-4.4,10.7s1.5,7.6,4.4,10.6 c3,2.9,6.5,4.4,10.6,4.4s7.7-1.5,10.7-4.5c2.9-2.8,4.3-6.3,4.3-10.5C63.7,11.7,62.3,8.1,59.4,5.2z M57.5,24.5 c-2.5,2.4-5.4,3.7-8.7,3.7c-3.4,0-6.2-1.2-8.7-3.6c-2.4-2.4-3.6-5.3-3.6-8.6s1.2-6.2,3.7-8.7c2.4-2.4,5.2-3.6,8.7-3.6 c3.4,0,6.3,1.2,8.7,3.6s3.6,5.3,3.6,8.7C61.1,19.3,59.9,22.2,57.5,24.5z" fill="currentColor"></path> <path d="M46.7,8.3c0-1.4,0.7-2.1,2.1-2.1s2.1,0.7,2.1,2.1s-0.7,2.1-2.1,2.1C47.3,10.4,46.7,9.7,46.7,8.3z" fill="currentColor"></path> <path d="M52.8,18.3h-1.7v7.3h-4.7v-7.3h-1.7c0,0,0-4.1,0-6.1c0-0.6,0.4-1,1-1c2,0,4,0,6,0c0.6,0,1,0.4,1,1 C52.8,14.2,52.8,18.3,52.8,18.3z" fill="currentColor"></path> </g> <g transform="translate(76 0)"> <path d="M53.9,0.9c4.2,0,7.7,1.5,10.7,4.4c2.9,2.9,4.4,6.4,4.4,10.6s-1.4,7.7-4.3,10.6c-3,3-6.6,4.4-10.7,4.4s-7.6-1.5-10.6-4.4 c-3-3-4.5-6.5-4.5-10.6s1.5-7.6,4.4-10.6C46.3,2.3,49.8,0.9,53.9,0.9z M54,3.6c-3.4,0-6.3,1.2-8.7,3.6c-2.4,2.5-3.7,5.4-3.7,8.7 s1.2,6.2,3.6,8.6c2.4,2.4,5.3,3.6,8.7,3.6c3.3,0,6.2-1.2,8.7-3.7c2.4-2.3,3.5-5.2,3.5-8.6s-1.2-6.3-3.6-8.7 C60.3,4.8,57.4,3.6,54,3.6z M47.3,13.8c0.3-1.8,1-3.3,2.2-4.3S52.2,8,53.9,8c2.4,0,4.2,0.8,5.6,2.3c1.4,1.5,2.1,3.5,2.1,5.8 s-0.7,4.2-2.2,5.7c-1.4,1.5-3.3,2.3-5.6,2.3c-1.7,0-3.2-0.5-4.4-1.5c-1.2-1-2-2.5-2.2-4.3H51c0.1,1.8,1.2,2.7,3.3,2.7 c1.1,0,1.9-0.5,2.5-1.4c0.6-0.9,1-2.1,1-3.6c0-1.6-0.3-2.8-0.9-3.6c-0.6-0.8-1.4-1.2-2.5-1.2c-2,0-3.1,0.9-3.4,2.7h1.1l-3,3l-3-3 L47.3,13.8L47.3,13.8z" fill="currentColor"></path> </g> <g id="cc-logo"> <path d="M15.7,0.9c4.2,0,7.8,1.5,10.7,4.4c1.4,1.4,2.5,3,3.2,4.8s1.1,3.7,1.1,5.8s-0.4,4-1.1,5.8s-1.8,3.4-3.2,4.8 c-1.4,1.4-3.1,2.6-5,3.3c-1.8,0.8-3.8,1.2-5.8,1.2s-3.9-0.4-5.7-1.1C8.1,29.1,6.4,28,5,26.6s-2.5-3.1-3.3-4.9S0.6,18,0.6,16 s0.4-3.9,1.1-5.7C2.5,8.5,3.6,6.8,5,5.4C8,2.3,11.6,0.9,15.7,0.9z M15.8,3.6c-3.4,0-6.3,1.2-8.7,3.6C6,8.3,5,9.7,4.4,11.2 s-1,3.1-0.9,4.7c0,1.6,0.3,3.2,0.9,4.6C5,22,6,23.4,7.1,24.5s2.5,2.1,4,2.7s3,0.9,4.7,0.9c1.6,0,3.2-0.3,4.7-0.9s2.9-1.6,4.1-2.7 c2.3-2.3,3.5-5.2,3.5-8.6c0-1.7-0.3-3.2-0.9-4.7s-1.5-2.8-2.7-4C22.1,4.8,19.2,3.6,15.8,3.6z M15.6,13.4l-2,1 c-0.2-0.4-0.5-0.8-0.8-0.9c-0.3-0.2-0.6-0.3-0.9-0.3c-1.3,0-2,0.9-2,2.7c0,0.8,0.2,1.4,0.5,1.9s0.8,0.7,1.5,0.7 c0.9,0,1.5-0.4,1.9-1.3l1.8,0.9c-0.4,0.7-0.9,1.3-1.6,1.7c-0.7,0.4-1.5,0.6-2.3,0.6c-1.3,0-2.4-0.4-3.2-1.2c-0.8-0.8-1.2-2-1.2-3.4 s0.4-2.6,1.2-3.4c0.8-0.8,1.9-1.3,3.1-1.3C13.4,11.2,14.8,11.9,15.6,13.4L15.6,13.4z M24.2,13.4l-2,1c-0.2-0.4-0.5-0.8-0.8-0.9 c-0.3-0.2-0.6-0.3-0.9-0.3c-1.3,0-2,0.9-2,2.7c0,0.8,0.2,1.4,0.5,1.9s0.8,0.7,1.5,0.7c0.9,0,1.5-0.4,1.8-1.3l1.9,0.9 c-0.4,0.7-1,1.3-1.7,1.7c-0.7,0.4-1.5,0.6-2.3,0.6c-1.4,0-2.4-0.4-3.3-1.2c-0.8-0.8-1.2-2-1.2-3.4s0.4-2.6,1.2-3.4 c0.8-0.8,1.9-1.3,3.1-1.3C22.1,11.2,23.4,11.9,24.2,13.4L24.2,13.4z" fill="currentColor"></path> </g> <g id="cc-nc"> <path d="M91.7,1c4.2,0,7.8,1.4,10.7,4.3c2.9,2.9,4.4,6.4,4.4,10.7c0,4.2-1.4,7.7-4.3,10.5c-3,3-6.6,4.5-10.7,4.5 c-4.1,0-7.6-1.5-10.6-4.4c-2.9-2.9-4.4-6.5-4.4-10.6c0-4.1,1.5-7.7,4.4-10.7C84.1,2.5,87.6,1,91.7,1z M80.1,12 c-0.4,1.2-0.7,2.6-0.7,4c0,3.3,1.2,6.2,3.6,8.6c2.4,2.4,5.3,3.6,8.7,3.6c3.4,0,6.3-1.2,8.7-3.7c0.9-0.8,1.6-1.7,2.1-2.6l-5.7-2.5 c-0.2,0.9-0.7,1.7-1.4,2.3c-0.8,0.6-1.7,0.9-2.7,1v2.3h-1.7v-2.3c-1.7,0-3.2-0.6-4.6-1.8l2.1-2.1c1,0.9,2.1,1.4,3.3,1.4 c0.5,0,1-0.1,1.3-0.3c0.4-0.2,0.5-0.6,0.5-1.2c0-0.4-0.1-0.7-0.4-0.9l-1.4-0.6l-1.8-0.8l-2.4-1C87.8,15.4,80.1,12,80.1,12z M91.8,3.7c-3.4,0-6.3,1.2-8.7,3.6c-0.6,0.6-1.1,1.3-1.7,2l5.7,2.6c0.2-0.8,0.7-1.4,1.4-1.9c0.7-0.5,1.5-0.7,2.4-0.8V6.9h1.7v2.3 c1.4,0.1,2.6,0.5,3.8,1.4l-2,2c-0.8-0.6-1.7-0.9-2.6-0.9c-0.5,0-0.9,0.1-1.2,0.3c-0.4,0.2-0.6,0.5-0.6,0.9c0,0.1,0,0.2,0.1,0.4 l1.9,0.9l1.3,0.6l2.4,1.1l7.7,3.4c0.2-1.1,0.4-2.1,0.4-3.2c0-3.4-1.2-6.3-3.6-8.7C98.1,4.9,95.2,3.7,91.8,3.7L91.8,3.7z" fill="currentColor"></path> </g> </svg> </a>) <a href="//en.wikipedia.org/wiki/Wikipedia:Citing_sources" target="_blank"> <svg id="icon-wiki" xmlns="http://www.w3.org/2000/svg" viewBox="101 0 44 32"> <g transform="translate(0 0)"> <path id="wikipedia" d="M129.6,4.5l0.3,0h0.5l0.2,0h0.4l0.2,0l0.5,0h0.2l0.1,0.1v0.7c0,0.2-0.1,0.3-0.3,0.3c-1.1,0-1.3,0.2-1.7,0.7 c-0.2,0.3-0.6,1-1.1,1.7l-3.7,7l-0.1,0.2l4.6,9.4l0.3,0.1l7.2-17.1c0.3-0.7,0.2-1.2-0.1-1.5c-0.3-0.3-0.6-0.4-1.4-0.5l-0.7,0 c-0.1,0-0.2,0-0.2-0.1c-0.1,0-0.1-0.1-0.1-0.2V4.6l0.1-0.1h8.1l0.1,0.1v0.7c0,0.2-0.1,0.3-0.3,0.3c-1.1,0-1.9,0.3-2.4,0.7 c-0.5,0.4-0.9,1-1.2,1.7c0,0-2.2,5-4.4,10.1l-0.4,0.9c-1.6,3.6-3.2,7.2-4.1,9.2c-0.9,1.7-1.7,1.5-2.5,0c-0.6-1.2-1.6-3.3-2.5-5.5 l-0.7-1.4c-0.4-0.8-0.8-1.7-1.1-2.4c-1.5,3.2-3.6,7.4-4.7,9.4c-1,1.8-1.8,1.5-2.5,0c-2.3-5.4-7-15-9.3-20.3c-0.4-1-0.7-1.6-1-1.9 c-0.3-0.2-0.9-0.4-1.8-0.4c-0.3,0-0.5-0.1-0.5-0.3V4.6l0.1-0.1l0.8,0h1.4l1.4,0h0.4l2.5,0h0.3l1.3,0h0.8l0.1,0.1v0.7 c0,0.2-0.1,0.3-0.4,0.3l-0.9,0c-0.8,0-1.2,0.3-1.2,0.7c0,0.2,0.1,0.5,0.3,1c1.8,4.3,7.9,17.3,7.9,17.2l0.2,0.1l3.9-7.9 c-0.5-1.1-0.8-1.7-0.8-1.7L119,9.6c0,0-0.5-1.1-0.7-1.4c-1.2-2.4-1.2-2.5-2.4-2.6c-0.3,0-0.5-0.1-0.5-0.3V4.6l0.1-0.1h1l2.1,0h3.9 l0.2,0.1v0.7c0,0.2-0.1,0.3-0.4,0.3l-0.5,0.1c-1.3,0.1-1.1,0.6-0.2,2.3l2.6,5.3l2.9-5.7c0.5-1,0.4-1.3,0.2-1.5l0,0 c-0.1-0.1-0.5-0.4-1.3-0.4l-0.3,0c-0.1,0-0.2,0-0.2-0.1c-0.1,0-0.1-0.1-0.1-0.2V4.6l0.1-0.1l1.2,0H129.6z" fill="currentColor"></path> </g> </svg> </a> <span class="footer-sep">|</span> <a href="/terms" target="_blank">Terms</a> <span class="footer-sep">|</span> <a href="/feed/" target="_blank">RSS</a> </div> </footer></div><!-- end of "outerWrap" --> <script type='text/javascript' src='https://writings.stephenwolfram.com/wp-content/plugins/akismet/_inc/form.js?ver=3.2'></script> <script type='text/javascript' src='https://writings.stephenwolfram.com/wp-includes/js/comment-reply.min.js?ver=4.7.2'></script> <script type='text/javascript' src='https://writings.stephenwolfram.com/wp-includes/js/wp-embed.min.js?ver=4.7.2'></script> <!--noscript.en.html--> <style> #_noscript, #_noscript * { box-sizing: border-box; margin: 0; outline: 0; padding: 0; z-index: 99999999999; } #_noscript { background: #fff6aa; border-bottom: 1px solid #eeca48; bottom: 0; color: #4c4c4c; display: block; font-size: .875rem; font-style: italic; left: 0; min-width: 320px; position: fixed; right: 0; width: 100%; z-index: 99999998 !important; /* place it beneath the global header */ } #_noscript > div { align-items: center; display: grid; gap: .5rem; grid-template-columns: 28px auto; height: 40px; justify-content: center; margin: 0 1rem; } #_noscript svg { display: inline-block; height: 25px; vertical-align: middle; width: 28px; } #_noscript a { color: #222; font-style: normal; text-decoration: none; } #_noscript a:hover { color: #ef621a; } </style> <noscript id="_noscript" class="gl-noscript-standalone remove__ready"> <div> <div><svg class="_noscript-warning"><use href="#_noscript-warning"></use></svg></div> <div>Enable JavaScript to interact with content and submit forms on Wolfram websites. <a href="http://www.enable-javascript.com/" target="_blank" data-walid="GUIFooter">Learn how »</a></div> </div> </noscript> <div style="height: 0; width: 0; position: absolute; visibility: hidden; top: -999999999999px;"> <svg xmlns="http://www.w3.org/2000/svg"> <g id="_noscript-icons"> <symbol id="_noscript-warning" viewBox="0 0 28.21 25"> <path d="M27.91,21.7L16.01,1.1c-.84-1.47-2.96-1.47-3.81,0L.3,21.7c-.85,1.47,.21,3.3,1.9,3.3H26c1.69,0,2.75-1.83,1.91-3.3ZM15.75,7.44l-.46,9.42h-2.37l-.48-9.42h3.31Zm-1.65,14.25c-1.12,0-1.87-.81-1.87-1.89s.77-1.89,1.87-1.89,1.83,.79,1.85,1.89c0,1.08-.73,1.89-1.85,1.89Z" fill="#f47821"/> <polygon points="15.77 7.47 15.31 16.89 12.94 16.89 12.46 7.47 15.77 7.47" fill="#fff"/> <path d="M14.1,21.69c-1.12,0-1.87-.81-1.87-1.89s.77-1.89,1.87-1.89,1.83,.79,1.85,1.89c0,1.08-.73,1.89-1.85,1.89Z" fill="#fff"/> </symbol> </g> </svg> </div> <!--/noscript.en.html--> <script>var baselang = '';</script> <script src="https://writings.stephenwolfram.com/wp-content/themes/sw-writings/clipboard.js"></script> <script src="/common/js/clipboard/2.0/clipboard.js"></script> <script src="/common/js/c2c/1.0/WolframC2C.js"></script> <script src="/common/js/c2c/1.0/WolframC2CGui.js"></script> <script src="/common/js/c2c/1.0/WolframC2CDefault.js"></script> <link rel="stylesheet" href="/common/js/c2c/1.0/WolframC2CGui.css.en"> <script> let c2cWrittings = new WolframC2CDefault({'triggerClass':'writtings-c2c_above', 'uniqueIdPrefix': 'writtings-c2c_above-'}); </script><script type="text/javascript"> if ( location.hash!="" && Number.isInteger( Number( location.hash.substring(1) ) ) ) { var jumplink = Number( location.hash.substring(1) ) - 1; document.getElementsByClassName('InCell')[jumplink].scrollIntoView(true); } </script> <!-- begin framework footer en --> <div id ="IPstripe-wrap"></div> <script src="/common/stripe/stripe.en.js"></script> <!-- end framework footer en --> </body> </html>