„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Sveiki, Habr! Jūsų dėmesiui pristatau Stepheno Wolframo įrašo vertimą „Wolfram Function Repository: atviros platformos paleidimas Wolfram kalbos išplėtimui“.

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Būtinos sąlygos Wolfram kalbos nuoseklumui

Šiandien kartu su programavimo kalba stovime ant didelių pasiekimų slenksčio Volframo kalba. Vos prieš tris savaites pradėjome nemokamas Wolfram variklis kūrėjamspadėti mūsų vartotojams integruoti Wolfram kalbą į savo didelio masto programinės įrangos projektus. Šiandien startuojame Wolfram funkcijų saugykla, siekdami suteikti koordinuotą platformą funkcijoms, sukurtoms išplėsti Wolfram kalbą, taip pat atidarome funkcijų saugyklą visiems, kurie gali prisidėti prie mūsų programinės įrangos produkto kūrimo.

„Wolfram Function Repository“ tapo įmanoma dėl unikalios Wolfram kalbos prigimties ne tik kaip programavimo kalbos, bet ir kaip pilno masto skaičiavimo kalba. Įprastose programavimo kalbose, pridedant reikšmingų naujų funkcijų, paprastai reikia sukurti visas papildomas bibliotekas, kurios gali veikti arba neveikti, kai naudojamos kartu. Tačiau Volframo kalba tiek daug jau įdėta pačioje kalboje, kad galima žymiai išplėsti jos funkcionalumą tiesiog pridedant naujų funkcijų, kurios iš karto integruojamos į holistinę visos kalbos struktūrą.

Pavyzdžiui, Wolfram funkcijų saugykloje jau yra 532 naujos funkcijos suskirstyti į 26 temines kategorijas:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Taip pat daugiau nei 6000 standartinių funkcijų, integruota į Wolfram kalbą, kiekviena saugyklos funkcija turi dokumentacijos puslapį su išsamiu jų aprašymu ir darbo pavyzdžiais:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Norėdami patekti į puslapį, nukopijuokite aukščiau esantį objektą (funkcija BLOB), įklijuokite jį į įvesties eilutę ir paleiskite funkciją – ji jau integruota į Wolfram kalbą ir palaikoma pagal numatytuosius nustatymus, pradedant nuo 12.0 versija:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Čia reikėtų pažymėti, kad apdorojant Logotipas QRCode Pavyzdžiui, jums nereikia nustatyti „vaizdų apdorojimo bibliotekos“, nes mes jau įdiegėme nuoseklų ir kruopščiai algoritminį būdą Wolfram kalboje. vaizdo apdorojimas, kurią galima nedelsiant apdoroti įvairiomis grafinėmis kalbos funkcijomis:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Tikiuosi, kad su parama nuostabi ir talentinga bendruomenė, kuri per pastaruosius kelis dešimtmečius augo ir plečiasi (remiantis Volframo kalba). „Wolfram“ funkcijų saugykla leis artimiausioje ateityje žymiai išplėsti kalboje prieinamų (galimai reikšmingų, specializuotų įvairiose mokslo ir technologijų srityse) funkcijų spektrą. Taigi atsiranda galimybė naudoti tiek kalbos turinį (jos įtaisytąsias funkcijas), tiek plėtros principus, kurios įgyvendinamos pagal kalbą. (Čia reikia pažymėti, kad Wolfram kalba jau turi daugiau nei 30 metų vystymosi ir stabilaus augimo istorija).
Funkcijose iš saugyklos gali būti mažų arba didelių kodo dalių, parašytų Wolfram kalba. Pavyzdžiui, tai gali būti skambučiai išorinės API ir paslaugos arba išorinės bibliotekos kitomis kalbomis. Unikali šio metodo ypatybė yra ta, kad kai įsigilinsite į vartotojo lygio funkcijas, nebus galimų neatitikimų, nes metodas yra sukurtas ant nuoseklios Wolfram kalbos struktūros – ir kiekviena funkcija veiks automatiškai tinkamai – tiksliai taip, kaip skirta.ji turėtų.
„Wolfram Feature Repository“ apvalkalas ir programavimo struktūra yra sukurti taip, kad kiekvienas galėtų prisidėti prie bendro reikalo paprasčiausiu ir jam patogiausiu būdu – iš tikrųjų tiesiog užpildydami užrašų knygelės tekstinį failą (su plėtiniu nb) WL. Integruotos automatinės funkcijos leidžia patikrinti naujas funkcijas, įtrauktas į saugyklą, kad būtų užtikrintas jų integravimas į kalbą. Mūsų įmonė lažinasi dėl plataus vartotojų rato, galinčio integruoti savo funkcijas į kalbą, o ne dėl didelio naujų funkcijų sudėtingumo – ir nors yra peržiūros procesas, mes nereikalaujame nieko panašaus. kruopšti dizaino analizė arba griežtus naujų naudotojo funkcijų išsamumo ir patikimumo standartus, o ne griežtesnį funkcijų, įmontuotų į pagrindinę kalbą, kurią naudojame, testavimą.

Šiame požiūryje yra daug kompromisų ir detalių, tačiau mūsų tikslas yra optimizuoti „Wolfram“ funkcijų saugyklą, kad būtų patogiau vartotojas, ir užtikrinti, kad naujos vartotojo funkcijos reikšmingai prisidėtų prie kalbos kūrimo. Neabejoju, kad mums augant teks išrasti naujus saugykloje įmontuotų funkcijų apdorojimo ir patvirtinimo metodus, taip pat norint organizuoti daugybę funkcijų ir surasti tas, kurių reikia vartotojams. Tačiau džiugina tai, kad mūsų pasirinktas kelias yra gera pradžia. as asmeniskai pridėjo keletą funkcijų į pradinę duomenų bazę. Daugelis jų yra pagrįsti kodu, kurį aš asmeniškai kūriau ilgą laiką. Ir man prireikė tik kelių minučių, kad nustumčiau juos į saugyklą. Dabar, kai jos yra saugykloje, pagaliau galiu – iš karto ir bet kada – naudotis šiomis funkcijomis pagal poreikį, nesijaudindamas dėl failų paieškos, paketų atsisiuntimo ir pan.

