Ciao, Habr! Vi presento la traduzione del post di Stephen Wolfram .

Prerequisiti per la solidità del linguaggio Wolfram
Oggi siamo sulla soglia di grandi realizzazioni con il linguaggio di programmazione . Solo tre settimane fa abbiamo lanciato , per aiutare i nostri utenti a integrare il linguaggio Wolfram Language nei loro progetti software su larga scala. Oggi lanciamo , per fornire una piattaforma coordinata per le funzioni create per estendere il linguaggio Wolfram, e apriamo anche il repository delle funzioni a chiunque possa contribuire allo sviluppo del nostro prodotto software.
Il repository delle funzioni (Function Repository) Wolfram è ciò che è stato reso possibile grazie alle peculiarità uniche del Wolfram Language, non solo come linguaggio di programmazione, ma anche come . Nei linguaggi di programmazione tradizionali, l'aggiunta di nuove funzioni significative di solito comporta la creazione di intere librerie aggiuntive, che potrebbero funzionare o meno in modo coeso. Tuttavia, nel linguaggio Wolfram Language , che è possibile espandere significativamente le sue funzionalità semplicemente aggiungendo nuove funzioni, che si integrano immediatamente nella struttura complessiva del linguaggio.
Ad esempio, attualmente nel repository delle funzioni Wolfram ci sono strutturate in 26 categorie tematiche:

Analogamente a oltre , integrate nel linguaggio Wolfram, ogni funzione del repository ha una pagina di documentazione con dettagliata descrizione e esempi di utilizzo:

Per accedere alla pagina, copia l'oggetto presentato sopra (BLOB funzionale), incollalo nella barra di input e poi esegui la funzione – è già integrata nel linguaggio Wolfram e supportata di default, a partire da :

Qui vale la pena notare che durante l'elaborazione Non è necessario, ad esempio, configurare una «libreria per l'elaborazione delle immagini» – poiché nel linguaggio Wolfram Language abbiamo già implementato un metodo sequenziale e rigorosamente algoritmico , che possono essere elaborati immediatamente da varie funzioni grafiche del linguaggio:

Spero che con il supporto di , che è cresciuta e si è espansa (sulla base del linguaggio Wolfram Language) negli ultimi decenni. Il repository di funzioni Wolfram permetterà nei prossimi anni di ampliare notevolmente la gamma (potenzialmente significativa e specializzata in vari campi della scienza e della tecnologia) di funzioni disponibili nel linguaggio. Ciò rende possibile utilizzare sia il contenuto del linguaggio (le sue funzioni incorporate), sia , che vengono realizzati sulla base del linguaggio. (È importante notare che Wolfram Language ha già una storia di oltre ).
All'interno delle funzioni del repository possono esserci porzioni di codice piccole o abbastanza grandi, scritte nel linguaggio Wolfram Language. Ad esempio, potrebbero esserci chiamate a . La caratteristica unica di questo approccio è che, quando si accede alle funzionalità a livello utente, non ci saranno possibili discrepanze, poiché questo approccio è costruito su una struttura coerente del linguaggio Wolfram Language — e ogni funzione funzionerà automaticamente correttamente — proprio come dovrebbe.
L'interfaccia e la struttura software del repository di funzioni Wolfram sono configurate in modo che chiunque possa contribuire al progetto nel modo più semplice e comodo possibile — sostanzialmente, semplicemente . Le funzioni automatiche incorporate consentono di controllare le nuove funzioni aggiunte al repository per garantirne l'integrazione nel linguaggio. La nostra azienda scommette su un ampio numero di utenti che possono integrare le proprie funzioni nel linguaggio, piuttosto che su grandi complessità di nuove funzioni — e sebbene qui sia stato implementato un processo di verifica, non insistiamo su qualcosa di simile a o su rigorosi standard di completezza e affidabilità delle nuove funzioni degli utenti, a differenza delle verifiche più accurate delle funzioni integrate nel nucleo del linguaggio che applichiamo.
In questo approccio ci sono molti compromessi e dettagli, ma il nostro obiettivo è ottimizzare il repository delle funzioni Wolfram sia per la comodità degli utenti che per garantire che le nuove funzioni degli utenti contribuiscano in modo significativo allo sviluppo del linguaggio. Man mano che cresceremo, non ho dubbi che dovremo inventare nuovi metodi per elaborare e verificare le funzioni integrate nel repository, e questo non è l'ultimo motivo per organizzare un gran numero di funzioni e trovare quelle necessarie agli utenti. Tuttavia, non può che essere incoraggiante che il percorso che abbiamo scelto sia un buon inizio. Io stesso alla base iniziale. Molte di esse sono basate su codice che ho personalmente sviluppato per un periodo di tempo considerevole. E ho impiegato solo pochi minuti per inviarle al repository. Ora che si trovano nel repository, posso finalmente utilizzare queste funzioni quando necessario, senza preoccuparmi di cercare file, scaricare pacchetti e così via.
Aumento dell'efficienza riducendo i costi
Anche prima della nascita di Internet, c'erano modi per condividere il codice del Wolfram Language (il nostro primo grande progetto centralizzato è stato , creato per Mathematica nel 1991 su CD-ROM, ecc.). Certamente, l'approccio proposto basato sul repository delle funzioni Wolfram è uno strumento più potente e affidabile per affrontare le sfide sopra citate.
Da oltre 30 anni, la nostra azienda lavora instancabilmente per mantenere l'integrità della struttura del linguaggio Wolfram, e questo è molto importante affinché il linguaggio Wolfram diventi non solo un linguaggio di programmazione, ma anche un . E quindi, la sostanza dell'approccio per implementare il repository delle funzioni Wolfram è l'uso di un unico approccio alla programmazione e allo sviluppo di nuove funzioni, che vengono aggiunte in modo coerente e integrate nel linguaggio per consentirne l'evoluzione e la crescita congiunta.
Nella struttura di implementazione di ogni funzione si verificano diversi processi computazionali. È importante notare che, per l'utente, la funzione deve avere un aspetto chiaro e uniforme e una leggibilità evidente. In questo contesto, le funzioni incorporate nel linguaggio Wolfram Language sono presentate da oltre 6000 esempi sequenziali di come programmare correttamente le funzioni (questo è il nostro , che includono ). Questo approccio consente, infine, di rendere il repository delle funzioni di Wolfram capace di funzionare bene, grazie alla natura strutturale del linguaggio Wolfram Language con la sua ampia varietà di librerie aggiuntive e diversificate già integrate nel linguaggio. Ad esempio, se hai una funzione che elabora immagini, o , o , e inoltre o altri tipi — nel linguaggio esiste già una rappresentazione simbolica concordata, e grazie a questo la tua funzione diventa immediatamente compatibile con altre funzioni nel linguaggio.
Creare un repository che funzioni davvero bene è una sfida interessante di meta-programmazione. Per esempio, un eccesso di vincoli nel programma non consentirà di ottenere la necessaria unificazione e universalità nel funzionamento dell'algoritmo. Allo stesso modo, con un numero insufficiente di vincoli funzionali non sarai in grado di realizzare una sequenza di esecuzione adeguata dell'algoritmo. Alcuni dei precedenti esempi di realizzazione del compromesso tra questi approcci, implementati dalla nostra azienda, hanno funzionato in modo abbastanza stabile — sono: , lanciato nel 2007 e ora operante in modalità interattiva su Internet, contenente oltre 12000 dimostrazioni interattive create dagli utenti. Nel ci sono oltre 600 database pronti all'uso nell'ambito del linguaggio Wolfram Language, e viene aggiornato con nuove reti neurali praticamente ogni settimana (attualmente ce ne sono già 118) e vengono immediatamente collegate tramite la funzione nel linguaggio Wolfram Language.
Tutti gli esempi sopra menzionati presentano una caratteristica fondamentale: gli oggetti e le funzioni raccolti nel progetto hanno un alto grado di strutturazione e distribuzione dei processi. Certamente, la specificità della struttura di ciò che rappresenta una dimostrazione, una rete neurale o qualcos'altro può variare notevolmente, ma la struttura di base per qualsiasi repository attuale rimane invariata. Qual è quindi la sua opinione, gentile utente, sulla creazione di un repository che aggiunge estensioni al linguaggio Wolfram? Il linguaggio Wolfram Language è progettato per essere estremamente flessibile, quindi può essere espanso e modificato in vari modi. Questa circostanza è estremamente importante per la possibilità di sviluppare rapidamente diversi progetti software su larga scala utilizzando il linguaggio Wolfram Language. Qui è importante notare che con l'aumento della flessibilità del linguaggio, inevitabilmente aumenterà anche il costo dei progetti implementati con tale linguaggio. Questo accade perché più un utente utilizza questo linguaggio, maggiore è la funzionalità dedicata che riceve, ma è importante non dimenticare che questo approccio può avere anche aspetti negativi riguardo all'impossibilità di garantire una coerenza sequenziale dei moduli software.
Nei linguaggi di programmazione tradizionali esiste un problema comune con le librerie: se utilizzi, ad esempio, una libreria, il codice funziona correttamente, ma se provi a utilizzare più librerie, non c'è garanzia che interagiranno correttamente tra loro. Inoltre, nei linguaggi di programmazione tradizionali - a differenza di un linguaggio di calcolo completo - mancano le possibilità di controllare garantitamente la presenza di rappresentazioni incorporate coerenti per qualsiasi funzione o tipo di dato, oltre alle loro strutture di base. Ma, in sostanza, il problema è ancora più grande di quanto sembri a prima vista: se qualcuno costruisce una verticale funzionale su larga scala, senza enormi costi di programmazione centralizzati per il progetto, come quelli che abbiamo investito nel linguaggio Wolfram, non è possibile raggiungere la coerenza. Pertanto, è importante che tutti i moduli software lavorino sempre correttamente insieme.
Pertanto, l'idea del repository delle funzioni di Wolfram è quella di evitare il problema sopra menzionato, semplicemente aggiungendo estensioni al linguaggio sotto forma di elementi di codice relativamente piccoli attraverso funzioni singole, il cui sviluppo come moduli coerenti rappresenta un compito più semplice. Ci sono, tuttavia, caratteristiche di programmazione che non possono essere rese convenienti tramite funzioni singole (e la nostra azienda intende rilasciare un algoritmo software ottimizzato per aiutare nell'implementazione di pacchetti software di grandi dimensioni in un prossimo futuro). Tuttavia, sulla base delle funzioni già integrate nel linguaggio Wolfram Language, esistono molte possibilità di programmazione realizzate tramite funzioni singole. Qui, l'idea è che con sforzi di programmazione relativamente ridotti, sia possibile creare una serie di nuove e molto utili funzioni che garantiranno una sufficiente coerenza del progetto, essendo ben armonizzate tra loro e, oltre a questo, avendo la possibilità di essere facilmente e ampiamente utilizzate nel linguaggio in futuro.
Questo approccio è senza dubbio un compromesso. Implementando un pacchetto di dimensioni maggiori, si può immaginare un mondo completamente nuovo di funzionalità che diventerà estremamente potente e utile. Se c'è la necessità di ottenere nuove funzionalità che si integrino con tutto il resto, ma non sei disposto a investire enormi sforzi nello sviluppo del progetto, purtroppo questo potrebbe portare a una riduzione della scala del tuo progetto. L'idea del repository delle funzioni di Wolfram è di fornire funzionalità che definiscono una parte centrale del progetto; questo approccio consente di aggiungere potenza funzionale, semplificando al contempo il mantenimento di una buona coerenza del progetto di programmazione.
Assistenza per l'aggiunta di funzioni personalizzate al repository delle funzioni
Gli specialisti della nostra azienda hanno lavorato duramente per rendere il proprio contributo alle funzioni del repository Wolfram abbastanza semplice per gli utenti. Sul desktop (già in ), Puoi semplicemente passare sequenzialmente attraverso le schede del menu principale: File > Nuovo > RepositoryItem > Function Repository Item e otterrai «» (programmaticamente all'interno dell'ambiente di lavoro. Puoi anche utilizzare la funzione simile — ):