Padidėjęs efektyvumas, tuo pačiu sumažinant išlaidas

Dar prieš internetą buvo būdų dalytis Wolfram kalbos kodu (mūsų pirmasis didelis centralizuotas projektas buvo MathSource, sukurta Mathematica 1991 m. remiantis CD-ROM ir kt.). Žinoma, siūlomas diegimo metodas, pagrįstas „Wolfram“ funkcijų saugykla, yra galingesnis ir patikimesnis įrankis aukščiau nurodytoms užduotims įgyvendinti.

Daugiau nei 30 metų mūsų įmonė uoliai dirbo, kad išlaikytų Wolfram kalbos struktūros vientisumą, o tai labai svarbu siekiant užtikrinti, kad Wolfram kalba taptų ne tik programavimo kalba, bet ir visavertė skaičiavimo kalba. Taigi, „Wolfram“ funkcijų saugyklos diegimo požiūrio esmė yra naudoti vieningą požiūrį į programavimą ir naujų funkcijų kūrimą, kurios yra nuosekliai įtraukiamos į kalbos sistemą, kad ji galėtų vystytis ir kartu vystytis.

Kiekvienos funkcijos įgyvendinimo struktūroje vyksta įvairūs skaičiavimo procesai. Pažymėtina, kad būtina, kad funkcija būtų aiški ir vienoda, o vartotojas skaito ją vizualiai. Šiame kontekste įtaisytosios Wolfram kalbos funkcijos pateikiamos su daugiau nei 6000 nuoseklių pavyzdžių, kaip tinkamai programuoti funkcijas (tai yra mūsų tiesioginiai programavimo vaizdo įrašaikurios apima šimtai valandų standartinių programų kūrimo proceso). Dėl šio požiūrio „Wolfram“ funkcijų saugykla gali veikti gerai, yra „Wolfram“ kalbos struktūrinis pobūdis su daugybe papildomų ir įvairių bibliotekų, kurios jau yra įtrauktos į kalbą. Pavyzdžiui, jei turite funkciją, kuri apdoroja vaizdus, ​​arba reti masyvaiArba molekulinės struktūrosIr geografinius duomenis ar kai kurie kiti – jų nuoseklus simbolinis atvaizdavimas jau egzistuoja kalboje, ir to dėka jūsų funkcija iš karto tampa suderinama su kitomis kalbos funkcijomis.

Sukurti saugyklą, kuri iš tikrųjų gerai veikia, yra įdomi metaprogramavimo užduotis. Pavyzdžiui, apribojimų perteklius programoje neleis gauti reikiamo algoritmo suvienodinimo ir universalumo. Kaip ir esant nepakankamam funkcinių apribojimų skaičiui, taip ir nepavyks įgyvendinti pakankamai teisingos algoritmo vykdymo sekos. Keli ankstesni šių požiūrių kompromiso įgyvendinimo pavyzdžiai, kuriuos įgyvendino mūsų įmonė, veikė gana stabiliai – šie: Projekto volframo demonstracijos, paleistas 2007 m. ir dabar veikia internete internete su daugiau nei 12000 XNUMX naudotojams skirtų interaktyvių demonstracinių versijų. IN Wolfram duomenų bazė yra daugiau nei 600 paruoštų duomenų bazių, kurias galima naudoti Wolfram kalba ir „Wolfram“ neuroninio tinklo saugykla beveik kas savaitę pasipildo naujais neuroniniais tinklais (jų dabar jau yra 118) ir per funkciją jie iš karto prijungiami NetModel Volframo kalba.

Visi minėti pavyzdžiai turi esminę savybę – projekte surinkti objektai ir funkcijos turi labai aukštą procesų struktūrizavimo ir paskirstymo laipsnį. Žinoma, demonstracinės versijos, neuroninio tinklo ar kažko kito struktūros detalės gali labai skirtis, tačiau pagrindinė bet kurios dabartinės saugyklos struktūra visada išlieka ta pati. Taigi, kokia jūsų nuomonė, gerbiamas naudotojau, apie tokios saugyklos sukūrimą, kuri prideda prie Wolfram kalbos plėtinių? „Wolfram“ kalba sukurta itin lanksti, todėl ją galima bet kokiu būdu išplėsti ir modifikuoti. Ši aplinkybė itin svarbi norint greitai sukurti įvairius didelio masto programinės įrangos projektus Wolfram kalba. Čia reikia pastebėti, kad didėjant kalbos lankstumui tokia kalba vykdomų projektų kaina neišvengiamai didės. Taip yra dėl to, kad kuo daugiau vartotojas naudoja tokią kalbą, tuo daugiau jam skirtų funkcijų jis gauna, tačiau nereikėtų pamiršti, kad toks požiūris gali turėti ir neigiamų pusių – nesugebėjimo užtikrinti nuoseklaus programos modulių nuoseklumo.

Yra dažna tradicinių programavimo kalbų bibliotekų problema – pavyzdžiui, jei naudojate vieną biblioteką, kodas veiks tinkamai, tačiau jei bandysite naudoti kelias bibliotekas, nėra garantijos, kad jos tinkamai sąveikaus viena su kita. . Be to, tradicinėse programavimo kalbose, skirtingai nei visavertėje skaičiavimo kalboje, nėra jokio būdo garantuoti nuoseklių integruotų bet kokių funkcijų ar duomenų tipų atvaizdų, išskyrus jų pagrindines struktūras. Tačiau iš tikrųjų problema yra dar didesnė, nei atrodo iš pirmo žvilgsnio: jei kuriama didelio masto funkcionalumo vertikalė, tai be didžiulių centralizuoto projektų programavimo išlaidų, kurias įdedame į Wolfram kalbą, neįmanoma. pasiekti nuoseklumą. Todėl svarbu, kad visi programinės įrangos moduliai visada tinkamai veiktų kartu.