Ci sono due azioni principali che devi eseguire: prima di tutto, effettivamente scrivere il codice della tua funzione e, in secondo luogo, scrivere la documentazione che illustra come dovrebbe funzionare la tua funzione.
Fai clic sul pulsante «Apri Esempio» in alto per vedere un esempio di ciò che devi fare:

In effetti, stai cercando di creare qualcosa di simile a una funzione incorporata nel linguaggio Wolfram. A differenza di quella, però, può fare qualcosa di molto più specifico. Con ciò, le aspettative riguardo alla sua completezza e affidabilità saranno molto più basse.
Devi dare un nome alla tua funzione che segua i principi di denominazione delle funzioni del linguaggio Wolfram. Inoltre, dovrai sviluppare la documentazione per la tua funzione, in analogia con le funzioni incorporate del linguaggio. Ne parlerò più dettagliatamente più avanti. Per ora, nota semplicemente che nella barra dei pulsanti nella parte superiore del file del quaderno di definizione c'è un pulsante , che spiega cosa fare, e un pulsante «Strumenti», che fornisce strumenti per formattare la documentazione della tua funzione.
Quando sei sicuro che tutto sia completato correttamente e sei pronto, fai clic sul pulsante «Check» («Controlla»). È del tutto normale che tu non abbia ancora compreso tutti i dettagli. Pertanto, la funzione «Check» verrà eseguita automaticamente e farà molte verifiche di stile e coerenza. Spesso ti chiederà immediatamente di confermare e accettare le correzioni (ad esempio: «Questa riga deve terminare con un due punti», e ti chiederà di inserire i due punti). A volte ti chiederà di aggiungere o modificare qualcosa da solo. Continueremo ad aggiungere nuove funzionalità alla funzionalità automatica del pulsante «Check», ma il suo obiettivo principale è garantire che tutto ciò che invii al repository delle funzioni rispetti il maggior numero possibile di raccomandazioni di stile.

Quindi, dopo aver avviato "Check", puoi utilizzare "Preview". "Preview" crea un'anteprima della pagina di documentazione che hai definito per la tua funzione. Puoi anche creare un'anteprima per un file creato sul tuo computer o per un file situato nello spazio di archiviazione cloud. Se, per qualche motivo, non sei soddisfatto di ciò che vedi nell'anteprima, torna indietro e apporta le correzioni necessarie, quindi fai nuovamente clic sul pulsante Preview.
Ora sei pronto per pubblicare la tua funzione nel repository. Il pulsante Deploy ti offre quattro opzioni di azione:

In questo passaggio è importante notare che puoi inviare la tua funzione al repository delle funzioni Wolfram, affinché sia disponibile per qualsiasi utente. Allo stesso tempo, puoi anche pubblicare la tua funzione per un numero limitato di utenti. Ad esempio, puoi creare una funzione ospitata localmente sul tuo computer, in modo che sia disponibile quando utilizzi questo specifico computer. Oppure puoi pubblicarla nel tuo , in modo che sia accessibile quando sei connesso al cloud. Puoi anche pubblicare (deploy) la funzione pubblicamente tramite il tuo account cloud. Anche se non sarà nel repository centrale delle funzioni Wolfram, potrai dare a qualcuno l'URL che consentirà di ottenere la tua funzione dal tuo account. (In futuro supporteremo anche repository centrali su scala aziendale).
Quindi, supponiamo che tu voglia effettivamente inviare la tua funzione nel knowledge base delle funzioni Wolfram. A questo scopo fai clic sul pulsante "Invia" nel repository. Cosa succede in questo momento? La tua richiesta entra immediatamente in coda per la revisione e l'approvazione da parte del nostro team speciale di curatori.
Mentre la tua richiesta passa attraverso il processo di approvazione (che di solito richiede alcuni giorni), riceverai aggiornamenti sullo stato della sua revisione e, possibilmente, suggerimenti per il suo ulteriore utilizzo. Ma non appena la tua funzione sarà approvata, verrà pubblicata immediatamente nel repository delle funzioni di Wolfram e diventerà disponibile per chiunque la utilizzi. (E ciò sarà visualizzato in ecc.)
Cosa dovrebbe contenere il repository?
È importante notare che la nostra azienda ha standard molto elevati in termini di completezza, affidabilità e qualità complessiva; delle oltre 6000 funzioni che abbiamo già integrato nel linguaggio Wolfram negli ultimi 30 anni e più, tutte soddisfano i criteri sopra menzionati. L'obiettivo del repository delle funzioni di Wolfram è quello di sfruttare tutta la struttura e le funzionalità già esistenti nel linguaggio Wolfram Language per aggiungere il maggior numero possibile di funzioni molto più leggere (cioè funzioni con prestazioni superiori).
Senza dubbio, le funzioni nel repository delle funzioni di Wolfram devono conformarsi ai principi di sviluppo del linguaggio Wolfram Language, affinché possano interagire pienamente con le altre funzioni e con le aspettative degli utenti su come le funzioni dovrebbero comportarsi correttamente. Tuttavia, le funzioni non devono necessariamente avere la stessa completezza o affidabilità.
Nelle funzioni integrate del linguaggio Wolfram, ci impegniamo a rendere le funzioni software il più generali possibile. Detto ciò, non c'è niente di sbagliato nel fatto che nel repository delle funzioni di Wolfram sia presente una funzione che gestisce un caso molto specifico, ma utile. Ad esempio, la funzione può ricevere file in un formato specifico e creare email in un certo modo. crea diagrammi solo con colori e etichette specifici, ecc.
Un altro aspetto legato alle funzioni integrate è che la nostra azienda si impegna a trattare tutti i casi atipici, per una corretta gestione di input non corretti e così via. È del tutto normale che nel repository delle funzioni ci sia una funzione speciale che gestisce i casi principali per risolvere il problema e ignora tutti gli altri.
È evidente che sia meglio avere funzioni che fanno di più e lo fanno meglio, ma l'ottimizzazione per il repository delle funzioni — a differenza delle funzioni integrate del linguaggio Wolfram — deve avere più funzioni collegate con un numero maggiore di funzioni piuttosto che approfondire i processi di implementazione di ogni singola funzione.
Adesso consideriamo un esempio di test delle funzioni nel repository. Le aspettative di coerenza per queste funzioni sono naturalmente molto più basse rispetto a quelle delle funzioni integrate del linguaggio. Questo è particolarmente rilevante nei casi in cui le funzioni dipendono da risorse esterne, come API, ed è importante eseguire costantemente test coerenti, che avvengono automaticamente all'interno degli algoritmi di verifica. Nel file nb puoi specificare esplicitamente le definizioni (nella sezione 'Informazioni aggiuntive') e impostare tanti test, definiti o da righe di input e output, o da oggetti simbolici completi di tipo , quanti ne ritieni necessari. Inoltre, il sistema cerca costantemente di trasformare gli esempi di documentazione forniti in un processo di verifica (a volte ciò può essere piuttosto dispendioso in termini di risorse, ad esempio per una funzione il cui risultato dipende da numeri casuali o dall'ora del giorno).
Alla fine, nel repository delle funzioni ci saranno diverse complessità di implementazione. Alcune saranno semplicemente una riga di codice, altre potrebbero includere migliaia o decine di migliaia di righe, probabilmente utilizzando molte funzioni ausiliarie. In quali casi è opportuno aggiungere una funzione per la quale è necessario molto poco codice? In linea di massima, se per la funzione c'è , che gli utenti comprenderebbero facilmente vedendolo in parte del codice, può già essere aggiunto. In caso contrario, probabilmente è meglio semplicemente riscrivere il codice per il tuo programma ogni volta che hai bisogno di utilizzarlo.
L'obiettivo principale del repository di funzioni (come suggerisce il suo nome) è quello di introdurre nuove funzioni nella funzionalità del linguaggio. Se desideri aggiungere nuovi dati o , usa . Ma cosa fare se desideri introdurre nuovi tipi di oggetti per i tuoi calcoli?
In realtà ci sono due strade. Puoi voler introdurre un nuovo tipo di oggetto che sarà utilizzato in nuove funzioni nel repository di funzioni. In tal caso, puoi semplicemente registrare la sua rappresentazione simbolica e utilizzarla quando inserisci o restituisci funzioni nel repository di funzioni.
Ma cosa fare se vuoi rappresentare un oggetto e poi definire, tramite funzioni esistenti nel linguaggio Wolfram Language, quelle che dovrebbero lavorare insieme ad esso? Per questo, il Wolfram Language ha sempre avuto un meccanismo semplice, chiamato . Con alcune limitazioni (specialmente per le funzioni che ), il repository di funzioni ti consente semplicemente di rappresentare una funzione e definire valori per essa. (Per aumentare l'aspettativa di coerenza nella creazione di una nuova importante costruzione, completamente integrata ovunque nel linguaggio Wolfram Language, questo è generalmente un processo molto importante che non può essere raggiunto solo aumentando il costo del progetto e ciò che la nostra azienda fa nell'ambito dei progetti di sviluppo a lungo termine del linguaggio, questo compito non è un obiettivo che viene posto nell'ambito dello sviluppo del repository).
Quindi, cosa può essere nel codice delle funzioni nel repository di funzioni? , ovviamente (almeno se non rappresenta per e la funzionalità del programma stesso, come ambiente di calcolo) così come qualsiasi funzione dal repository di funzioni. A questo punto ci sono anche altre possibilità di funzionamento: una funzione nel repository di funzioni può chiamare API, oppure in , oppure . Certamente, ci sono alcuni rischi associati a questo. Poiché non ci sono garanzie che l'API non cambi, la funzione nel repository delle funzioni potrebbe smettere di funzionare. Per identificare tali problemi, c'è una nota nella pagina della documentazione (nella sezione
Requisiti) per qualsiasi funzione che si basa non solo sulla funzionalità integrata del Wolfram Language. (Naturalmente, quando si tratta di dati reali, possono esserci problemi anche con tale funzionalità - perché i dati reali sul mondo cambiano continuamente e a volte persino modificano le loro definizioni e strutture.) o ExternalFunction
nel codice del linguaggio Wolfram.) la configurazione di linguaggi esterni in un sistema informatico specifico, e nel cloud storage potrebbero sorgere ulteriori problemi di sicurezza).
Quando si analizzano per la prima volta librerie esterne standard, spesso sembrano troppo complesse per essere coperte da poche funzioni. Tuttavia, gran parte di questa complessità deriva dalla creazione dell'infrastruttura necessaria per la libreria e dalle funzioni di supporto. Con il linguaggio Wolfram Language, l'infrastruttura è generalmente già integrata nei pacchetti, quindi non è necessario svelare tutte queste funzioni di supporto, ma è sufficiente creare funzioni per alcune delle funzioni «superiori» orientate all'applicazione nella libreria.
«Ecosistema» della base di conoscenza
Se hai scritto funzioni che utilizzi regolarmente, inviale al repository delle funzioni Wolfram! Se non ne risulterà nient'altro (sviluppo del linguaggio), sarà comunque molto più comodo utilizzare funzioni per uso personale. Tuttavia, è logico supporre che, se utilizzi funzioni continuamente, anche altri utenti potrebbero trovarle utili.
Naturalmente, puoi trovarti in una situazione in cui non hai la possibilità — o non vuoi — condividere le tue funzioni o nel caso di accesso a risorse informative private. Anche in tali casi, puoi semplicemente distribuire le funzioni nel tuo account cloud. di accesso. (Se nella tua organizzazione c'è un , presto sarà in grado di ospitare il proprio repository privato di funzioni, che può essere amministrato dalla tua organizzazione e impostare la visualizzazione forzata o meno per gli utenti esterni.)
Le funzioni che invii al repository delle funzioni Wolfram non devono necessariamente essere perfette; devono semplicemente essere utili. È un po' come la sezione «Errori» nella documentazione Unix classica — nella sezione «Definizioni» c'è una voce «Note dell'autore» dove puoi descrivere limitazioni, problemi, ecc. che già conosci riguardo alla tua funzione. Inoltre, quando invii la tua funzione al repository, puoi aggiungere annotazioni all'invio che saranno lette da un'apposita squadra di curatori.
Dopo la pubblicazione della funzione, la sua pagina ha sempre due collegamenti in fondo: «" e "». Se si allega una nota (ad esempio, segnalarmi degli errori), è possibile selezionare una casella in cui si afferma di voler che il proprio messaggio e le informazioni di contatto vengano inviati all'autore della funzione.
A volte è necessario semplicemente utilizzare le funzioni dal repository delle funzioni di Wolfram, ad esempio funzioni integrate, senza dover guardare il loro codice. Tuttavia, se si desidera "guardare dentro", c'è sempre un pulsante "Notebook" in cima. Cliccandolo, si otterrà una copia personale del notebook originale della definizione, che è stato inviato al repository delle funzioni. A volte si può semplicemente utilizzare come esempio per le proprie necessità. In questo modo si può anche sviluppare una propria modifica di questa funzione. Potreste voler memorizzare queste funzioni trovate nel repository sul proprio computer o nel proprio account di archiviazione cloud, oppure potreste volerle inviare alla base di conoscenza delle funzioni, magari come versione migliorata o ampliata della funzione originale.
In futuro prevediamo di supportare il branching in stile Git per i repository delle funzioni, ma al momento stiamo cercando di semplificare le cose e abbiamo sempre solo una versione consensuale di ogni funzione integrata nel linguaggio. Nella maggior parte dei casi (se gli sviluppatori non rinunciano a mantenere le funzioni da loro sviluppate e rispondono ai messaggi degli utenti), l'autore originale della funzione ha il controllo sugli aggiornamenti e invia nuove versioni, che vengono poi verificate e, se superano il processo di revisione, pubblicate nel linguaggio.
Consideriamo come funziona la "versioning" delle funzioni sviluppate. Attualmente, quando si utilizza una funzione dal repository delle funzioni, la sua definizione rimarrà costantemente sul computer (o nel proprio account cloud, se si utilizza il cloud). Se viene rilasciata una nuova versione della funzione, alla prossima sua utilizzazione riceverai un messaggio che ti informa al riguardo. E se desideri aggiornare la funzione alla nuova versione, puoi farlo con il comando («L'oggetto BLOB funzionale» in realtà memorizza più informazioni sulle versioni e in futuro intendiamo rendere questo più accessibile ai nostri utenti.)
Una delle caratteristiche meravigliose del repository di funzioni Wolfram è che qualsiasi programma Wolfram Language può utilizzare funzioni da esso in qualsiasi luogo. Se un programma appare in un notebook, è spesso comodo formattare le funzioni del repository come 'oggetti binari funzionali' facilmente leggibili (forse con un insieme di versioni appropriate).
Puoi sempre accedere a qualsiasi funzione del repository di funzioni utilizzando il testo . Ed è molto comodo se scrivi codice o script direttamente per Wolfram Engine, ad esempio, con (è importante notare che il repository di funzioni è completamente compatibile con ).
Come funziona?
All'interno delle funzioni nel repository Wolfram è possibile utilizzare esattamente lo stesso database, proprio come in (archivio dati, , ecc.), come tutte le altre risorse di sistema Wolfram, si basa infine sulla funzione .
Consideriamo :

All'interno puoi vedere alcune informazioni utilizzando la funzione :

Come funziona la configurazione della funzione risorsa? Il caso più semplice è puramente locale. Ecco un esempio che prende una funzione (in questo caso semplicemente una funzione pura) e la definisce come funzione risorsa per la sessione corrente nel programma:

Dopo aver fatto la definizione, puoi utilizzare la funzione risorsa:

Nota che in questo oggetto BLOB della funzione c'è un'icona nera
. Questo indica che la funzione BLOB è relativa a una funzione risorsa in memoria, definita per la sessione corrente. Per una funzione risorsa che è memorizzata permanentemente sul tuo computer o nel tuo account cloud, c'è un'icona grigia
. E per la funzione risorsa ufficiale nel repository di funzioni Wolfram, c'è un'icona arancione
.
Quindi, cosa succede quando usi il menu 'Distribuzione' nel notebook di definizione? Prima di tutto, prende tutte le definizioni nel notebook e crea da esse un'espressione simbolica. ). (E se usi un IDE o un programma di testo, puoi anche crearle esplicitamente )
Il deployment locale della funzione dal repository sul tuo computer viene eseguito usando il comando per l'oggetto risorsa, per salvarlo come nel tuo file system. Il deployment su un account cloud viene eseguito usando il comando per l'oggetto risorsa, mentre il deployment pubblico nel cloud — . In tutti i casi, viene utilizzato anche per registrare il nome della funzione risorsa, in modo che funzioni.
Se premi il pulsante Submit per il Function Repository, ciò che accade sotto di esso viene chiamato sull'oggetto risorsa. (E se usi un'interfaccia di input testuale, puoi anche chiamare direttamente.)
Per impostazione predefinita, l'invio avviene con il nome associato al tuo Wolfram ID. Ma se invii una richiesta a nome di un gruppo di sviluppatori o di un'organizzazione, puoi e usarlo invece come nome per interagire con le tue visualizzazioni.
Dopo aver inviato qualsiasi tua funzione nella base di conoscenza delle funzioni, sarà messa in coda per la revisione. Se ricevi feedback, di solito sarà in forma di file di testo con delle «celle di commento» aggiunte. Puoi sempre controllare lo stato della tua richiesta accedendo al . Ma una volta che la tua funzione è stata approvata, verrai avvisato (via email) e la tua funzione sarà pubblicata nel repository delle funzioni Wolfram.
Alcuni dettagli sul funzionamento
A prima vista potrebbe sembrare che sia possibile prendere semplicemente un notebook definitorio e inserirlo parola per parola nel repository delle funzioni, tuttavia, in realtà ci sono molte sfumature — e per affrontarle è necessaria una programmazione meta piuttosto complessa, trattando simbolicamente sia il codice che definisce la funzione sia il notebook definitorio stesso. Gran parte di questo avviene internamente, cioè «dietro le quinte», ma potrebbe avere alcune conseguenze che è utile comprendere se intendi contribuire alla base di conoscenza delle funzioni.
La prima sottile sfumatura: Quando compilate il "Blocco note delle definizioni", potete semplicemente fare riferimento alla vostra funzione ovunque, usando un nome simile a MyFunction, che appare come un normale nome di funzione nel linguaggio Wolfram, ma per la documentazione del repository delle funzioni viene sostituito – questo è esattamente ciò che gli utenti useranno effettivamente quando lavorano con la funzione.
La seconda sfumatura: quando create una funzione risorsa dal Blocco note delle definizioni, tutte le dipendenze coinvolte nella definizione della funzione devono essere bloccate e incluse esplicitamente. Tuttavia, per garantire che le definizioni rimangano modulari, è necessario collocare tutto in uno . (Naturalmente, che si trovano nel repository delle funzioni.)
Di solito non vedrete mai tracce del codice utilizzato per impostare questo spazio dei nomi. Ma se per qualche motivo chiamate un simbolo non completato all'interno della vostra funzione, vedrete che quel simbolo si trova nel contesto interno della funzione. Tuttavia, quando si elabora il Blocco note delle definizioni, almeno il simbolo corrispondente alla funzione stessa, in forma di BLOB funzionale, piuttosto che di un simbolo grezzo nel contesto interno.
Il repository delle funzioni è destinato a definire nuove funzioni. E queste funzioni possono avere opzioni. Spesso queste opzioni (ad esempio, o ) avranno la possibilità di essere utilizzate per funzioni incorporate, così come per quelle per cui esistono già simboli incorporati. Ma a volte una nuova funzione può aver bisogno di nuove opzioni. Per mantenere la modularità, è necessario che queste opzioni siano simboli definiti in un contesto interno unico (o qualcosa di simile a funzioni risorsa intere, cioè in sé stesse). Per semplicità, il repository delle funzioni consente di specificare nuove opzioni nelle definizioni come stringhe. E per comodità dell'utente, queste definizioni (a condizione che abbiano utilizzato e ) vengono anche elaborate in modo che quando si utilizzano le funzioni, i parametri possano essere specificati non solo come stringhe, ma anche come simboli globali con gli stessi nomi.
La maggior parte delle funzioni fa semplicemente ciò che deve fare ogni volta che vengono chiamate, ma alcune funzioni richiedono un'inizializzazione prima di poter funzionare in una certa sessione—e per affrontare questo problema nella sezione "Definizione" c'è una sezione "Inizializzazione".
Le funzioni nel repository possono utilizzare altre funzioni già presenti nel repository per definire le definizioni del repository delle funzioni, incluse due (o più) funzioni che si riferiscono l'una all'altra e necessitano di essere espanse nella propria sessione di lavoro con il programma, in modo da poterle riferire come , quindi puoi creare le combinazioni desiderate di queste funzioni come esempi e aggiungere al repository una nuova funzione basata su quelle già collocate in precedenza.
Prospettive di sviluppo. Cosa dovrebbe accadere quando il repository diventa veramente grande?
Oggi stiamo solo avviando il repository delle funzioni Wolfram, ma nel tempo ci aspettiamo che il suo volume e la sua funzionalità possano crescere in modo significativo, e con la sua crescita emergeranno diverse problematiche che, come già presagiamo, potrebbero sorgere.
Il primo problema riguarda i nomi delle funzioni e la loro unicità. Il repository delle funzioni è progettato in modo tale che, come per le funzioni integrate nel linguaggio Wolfram, è possibile riferirsi a qualsiasi funzione specificando semplicemente il suo nome. Ma questo significa inevitabilmente che i nomi delle funzioni devono essere globalmente unici all'interno del repository, in modo che, ad esempio, possa esserci solo una .
A prima vista ciò potrebbe sembrare un grande problema, ma è importante comprendere che si tratta principalmente della stessa problematica legata a cose come i domini internet o i nomi sui social media. E la verità è che nel sistema è necessario avere un registratore—e questa è una delle funzioni che la nostra azienda svolgerà per la base di conoscenze delle funzioni Wolfram. (Per le versioni private del repository, i loro registratori possono essere gli amministratori.) Certamente, un dominio internet può essere registrato senza avere nulla su di esso, ma nel repository delle funzioni, un nome di funzione può essere registrato solo in presenza di una reale definizione della funzione.
Parte del nostro ruolo nella gestione della base di conoscenza delle funzioni di Wolfram è garantire che il nome scelto per una funzione sia logico in relazione alla definizione della funzione e rispetti le convenzioni di denominazione del Wolfram Language. Abbiamo oltre 30 anni di esperienza nella denominazione delle funzioni incorporate nel linguaggio Wolfram e il nostro team curatoriale porterà questa esperienza anche nel repository delle funzioni. Ci sono certamente sempre eccezioni. Ad esempio, potrebbe sembrare preferibile avere un nome breve per una certa funzione, ma è meglio "proteggersi" con un nome più lungo e specifico, poiché questo riduce le possibilità che qualcun altro voglia creare un nome di funzione simile in futuro.
(È importante notare che l'aggiunta semplice di qualsiasi tag per i partecipanti per eliminare l'ambiguità delle funzioni non porterà l'effetto atteso. Infatti, se non si insiste affinché venga sempre assegnato un tag, occorrerà stabilire un tag predefinito per qualsiasi funzione specificata e anche evidenziare i tag degli autori, il che richiederà nuovamente una coordinazione globale.)
Con la crescita della base di conoscenza delle funzioni Wolfram, una delle problematiche che sicuramente si presenteranno sarà la rintracciabilità delle funzioni, per la quale è previsto nel sistema (e i file di definizione possono includere parole chiave, ecc.). Per le funzioni incorporate nel linguaggio Wolfram, la documentazione presenta vari collegamenti incrociati che aiutano a "promuovere" le funzioni. Le funzioni nel repository delle funzioni possono fare riferimento a funzioni incorporate. E viceversa? Per questo, intendiamo sperimentare diverse schemi per presentare le funzioni del repository nelle pagine di documentazione per le funzioni incorporate.
Per le funzioni incorporate nel linguaggio Wolfram, esiste un cosiddetto livello di rintracciabilità fornito da , che forniscono elenchi organizzati di funzioni relative a specifici ambiti. È sempre difficile bilanciare correttamente le pagine della guida e, man mano che cresce il linguaggio Wolfram, le pagine della guida devono spesso essere completamente riorganizzate. È piuttosto semplice mettere le funzioni del repository in ampie categorie e anche suddividere queste categorie in modo coerente, ma è molto più prezioso avere pagine della guida del linguaggio ben organizzate. Non è ancora chiaro come creare al meglio queste pagine per l'intero knowledge base delle funzioni. Ad esempio, nel repository delle funzioni chiunque possa pubblicare una pagina web con le proprie 'scelte' dal repository:

Il repository delle funzioni Wolfram è impostato come un archivio permanente di funzioni, dove qualsiasi funzione in esso sarà sempre funzionante. Certamente, potrebbero emergere nuove versioni di funzioni, e ci aspettiamo che alcune funzioni diventino obsolete nel tempo. Le funzioni continueranno a funzionare se utilizzate nei programmi, ma le loro pagine di documentazione punteranno a nuove, più avanzate funzioni.
Il repository delle funzioni Wolfram è progettato per ottenere rapidamente nuove funzioni e scoprire nuove opportunità di utilizzo del linguaggio Wolfram. Con grande ottimismo, speriamo che parte di ciò che è stato esplorato nel repository delle funzioni possa alla fine avere senso diventare parti integrate del linguaggio principale Wolfram Language. Negli ultimi dieci anni abbiamo avuto un set simile . E una delle lezioni apprese sulla base di questa esperienza è che raggiungere gli standard di qualità e coerenza, su cui ci concentriamo in tutto ciò che è integrato nel linguaggio Wolfram, richiede molto lavoro, che è spesso più complesso degli sforzi iniziali per implementare l'idea. Ma anche in tal caso, una funzione nella base delle conoscenze può servire come una prova molto utile del concetto di una futura funzione che alla fine potrebbe essere integrata nel linguaggio Wolfram.
Qui l'aspetto più importante è che la funzione nel repository delle funzioni è ciò che è disponibile a ogni utente per l'uso immediato. Sebbene la funzione integrata del linguaggio possa essere notevolmente migliore e più performante, il repository delle funzioni consente agli utenti di accedere immediatamente a tutte le nuove funzionalità. E, cosa particolarmente importante, questo concetto consente a chiunque di aggiungere nuove funzioni personalizzate.
In passato, nella storia del linguaggio Wolfram, questa idea non avrebbe funzionato così bene come oggi, ma a questo punto sono stati investiti così tanti sforzi nel linguaggio, insieme a una comprensione così profonda dei principi di progettazione, che ora sembra molto possibile che una grande comunità di utenti possa aggiungere funzioni che manterranno la coerenza del progetto, rendendole utili per un ampio pubblico.
Nella comunità degli utenti del Wolfram Language c'è uno spirito di talento incredibile. (Naturalmente, questa comunità include molti dei migliori esperti in ricerca e sviluppo in vari campi.) Spero che il Wolfram Function Repository fornisca una piattaforma efficace per rivelare e diffondere questo spirito di talento. Solo insieme potremo creare qualcosa che ampli significativamente il campo di applicazione della paradigma computazionale del linguaggio Wolfram.
Negli oltre 30 anni trascorsi, abbiamo fatto molta strada con il linguaggio Wolfram. Ora, insieme, andiamo oltre. Invitiamo caldamente tutti i rispettabili utenti del linguaggio Wolfram in tutto il mondo a utilizzare il repository delle funzioni come piattaforma, così come il nuovo progetto software Free Wolfram Engine per gli sviluppatori.
Fonte: habr.com