Taigi „Wolfram“ funkcijų saugyklos idėja yra išvengti aukščiau aprašytos problemos, tiesiog pridedant plėtinius į kalbą santykinai mažose kodo dalyse naudojant atskiras funkcijas, kurias lengviau sukurti kaip nuoseklius modulius. Be to, yra programavimo funkcijų, kurių neįmanoma padaryti patogiai naudojant atskiras funkcijas (ir artimiausiu metu mūsų įmonė planuoja išleisti optimizuotą programavimo algoritmą, padėsiantį diegti didelės apimties programinės įrangos paketus). Tačiau remiantis „Wolfram“ kalboje jau įdiegtomis funkcijomis, yra daug programavimo galimybių, kurios įgyvendinamos atsižvelgiant į atskiras funkcijas. Idėja yra ta, kad su palyginti nedidelėmis programavimo pastangomis galima sukurti daugybę naujų ir labai naudingų funkcijų, kurios užtikrins pakankamą dizaino darną, jos bus gerai derinamos viena su kita, be to, jos ateityje galės lengvai ir plačiai vartoti kalboje.

Šis požiūris, žinoma, yra kompromisas. Jei būtų įdiegtas didesnis paketas, būtų galima įsivaizduoti visiškai naują funkcionalumo pasaulį, kuris būtų itin galingas ir naudingas. Jei reikia įsigyti naujų funkcijų, kurios derėtų prie viso kito, bet nenorite skirti daug pastangų projekto plėtrai, tai, deja, gali sumažinti jūsų projekto apimtį. „Wolfram“ funkcijų saugyklos idėja yra suteikti funkcionalumą apibrėžtai projekto daliai; šis metodas pridės galingų funkcijų ir palengvins programavimo projekto nuoseklumą.

Padėkite pridėti pasirinktines funkcijas į funkcijų saugyklą

Mūsų komanda sunkiai dirbo, kad naudotojai galėtų lengvai prisidėti prie „Wolfram“ saugyklos funkcijų. Darbalaukyje (jau yra 12.0 versija), galite tiesiog eiti per pagrindinio meniu skirtukus nuosekliai: Failas > Naujas > Saugyklos elementas > Funkcijų saugyklos elementas ir gausite "Apibrėžčių užrašų knygelė" (programiškai darbo stalo viduje. Taip pat galite naudoti analoginę funkciją - Sukurti užrašų knygelę["Funkcijų šaltinis"]):

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Turite atlikti du pagrindinius veiksmus: pirma, iš tikrųjų užsirašykite savo funkcijos kodą ir, antra, užsirašykite dokumentus, iliustruojančius, kaip jūsų funkcija turėtų veikti.
Spustelėkite viršuje esantį mygtuką „Atidaryti pavyzdį“, kad pamatytumėte pavyzdį, ką reikia padaryti:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Iš esmės jūs bandote sukurti kažką panašaus į įtaisytąją Wolfram kalbos funkciją. Išskyrus tai, kad jis gali atlikti kažką daug konkretesnio nei įmontuota funkcija. Tuo pačiu metu lūkesčiai dėl jo išsamumo ir patikimumo bus daug mažesni.
Turite suteikti savo funkcijai pavadinimą, atitinkantį Wolfram kalbos funkcijų pavadinimo gaires. Be to, turėsite parengti savo funkcijos dokumentaciją, panašią į įtaisytąsias kalbos funkcijas. Apie tai plačiau pakalbėsiu vėliau. Kol kas tiesiog atkreipkite dėmesį, kad apibrėžimo bloknoto failo viršuje esančioje mygtukų eilutėje yra mygtukas "Stiliaus gairės", kuriame paaiškinama, ką daryti, ir mygtukas Įrankiai, kuriame pateikiami įrankiai, skirti formatuoti funkcijos dokumentaciją.
Įsitikinę, kad viskas užpildyta tinkamai ir esate pasiruošę, spustelėkite mygtuką „Tikrinti“. Visiškai normalu, kad dar nesuvokei visų smulkmenų. Taigi funkcija „Patikrinti“ veiks automatiškai ir atliks daugybę stiliaus ir nuoseklumo patikrų. Dažnai jis iš karto paragins patvirtinti ir priimti pataisymus (pvz.: „Ši eilutė turi baigtis dvitaškiu“ ir paragins įvesti dvitaškį). Kartais ji paprašys jūsų ką nors pridėti ar pakeisti. Nuolat papildysime automatinio mygtuko Tikrinti funkcionalumo naujomis funkcijomis, tačiau iš esmės jo tikslas yra užtikrinti, kad viskas, ką pateikiate į funkcijų saugyklą, jau tiksliai atitiktų kuo daugiau stiliaus gairių.

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Taigi, paleidę „Patikrinti“, galite naudoti „Peržiūra“. „Peržiūra“ sukuria dokumentacijos puslapio, kurį nustatėte savo funkcijai, peržiūrą. Taip pat galite sukurti kompiuteryje sukurto failo arba debesies saugykloje esančio failo peržiūrą. Jei dėl kokių nors priežasčių nesate patenkinti tuo, ką matote peržiūroje, tiesiog grįžkite ir atlikite reikiamus pataisymus, tada dar kartą spustelėkite mygtuką Peržiūra.
Dabar esate pasirengę perkelti savo funkciją į saugyklą. Mygtukas Deploy suteikia keturias parinktis:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Šiame žingsnyje svarbu, kad savo funkciją galėtumėte pateikti Wolfram funkcijų saugyklai, kad ji būtų prieinama visiems. Tuo pačiu metu savo funkciją taip pat galite pritaikyti ribotam vartotojų skaičiui. Pavyzdžiui, galite sukurti funkciją, kuri yra jūsų kompiuteryje, kad ji būtų pasiekiama, kai naudojate tą konkretų kompiuterį. Arba galite paskelbti jį savo debesies paskyra, kad jis būtų pasiekiamas, kai esate prisijungę prie debesies. Taip pat galite viešai priglobti (diegti) funkciją naudodami debesies paskyrą. Jis nebus centrinėje „Wolfram“ funkcijų saugykloje, bet galėsite suteikti kam nors URL, kuris leis jiems gauti jūsų funkciją iš jūsų paskyros. (Ateityje taip pat palaikysime centrines saugyklas visoje mūsų įmonėje.)

Tarkime, kad iš tikrųjų norite pateikti savo funkciją Wolfram funkcijų žinių bazei. Norėdami tai padaryti, spustelėkite mygtuką „Pateikti“ saugykloje. Taigi, kas tada vyksta šiuo metu? Jūsų paraiška nedelsiant yra eilėje, kad ją peržiūrėtų ir patvirtintų mūsų speciali kuratorių komanda.

Vykstant jūsų paraiškos patvirtinimo procesui (paprastai trunkantis kelias dienas), gausite pranešimus apie jos būseną ir galbūt pasiūlymus dėl naudojimo ateityje. Tačiau kai jūsų funkcija bus patvirtinta, ji bus nedelsiant paskelbta „Wolfram Feature Repository“ ir bus prieinama visiems. (Ir tai pasirodys naujienų santraukos apie naujas funkcijas ir tt)

Kas turėtų būti saugykloje?

Reikėtų pažymėti, kad mūsų įmonė turi labai aukštus išsamumo, patikimumo ir bendros kokybės standartus, o iš daugiau nei 6000 funkcijų, kurias per pastaruosius 30 ir daugiau metų jau įdiegėme į Wolfram kalbą, visos atitinka aukščiau nurodytus reikalavimus. „Wolfram Function Repository“ tikslas – panaudoti visą „Wolfram“ kalboje jau egzistuojančią struktūrą ir funkcionalumą, kad būtų galima pridėti kuo daugiau lengvesnių (ty didesnio našumo funkcijų) funkcijų.

Žinoma, funkcijos Wolfram funkcijų saugykloje turi atitikti Wolfram kalbos projektavimo principus – kad jos galėtų visiškai sąveikauti su kitomis funkcijomis ir vartotojų lūkesčiais, kaip funkcija turėtų tinkamai veikti. Tačiau funkcijos neturi būti vienodo išsamumo ar patikimumo.

Integruotose Wolfram kalbos funkcijose mes sunkiai dirbame, kad programavimo funkcijos būtų kuo bendresnės. Be to, kai Wolfram funkcijų saugykloje nėra nieko blogo, jei joje yra funkcija, kuri tiesiog tvarko labai specifinį, bet naudingą atvejį. Pavyzdžiui, funkcija SendMailFromNotebook gali gauti failus vienu konkrečiu formatu ir kurti paštą vienu konkrečiu būdu. Daugiakampė diagrama kuria diagramas tik su tam tikromis spalvomis ir ženklinimu ir pan.

Kitas dalykas, susijęs su įmontuotomis funkcijomis, yra tai, kad mūsų įmonė deda visas pastangas, kad sutvarkytų visus netipinius atvejus, teisingai tvarkytų neteisingą įvestį ir pan. Funkcijų saugykloje visiškai normalu, kad yra speciali funkcija, kuri tvarko pagrindinius problemos sprendimo atvejus ir nepaiso visų kitų.

Akivaizdu, kad geriau turėti funkcijas, kurios atlieka daugiau ir daro tai geriau, tačiau funkcijų saugyklos optimizavimas, priešingai nei integruotos Wolfram kalbos funkcijos, turėtų turėti daugiau funkcijų, sujungtų su daugiau funkcijų, o ne gilintis į kiekvienos konkrečios funkcijos įgyvendinimo procesus.

Dabar pažvelkime į funkcijų testavimo saugykloje pavyzdį. Natūralu, kad tokių funkcijų nuoseklumo lūkesčiai yra daug mažesni nei įtaisytųjų kalbos funkcijų. Tai ypač aktualu tais atvejais, kai funkcijos priklauso nuo išorinių išteklių, tokių kaip API, svarbu nuolat atlikti nuoseklius testus, kurie automatiškai vyksta tikrinimo algoritmuose. nb faile galite aiškiai nurodyti apibrėžimus (skiltyje Papildoma informacija) ir nurodyti tiek testų, kiek apibrėžia įvesties ir išvesties eilutės arba viso tipo simbolių objektai. Patvirtinimo testas, kiek jums atrodo tinkama. Be to, sistema nuolat bando jūsų pateiktus dokumentacijos pavyzdžius paversti tikrinimo procesu (o kartais tai gali pareikalauti gana daug resursų, pavyzdžiui, funkcijai, kurios rezultatas priklauso nuo atsitiktinių skaičių ar paros laiko).

Dėl to funkcijų saugykla turės daugybę įgyvendinimo sudėtingumo. Kai kurie iš jų bus tik viena kodo eilutė, kiti gali apimti tūkstančius ar dešimtis tūkstančių eilučių, greičiausiai naudojant daugybę pagalbinių funkcijų. Kada verta pridėti funkciją, kuriai apibrėžti reikia labai mažai kodo? Iš esmės, jei funkcija yra geras mnemoninis vardas, kurį vartotojai lengvai suprastų, jei pamatytų jį kodo dalyje, tada jį jau galima pridėti. Priešingu atveju tikriausiai geriau tiesiog iš naujo pridėti kodą prie programos kiekvieną kartą, kai jums reikia jį naudoti.

Pagrindinis funkcijų saugyklos tikslas (kaip rodo jos pavadinimas) yra įtraukti į kalbą naujų funkcijų. Jei norite pridėti naujų duomenų arba nauji subjektai, naudoti Wolfram duomenų saugykla. Bet ką daryti, jei savo skaičiavimams norite pristatyti naujų tipų objektus?

Tiesą sakant, yra du būdai. Galbūt norėsite pristatyti naują objekto tipą, kuris bus naudojamas naujose funkcijų saugyklose. Ir šiuo atveju visada galite tiesiog užsirašyti simbolinį jo vaizdą ir naudoti jį įvesdami arba išvesdami funkcijas funkcijų saugykloje.

Bet ką daryti, jei norite pavaizduoti objektą ir tada per esamas Wolfram kalbos funkcijas apibrėžti, kad norite su juo dirbti? Wolfram kalba visada turėjo lengvą mechanizmą, vadinamą UpValues. Su tam tikrais apribojimais (ypač funkcijoms, kurios negali įvertinti savo argumentų), funkcijų saugykla leidžia tiesiog pavaizduoti funkciją ir apibrėžti jos reikšmes. (Padidinti nuoseklumo lūkesčius kuriant naują pagrindinį dizainą, kuris yra visiškai integruotas į Wolfram kalbą, paprastai yra labai svarbi procedūra, kurios negalima pasiekti tiesiog padidinus projekto kainą ir tai daro mūsų įmonė kaip projektų dalis. ilgalaikiam kalbos vystymuisi ši užduotis nėra saugyklos plėtros tikslas).

Taigi, kas gali būti funkcijų kode funkcijų saugykloje? Viskas integruota į Wolfram kalbą, žinoma (bent jau jei tai neatspindi grasinimaisaugumas ir pačios programos, kaip skaičiavimo aplinkos, veikimą), taip pat bet kurią funkciją iš funkcijų saugyklos. Tačiau yra ir kitų funkcijų: funkcija funkcijų saugykloje gali iškviesti API arba į ją Volframo debesisArba iš kito šaltinio. Žinoma, su tuo susijusi tam tikra rizika. Dėl to, kad nėra garantijų, kad API nepasikeis, o funkcija funkcijų saugykloje nustos veikti. Kad būtų lengviau nustatyti tokias problemas, dokumentacijos puslapyje (skiltyje Reikalavimai) yra pastaba apie bet kurią funkciją, kuri remiasi ne tik įtaisytomis Wolfram kalbos funkcijomis. (Žinoma, kalbant apie tikrus duomenis, gali kilti problemų net su šiuo funkcionalumu – nes realaus pasaulio duomenys nuolat keičiasi, o kartais net jų apibrėžimai ir struktūra keičiasi.)

Ar visas Wolfram funkcijų saugyklos kodas turėtų būti parašytas Wolfram? Žinoma, kodas išorinėje API neturėtų būti parašytas Wolfram kalba, kuri net nesudaro kalbos kodo. Tiesą sakant, jei randate funkciją beveik bet kurioje išorinėje kalboje ar bibliotekoje, galite sukurti paketą, leidžiantį naudoti ją Wolfram funkcijų saugykloje. (Paprastai tam turėtumėte naudoti įtaisytąsias funkcijas Išorinis Įvertinkite arba Išorinė funkcija Wolfram kalbos kodu.)

Taigi kokia prasmė tai daryti? Iš esmės tai leidžia naudoti visą integruotą Wolfram Language sistemą ir visą jos vieningą programinės įrangos galimybių rinkinį. Jei bazinį diegimą gaunate iš išorinės bibliotekos ar kalbos, galite naudoti turtingą simbolinę Wolfram kalbos struktūrą, kad sukurtumėte patogią aukščiausio lygio funkciją, leidžiančią vartotojams lengvai naudotis bet kuria jau įdiegta funkcija. Bent jau tai turėtų būti įmanoma idealiame pasaulyje, kuriame egzistuoja visi bibliotekų įkėlimo blokai ir pan., tokiu atveju juos automatiškai tvarkytų Wolfram kalba. (Reikėtų pažymėti, kad praktikoje gali kilti problemų su išorinių kalbų nustatymas konkrečioje kompiuterinėje sistemoje ir debesies saugykla gali sukelti papildomų saugumo problemų).

Beje, pirmą kartą pažvelgus į įprastas išorines bibliotekas, jos dažnai atrodo per sudėtingos, kad jas būtų galima atlikti tik keliomis funkcijomis, tačiau daugeliu atvejų daug sudėtingumo kyla dėl infrastruktūros, reikalingos bibliotekai ir visoms funkcijoms, sukūrimas. palaikyti tai. Tačiau naudojant Wolfram kalbą, infrastruktūra paprastai jau yra integruota į paketus, todėl nereikia išsamiai atskleisti visų šių palaikymo funkcijų, o kurti funkcijas tik „aukščiausioms“ konkrečios programos funkcijoms bibliotekoje. .

Žinių bazės „ekosistema“.

Jei parašėte funkcijas, kurias naudojate reguliariai, pateikite jas į „Wolfram Function Repository“! Jei iš to (kalbos tobulinimas) neišeina kažkas daugiau, net ir tada jums bus daug patogiau naudotis funkcijomis asmeniniam naudojimui. Tačiau logiška manyti, kad jei funkcijomis naudositės reguliariai, galbūt jos bus naudingos ir kitiems vartotojams.

Natūralu, kad galite atsidurti tokioje situacijoje, kai negalite arba nenorite pasidalyti savo funkcijomis arba gauti prieigą prie privačių informacijos šaltinių. Net ir tokiais atvejais galite tiesiog įdiegti funkcijas savo debesies paskyroje, nurodant teises prieiga prie jų. (Jei jūsų organizacija turi „Wolfram Enterprise“ privatus debesis, tada netrukus ji galės priglobti savo privačią funkcijų saugyklą, kurią bus galima administruoti iš jūsų organizacijos ir nustatyti, ar trečiųjų šalių naudotojai privalo peržiūrėti rodinius, ar ne.)

Funkcijos, kurias pateikiate Wolfram funkcijų saugykloje, nebūtinai turi būti tobulos; jie tiesiog turi būti naudingi. Tai šiek tiek panašu į skyrių „Klaidos“ klasikinėje „Unix“ dokumentacijoje – „Apibrėžimų skiltyje“ yra skyrius „Autoriaus pastabos“, kuriame galite aprašyti apribojimus, problemas ir pan., kuriuos jau žinote apie savo funkciją. Be to, kai pateikiate savo funkciją saugykloje, galite pridėti pateikimo pastabų, kurias perskaitys speciali kuratorių komanda.

Kai funkcija paskelbiama, jos puslapio apačioje visada yra dvi nuorodos: "Siųsti žinutę apie šią funkciją"Ir"Diskutuokite Wolfram bendruomenėje“ Jei pridedate pastabą (pvz., papasakokite apie klaidas), galite pažymėti langelį, kuriame nurodoma, kad norite, kad jūsų žinutė ir kontaktinė informacija būtų bendrinama su funkcijos autoriumi.

Kartais tiesiog norite naudoti funkcijas iš Wolfram funkcijų saugyklos, pvz., integruotas funkcijas, nežiūrėdami į jų kodą. Tačiau, jei norite pažvelgti į vidų, viršuje visada yra užrašų knygelės mygtukas. Spustelėkite jį ir gausite savo originalaus apibrėžimo bloknoto, kuris buvo pateiktas į funkcijų saugyklą, kopiją. Kartais galite naudoti jį kaip pavyzdį savo poreikiams. Tuo pačiu metu taip pat galite sukurti savo šios funkcijos modifikaciją. Galbūt norėsite paskelbti šias funkcijas, kurias radote iš saugyklos savo kompiuteryje arba debesų saugyklos paskyroje, galbūt norite pateikti jas funkcijų žinių bazei, galbūt kaip patobulintą, išplėstą pradinės funkcijos versiją.

Ateityje planuojame palaikyti „Git“ stiliaus šakotį funkcijų saugyklose, tačiau kol kas stengiamės, kad tai būtų paprasta, ir visada turime tik vieną priimtiną kiekvienos funkcijos versiją, integruotą į kalbą. Dažniausiai (nebent kūrėjai atsisako prižiūrėti savo sukurtas funkcijas ir reaguoja į naudotojų pateiktus duomenis), pradinis funkcijos autorius perima jos atnaujinimų kontrolę ir pateikia naujas versijas, kurios vėliau peržiūrimos ir, jei jos praeina peržiūros procesą. , išleista kalba.

Panagrinėkime klausimą, kaip veikia sukurtų funkcijų „versija“. Šiuo metu, kai naudojate funkciją iš funkcijų saugyklos, jos apibrėžimas bus visam laikui saugomas jūsų kompiuteryje (arba debesies paskyroje, jei naudojate debesį). Jei yra nauja funkcijos versija, kitą kartą ją naudodami gausite apie tai pranešantį pranešimą. Ir jei norite atnaujinti funkciją į naują versiją, galite tai padaryti naudodami komandą ResourceUpdate. („Funkcijų dėmė“ iš tikrųjų saugo daugiau versijų nustatymo informacijos, todėl ateityje planuojame, kad tai būtų lengviau pasiekiama mūsų vartotojams.)

Vienas iš gražių „Wolfram Function Repository“ dalykų yra tai, kad bet kuri „Wolfram“ kalbos programa gali naudoti jos funkcijas. Jei programa atsiranda užrašų knygelėje, dažnai patogu suformatuoti saugyklos funkcijas kaip lengvai skaitomas „funkcijų dvejetainio objekto“ funkcijas (galbūt su atitinkamu versijų rinkiniu).

Naudodami tekstą visada galite pasiekti bet kurią funkcijų saugyklos funkciją ResourceFunction[...]. Ir tai labai patogu, jei, pavyzdžiui, rašote kodą ar scenarijus tiesiogiai „Wolfram Engine“. naudojant IDE arba teksto kodo rengyklę (Ypač reikėtų pažymėti, kad funkcijų saugykla yra visiškai suderinama su Nemokamas Wolfram variklis kūrėjams).

Kaip tai veikia?

„Wolfram“ saugyklos funkcijose tai įmanoma naudojant lygiai tą patį išteklių sistemos bazės, kaip ir visos kitos esamos saugyklos (duomenų saugykla, Neuroninio tinklo saugykla, demonstracinių projektų kolekcija ir tt), kaip ir visi kiti Wolfram sistemos ištekliai, ResourceFunction galiausiai pagrįsta funkcija ResourceObject.

Apsvarstyti ResourceFunction:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Viduje galite pamatyti tam tikrą informaciją naudodami funkciją informacija:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Kaip veikia išteklių funkcijos nustatymas? Paprasčiausias yra grynai vietinis atvejis. Štai pavyzdys, kuris paima funkciją (šiuo atveju tik gryną funkciją) ir apibrėžia ją kaip tam tikros programos seanso išteklių funkciją:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Sudarę apibrėžimą, galite naudoti išteklių funkciją:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

Atminkite, kad šioje funkcijų dėmėje yra juoda piktograma „Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams. Tai reiškia, kad funkcija BLOB nurodo atmintyje esančią išteklių funkciją, apibrėžtą dabartinei sesijai. Išteklių funkcija, kuri nuolat saugoma jūsų kompiuteryje arba debesies paskyroje, turi pilką piktogramą „Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams. Oficialios išteklių funkcijos „Wolfram Feature Repository“ yra oranžinė piktograma „Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams.

Taigi, kas nutinka, kai naudojate Apibrėžčių bloknoto meniu Išplėsti? Pirma, jis paima visus užrašų knygelėje esančius apibrėžimus ir iš jų sukuria simbolinį ResourceObject). (Ir jei naudojate teksto pagrindu sukurtą IDE arba programą, taip pat galite aiškiai sukurti ResourceObject)

Vietinis funkcijos diegimas iš jūsų kompiuteryje esančios saugyklos atliekamas naudojant komandą Vietinė talpykla kad išteklių objektas jį išsaugotų kaip LocalObject savo failų sistemoje. Diegimas debesies paskyroje atliekamas naudojant komandą CloudDeploy išteklių objektui, o viešasis debesies diegimas yra „CloudPublish“.. Visais atvejais Išteklių registras taip pat naudojamas registruoti išteklių funkcijos pavadinimą, taigi ResourceFunction["vardas"] veiks.

Jei spustelėsite funkcijų saugyklos mygtuką Pateikti, kas vyksta po juo ResourceSubmit iškviestas ištekliaus objektas. (Ir jei naudojate teksto įvesties sąsają, taip pat galite skambinti ResourceSubmit tiesiogiai.)

Pagal numatytuosius nustatymus paraiškos pateikiamos pavadinimu, susietu su jūsų Wolfram ID. Bet jei paraišką teikiate kūrimo komandos ar organizacijos vardu, galite nustatyti atskirą leidėjo ID ir vietoj to naudokite jį kaip pavadinimą, kad galėtumėte sąveikauti su savo nuomonėmis.

Kai pateiksite bet kurią iš savo funkcijų į funkcijų žinių bazę, ji bus įtraukta į peržiūros eilę. Jei atsakydami gausite komentarų, jie paprastai bus teksto failo forma su papildomais „komentarų langeliais“. Visada galite patikrinti savo paraiškos būseną apsilankę išteklių sistemos narių portalas. Tačiau kai jūsų funkcija bus patvirtinta, jums bus pranešta (el. paštu) ir jūsų funkcija bus paskelbta „Wolfram“ funkcijų saugykloje.

Kai kurios darbo subtilybės

Iš pirmo žvilgsnio gali atrodyti, kad galite tiesiog paimti apibrėžimų bloknotą ir pažodžiui įdėti jį į funkcijų saugyklą, tačiau iš tikrųjų yra daug subtilybių – ir norint jas tvarkyti reikia atlikti gana sudėtingą metaprogramavimą, tvarkyti simbolinį apdorojimą. kaip kodą, apibrėžiantį funkciją , o pats užrašų knygelė yra apibrėžta. Dažniausiai tai vyksta viduje, užkulisiuose, tačiau tai gali turėti tam tikrų pasekmių, kurias verta suprasti, jei ketinate prisidėti prie funkcijų žinių bazės.

Pirmas subtilumas: kai užpildote apibrėžimų bloknotą, galite tiesiog visur nurodyti savo funkciją naudodami pavadinimą, pvz. Mano funkcija, kuris atrodo kaip įprastas funkcijos pavadinimas Wolfram kalboje, tačiau funkcijų saugyklos dokumentacijoje jis pakeičiamas ResourceFunction[„Mano funkcija“] yra tai, ką vartotojai iš tikrųjų naudos dirbdami su funkcija.

Antrasis subtilumas: kai kuriate išteklių funkciją iš apibrėžimų bloknoto, visos su funkcijos apibrėžimu susijusios priklausomybės turi būti užfiksuotos ir aiškiai įtrauktos. Tačiau norėdami užtikrinti, kad apibrėžimai išliktų moduliniai, turite viską išdėstyti unikaliai vardų erdvė. (Žinoma, funkcijas, kurios atlieka viską, yra funkcijų saugykloje.)

Paprastai niekada nematysite kodo, naudojamo šiai vardų erdvei konfigūruoti, pėdsakų. Bet jei dėl kokių nors priežasčių savo funkcijos viduje iškviečiate nepakankamai įvykdytą simbolį, pamatysite, kad šis simbolis yra vidiniame funkcijos kontekste. Tačiau apdorojant Definition Notepad yra bent jau pačią funkciją atitinkantis simbolis reguliuojamas, kad būtų rodomas geriausias kaip funkcinis BLOB, o ne neapdorotas veikėjas vidiniame kontekste.

Funkcijų saugykla skirta naujoms funkcijoms apibrėžti. Ir šios funkcijos gali turėti parinkčių. Dažnai šie parametrai (pvz. Siuntimas arba Paveikslėlio dydis) bus galima naudoti įmontuotoms funkcijoms, taip pat toms, kurioms jau yra įmontuoti simboliai. Tačiau kartais naujai funkcijai gali prireikti naujų parinkčių. Siekiant išlaikyti moduliškumą, šie parametrai turi būti simboliai, apibrėžti unikaliame vidiniame kontekste (arba panašiai kaip visos išteklių funkcijos, tai yra patys). Paprastumo dėlei funkcijų saugykla leidžia apibrėžti naujas parinktis eilučių apibrėžimuose. Ir vartotojo patogumui šie apibrėžimai (darant prielaidą, kad jie naudojami OptionValue и ParinktysPattern) taip pat apdorojami taip, kad naudojant funkcijas parametrus būtų galima nurodyti ne tik kaip eilutes, bet ir kaip globalius simbolius tais pačiais pavadinimais.

Daugelis funkcijų kiekvieną kartą iškviečiamos tiesiog atlieka tai, ką turėtų daryti, tačiau kai kurias funkcijas reikia inicijuoti, kad jos galėtų paleisti tam tikroje sesijoje – ir šiai problemai išspręsti, skyrelyje „Apibrėžimas“ yra skyrius „Inicijavimas“.

Funkcijos iš saugyklos gali naudoti kitas funkcijas, kurios jau yra saugykloje; norėdami nustatyti funkcijų saugyklos apibrėžimus, apimančius dvi (ar daugiau) funkcijas, kurios nurodo viena kitą, turite jas įdiegti savo programos sesijoje, kad galėtumėte nuoroda kaip ant jų ResourceFunction["vardas"], tada galite sukurti reikiamus šių funkcijų derinius, pavyzdžius (nesupratau) ir į saugyklą įtraukti naują funkciją pagal jau paskelbtas anksčiau. (arba jau arba anksčiau - abu žodžiai yra gremėzdiški)

Plėtros perspektyvos. Kas turėtų nutikti, kai saugykla tampa tikrai didelė?

Šiandien mes tik paleidžiame „Wolfram Feature Repository“, tačiau tikimės, kad laikui bėgant jos dydis ir funkcionalumas gali smarkiai padidėti, o jai augant, kils įvairių problemų, kurių, kaip jau tikėjomės, gali kilti.

Pirmoji problema yra susijusi su funkcijų pavadinimais ir jų unikalumu. Funkcijų saugykla sukurta taip, kad, kaip ir įtaisytosios Wolfram kalbos funkcijos, galite nurodyti bet kurią funkciją, tiesiog nurodydami jos pavadinimą. Tačiau tai neišvengiamai reiškia, kad funkcijų pavadinimai turi būti visuotinai unikalūs visoje saugykloje, kad, pavyzdžiui, gali būti tik vienas ResourceFunction[„Mano mėgstamiausia funkcija“].

Iš pradžių tai gali atrodyti kaip didelė problema, tačiau verta suprasti, kad tai iš esmės ta pati problema, kaip ir su interneto domenais ar socialinės žiniasklaidos rankenomis. Faktas yra tas, kad sistemoje tiesiog reikia turėti registratorių – ir tai yra vienas iš funkcijų, kurias mūsų įmonė atliks Wolfram funkcijų žinių bazėje. (Privačioms saugyklos versijoms jų registratoriai gali būti administratoriai.) Žinoma, interneto domeną galima užregistruoti nieko jame neturint, tačiau funkcijų saugykloje funkcijos pavadinimą galima užregistruoti tik tuo atveju, jei yra tikrasis apibrėžimas. funkcija.

Dalis mūsų vaidmens valdant Wolfram funkcijos žinių bazę yra užtikrinti, kad funkcijos pavadinimas būtų logiškas, atsižvelgiant į funkcijos apibrėžimą ir kad jis atitiktų Wolfram kalbos pavadinimų suteikimo taisykles. Turime daugiau nei 30 metų patirtį pavadindami įtaisytąsias Wolfram kalbos funkcijas, o mūsų kuratorių komanda šią patirtį taip pat perkels į funkcijų saugyklą. Žinoma, visada yra išimčių. Pavyzdžiui, gali atrodyti, kad pageidautina turėti trumpą kai kurios funkcijos pavadinimą, tačiau geriau „gintis“ ilgesniu, konkretesniu pavadinimu, nes mažesnė tikimybė, kad ateityje susidursite su žmogumi, kuris norės sukurti panašų funkcijos pavadinimą. .

(Pažymėtina, kad tiesiog pridėjus tam tikrą nario žymą funkcijoms išaiškinti nebus norimo efekto. Nes nebent reikalausite, kad žyma būtų visada priskirta, turėsite apibrėžti numatytąją bet kurios funkcijos žymą ir priskirti autorių žymų, kurioms vėlgi reikėtų visuotinio koordinavimo.)

Augant „Wolfram“ funkcijų žinių bazei, viena iš problemų, kuri gali kilti, yra funkcijų, kurias sistema suteikia, aptinkamumas. paieškos funkcija (o apibrėžimo failuose gali būti raktinių žodžių ir pan.). Įtaisytųjų Wolfram kalbos funkcijų dokumentacijoje yra įvairių kryžminių nuorodų, padedančių „reklamuoti“ funkcijas. Funkcijos, esančios funkcijų saugykloje, gali nurodyti įtaisytąsias funkcijas. Bet kaip yra atvirkščiai? Norėdami tai padaryti, mes eksperimentuosime su skirtingais dizainais, kad atskleistume saugyklos funkcijas įtaisytųjų funkcijų dokumentacijos puslapiuose.

Integruotoms Wolfram kalbos funkcijoms yra numatytas vadinamasis aptikimo sluoksnis "pagalbos puslapių" tinklas, kuriuose pateikiami organizuoti funkcijų, susijusių su konkrečiomis sritimis, sąrašai. Visada sunku tinkamai subalansuoti man puslapius, o augant Wolfram kalbai, man puslapius dažnai reikia visiškai pertvarkyti. Gana lengva suskirstyti funkcijas iš saugyklos į plačias kategorijas ir netgi nuosekliai jas suskirstyti, tačiau daug vertingiau turėti tinkamai sutvarkytus kalbų nuorodų puslapius. Dar neaišku, kaip geriausia juos sukurti visai funkcijų žinių bazei. Pavyzdžiui, CreateResourceObjectGallery funkcijų saugykloje kiekvienas gali paskelbti tinklalapį, kuriame yra jų „pasirinkimai“ iš saugyklos:

„Wolfram Function Repository“: atviros prieigos platforma „Wolfram“ kalbos plėtiniams

„Wolfram“ funkcijų saugykla sukonfigūruota kaip nuolatinė funkcijų saugykla, kurioje bet kuri joje esanti funkcija veiks visada. Žinoma, gali atsirasti naujų funkcijų versijų ir tikimės, kad laikui bėgant kai kurios funkcijos pasens. Funkcijos veiks, jei jos bus naudojamos programose, tačiau jų dokumentacijos puslapiuose bus nuorodos į naujas, pažangesnes funkcijas.

„Wolfram Feature Repository“ sukurta taip, kad padėtų greitai atrasti naujas funkcijas ir išmokti naujų „Wolfram“ kalbos naudojimo būdų. Esame labai optimistiškai nusiteikę, kad kai kurie iš funkcijų saugyklos ištirtų dalykų galiausiai taps įtaisytomis pagrindinės Wolfram kalbos dalimis. Per pastarąjį dešimtmetį turėjome panašų rinkinį funkcijos, kurios iš pradžių buvo pristatytos Wolfram | Alfa. Ir viena iš šios patirties pamokų yra ta, kad norint pasiekti kokybės ir nuoseklumo standartus, į kuriuos mes sutelkiame dėmesį į viską, kas integruota į Wolfram kalbą, reikia įdėti daug darbo, o tai dažnai yra sunkiau nei pradinės pastangos įgyvendinti idėją. Nepaisant to, funkcija funkcijų žinių bazėje gali būti labai naudingas būsimos funkcijos, kuri galiausiai gali būti integruota į Wolfram kalbą, koncepcijos įrodymas.

Svarbiausias dalykas yra tai, kad funkcija funkcijų saugykloje yra tai, ką dabar gali naudoti kiekvienas vartotojas. Gali būti, kad gimtosios kalbos funkcija galėtų būti daug geresnė ir našesnė, tačiau funkcijų saugykla leistų vartotojams iš karto pasiekti visas naujas funkcijas. Ir, svarbiausia, ši koncepcija leidžia kiekvienam pridėti bet kokių norimų naujų funkcijų.

Anksčiau Volframo kalbos istorijoje ši idėja nebūtų taip gerai pasiteisinusi, bet šiuo metu kalbai dedama tiek daug pastangų ir taip giliai suprantami kalbos dizaino principai, kad dabar atrodo labai didelė vartotojų bendruomenė gali pridėti funkcijų, kurios išlaikys dizaino nuoseklumą, kad jos būtų naudingos daugeliui vartotojų.

Wolfram kalbos vartotojų bendruomenėje tvyro neįtikėtina talento (?) dvasia. (Žinoma, šioje bendruomenėje yra daug įvairių sričių MTTP vadovaujančių žmonių.) Tikiuosi, kad „Wolfram Feature Repository“ bus veiksminga platforma šiai talento dvasiai atskleisti ir skleisti. Tik kartu galime sukurti tai, kas žymiai praplės sritį, kuriai galima pritaikyti Wolfram kalbos skaičiavimo paradigmą.

Per daugiau nei 30 metų mes nuėjome ilgą kelią su Wolfram kalba. Dabar kartu eikime dar toliau. Labai raginu visus gerbiamus Wolfram kalbos vartotojus visame pasaulyje naudoti funkcinę saugyklą kaip platformą, taip pat naują programinės įrangos projektą, pvz., „Free Wolfram Engine for Developers“.

Šaltinis: www.habr.com

Добавить комментарий