Référentiel de fonctions Wolfram: plate-forme d'accès ouvert pour les extensions linguistiques Wolfram

Bonjour, Habr! Je vous présente la traduction de l'article de Steven Wolfram "The Wolfram Function Repository: Launching an Open Platform for Extending the Wolfram Language" .



Prérequis de Wolfram Language


Aujourd'hui, nous sommes au bord de grandes réalisations avec la langue Wolfram . Il y a à peine trois semaines, nous avons lancé le moteur Wolfram gratuit pour les développeurs afin d'aider nos utilisateurs à intégrer le langage Wolfram dans leurs projets logiciels à grande échelle. C'est aujourd'hui que nous lançons le référentiel de fonctions Wolfram afin de fournir une plate-forme coordonnée pour les fonctions créées pour étendre le langage Wolfram, et nous ouvrons également le référentiel de fonctions à toute personne pouvant contribuer au développement de notre produit logiciel.


Le Wolfram Function Repository est ce qui est devenu possible grâce aux spécificités uniques du Wolfram Language, non seulement en tant que langage de programmation, mais aussi en tant que langage de calcul à part entière . Dans les langages de programmation traditionnels, l'ajout de nouvelles fonctionnalités importantes implique généralement la création de bibliothèques supplémentaires entières qui peuvent ou non fonctionner lorsqu'elles sont partagées. Cependant, dans Wolfram Language, tant de choses sont déjà intégrées dans le langage lui - même qu'il est possible d'étendre considérablement ses fonctionnalités en ajoutant simplement de nouvelles fonctions qui s'intègrent immédiatement à la structure entière du langage entier.


Par exemple, maintenant dans le référentiel de fonctions Wolfram contient 532 nouvelles fonctions structurées en 26 catégories thématiques:



Comme pour plus de 6000 fonctions standard intégrées au langage Wolfram, chaque fonction du référentiel possède une page de documentation avec une description détaillée et des exemples de travail:



Pour accéder à la page, copiez l'objet ci-dessus (BLOB fonctionnel), collez-le dans la ligne d'entrée puis exécutez la fonction - il est déjà intégré au langage Wolfram et est pris en charge par défaut, à partir de la version 12.0 :



Il convient de noter ici que lors du traitement de LogoQRCode, vous n'avez pas besoin, par exemple, de mettre en place une «bibliothèque pour le traitement d'images» - comme dans Wolfram Language, nous avons déjà mis en œuvre une manière cohérente et entièrement algorithmisée de traiter des images qui peuvent être immédiatement traitées avec diverses fonctions graphiques de la langue:



J'espère que grâce au soutien d'une communauté merveilleuse et talentueuse qui grandit et se développe (basée sur la langue Wolfram) au cours des dernières décennies. Dans un avenir prévisible, le référentiel de fonctions Wolfram élargira considérablement la gamme de fonctions (éventuellement potentiellement importantes, spécialisées dans divers domaines de la science et de la technologie) disponibles dans le langage. Ainsi, il devient possible d'utiliser à la fois le contenu du langage (ses fonctions intégrées) et les principes de développement qui sont mis en œuvre sur la base du langage. (Il convient de noter ici que Wolfram Language a déjà plus de 30 ans d'histoire de développement et de croissance stable ).
À l'intérieur des fonctions du référentiel, il peut y avoir des fragments de code petits ou plutôt volumineux écrits en Wolfram Language. Par exemple, il peut s'agir d'appels à des API et services externes ou à des bibliothèques externes dans d'autres langues . Une caractéristique unique de cette approche est que lorsque vous passez à une fonctionnalité au niveau utilisateur, il n'y aura aucune incohérence possible car cette approche est basée sur la structure convenue de Wolfram Language - et chaque fonction fonctionnera automatiquement correctement - exactement comme et ça devrait l'être.
Le shell et la structure du programme du référentiel de fonctions Wolfram sont configurés de telle manière que chacun peut contribuer à la cause commune de la manière la plus simple et la plus pratique pour lui - en fait, il suffit de remplir le fichier texte du bloc-notes (avec l'extension nb) WL . Les fonctions automatiques intégrées vous permettent de vérifier les nouvelles fonctions ajoutées au référentiel afin de garantir leur intégration dans le langage. Notre entreprise s'appuie sur un large éventail d'utilisateurs qui peuvent intégrer leurs fonctions dans le langage, et non sur les grandes difficultés des nouvelles fonctions - et bien que le processus de vérification soit mis en œuvre ici, nous n'insistons pas sur quelque chose comme une analyse minutieuse de la conception ou des normes strictes pour l'exhaustivité et la fiabilité des nouveaux fonctions utilisateur, contrairement à des vérifications plus approfondies des fonctions intégrées au cœur du langage que nous utilisons.


Il existe de nombreux compromis et détails dans cette approche, mais notre objectif est d'optimiser le référentiel de fonctions Wolfram à la fois pour la commodité des utilisateurs et pour les nouvelles fonctions utilisateur afin d'apporter une contribution tangible au développement du langage. Au fur et à mesure que je grandis, je ne doute pas que nous devrons inventer de nouvelles méthodes de traitement et de vérification des fonctions intégrées dans le référentiel, notamment pour organiser un grand nombre de fonctions et rechercher celles dont les utilisateurs ont besoin. Cependant, il ne peut que rassurer que la voie que nous avons choisie est un bon début. J'ai personnellement ajouté plusieurs fonctionnalités à la base d'origine. Beaucoup d'entre eux sont basés sur du code que j'ai personnellement développé pendant un certain temps. Et je n'ai passé que quelques minutes pour les transmettre au référentiel. Maintenant qu'ils sont dans le référentiel, je peux enfin - immédiatement et à tout moment utiliser ces fonctions au besoin, sans se soucier de trouver des fichiers, de télécharger des packages, etc.


Augmentez l'efficacité tout en réduisant les coûts.


Avant même l'avènement d'Internet, il existait des moyens d'échanger du code Wolfram Language (notre premier grand projet centralisé était MathSource , créé pour Mathematica en 1991 sur la base d'un CD-ROM, etc.). Bien sûr, l'approche proposée basée sur le référentiel de fonctions Wolfram est un outil plus puissant et fiable pour la mise en œuvre des tâches ci-dessus.


Depuis plus de 30 ans, notre entreprise a travaillé dur pour maintenir l'intégrité de la structure du langage Wolfram, ce qui est très important pour que le langage Wolfram devienne non seulement un langage de programmation, mais aussi un langage informatique à part entière . Et donc, l'essence de l'approche de la mise en œuvre du référentiel de fonctions Wolfram est l'utilisation d'une approche unique de la programmation et du développement de nouvelles fonctions qui sont ajoutées séquentiellement et s'inscrivent dans le cadre du langage pour la possibilité de son développement et de son évolution conjointe.


Dans la structure de l'implémentation de chaque fonction, divers processus de calcul se produisent. Il convient de noter ici qu'il est nécessaire que l'utilisateur ait un aspect clair et uniforme et une lisibilité claire. Dans ce contexte, les fonctions intégrées de Wolfram Language fournissent plus de 6 000 exemples consécutifs de programmation correcte des fonctions (il s'agit de nos revues de programmation vidéo en direct qui incluent des centaines d'heures de création de processus de programmation typiques ). Cette approche vous permet en fin de compte de rendre le référentiel de fonctions Wolfram capable d'un bon travail, à savoir la nature structurelle du langage Wolfram Language avec son grand nombre de bibliothèques supplémentaires et diverses qui sont déjà intégrées dans le langage. Par exemple, si vous avez une fonction qui traite des images, ou des tableaux clairsemés , ou des structures moléculaires , ainsi que des données géographiques ou autre - le langage en a déjà une représentation symbolique cohérente, et grâce à cela, votre fonction devient immédiatement compatible avec d'autres fonctions dans la langue.


Créer un référentiel qui fonctionne vraiment bien est une tâche de méta-programmation intéressante. Par exemple, un excès de restrictions dans le programme ne pourra pas obtenir l'unification et l'universalité requises de l'algorithme. Tout comme avec un nombre insuffisant de limitations fonctionnelles, vous ne pouvez pas implémenter une séquence d'exécution d'algorithme suffisamment correcte. Plusieurs exemples précédents du compromis entre ces approches mises en œuvre par notre société ont fonctionné de manière assez stable - ce sont: Le projet de démonstration Wolfram , lancé en 2007 et qui fonctionne maintenant de manière interactive sur Internet et contenant plus de 12000 démos interactives utilisateur. La base de données Wolfram contient plus de 600 bases de données prêtes à l'emploi qui peuvent être utilisées dans le langage Wolfram Language, et le stockage du réseau neuronal Wolfram est mis à jour avec de nouveaux réseaux neuronaux presque chaque semaine (il y en a maintenant 118) et ils sont immédiatement connectés via la fonction NetModel dans le langage Wolfram Language.


Tous les exemples ci-dessus ont une caractéristique fondamentale - les objets et fonctions collectés dans le projet ont un très haut degré de structuration et de distribution des processus. Bien sûr, la granularité de la structure de ce qui est une démonstration ou un réseau de neurones ou quelque chose d'autre peut varier considérablement, mais la structure fondamentale de tout référentiel actuel reste toujours inchangée. Alors, que pensez-vous, cher utilisateur, de la création d'un tel référentiel qui ajoute des extensions au langage Wolfram? Wolfram Language est conçu pour être extrêmement flexible, il peut donc être étendu et modifié de n'importe quelle manière. Cette circonstance est extrêmement importante pour la capacité de créer rapidement divers projets logiciels à grande échelle dans la langue Wolfram. Il convient de noter qu'avec l'augmentation de la flexibilité de la langue, le coût des projets mis en œuvre dans une telle langue augmentera inévitablement. Cela est dû au fait que plus l'utilisateur utilise un tel langage, plus il obtient les fonctionnalités allouées, mais il ne faut pas oublier que cette approche peut avoir des côtés négatifs en termes d'incapacité à assurer une cohérence cohérente des modules du programme.


Dans les langages de programmation traditionnels, il y a un problème commun avec les bibliothèques - si, par exemple, vous utilisez une bibliothèque, le code fonctionne correctement, mais si vous essayez d'utiliser plusieurs bibliothèques, il n'y a aucune garantie qu'elles interagiront correctement entre elles. De plus, dans les langages de programmation traditionnels - contrairement à un langage informatique à part entière - il n'y a aucun moyen de garantir la présence de représentations intégrées cohérentes pour des fonctions ou des types de données autres que leurs structures de base. Mais, en fait, le problème est encore plus grave qu'il n'y paraît à première vue: si quelqu'un construit une verticale de fonctionnalités à grande échelle, alors sans les coûts énormes de la programmation centralisée du projet que nous avons investi dans le langage Wolfram, il est impossible de parvenir à une cohérence. Par conséquent, il est important que tous les modules de programme fonctionnent toujours correctement ensemble.


Ainsi, l'idée du référentiel de fonctions Wolfram est d'éviter le problème mentionné ci-dessus - en ajoutant simplement des extensions au langage sous la forme d'éléments relativement petits de code de programme via des fonctions distinctes, dont le développement sous la forme de modules coordonnés est une tâche plus facile. Dans le même temps, il existe des fonctionnalités de programmation qui ne peuvent pas être rendues pratiques à l'aide de fonctions individuelles (et notre société va publier un algorithme logiciel optimisé dans un proche avenir pour aider à mettre en œuvre des progiciels à grande échelle). Cependant, sur la base des fonctions déjà intégrées au Wolfram Language, il existe de nombreuses options de programmation qui sont implémentées sur la base de fonctions individuelles. L'idée ici est que, avec des efforts de programme relativement faibles, il serait possible de créer un certain nombre de fonctions nouvelles et très utiles qui assureront une cohérence suffisante du projet, tout en étant bien coordonnées les unes avec les autres, et, en outre, elles pourront facilement et largement utilisé dans la langue plus tard.


Cette approche est bien sûr un compromis. Avec l'implémentation d'un package plus grand, vous pouvez imaginer un tout nouveau monde de fonctionnalités qui deviendra extrêmement puissant et utile. S'il est nécessaire d'obtenir de nouvelles fonctionnalités qui s'intégreront dans tout le reste, mais en même temps, vous n'êtes pas prêt à consacrer d'énormes efforts au développement du projet, cela peut malheureusement entraîner une diminution de l'échelle de votre projet. L'idée du référentiel de fonctions Wolfram est de fournir des fonctionnalités à la partie déterminante du projet, cette approche ajoutera des fonctionnalités puissantes, tout en simplifiant le maintien d'une bonne cohérence du projet de programmation.


Aide à l'ajout de fonctions personnalisées au référentiel de fonctions


Les spécialistes de notre entreprise ont travaillé dur pour rendre leur contribution aux fonctions du référentiel Wolfram assez facile pour les utilisateurs. Sur le bureau (déjà dans la version 12.0 ), vous pouvez simplement parcourir séquentiellement les onglets du menu principal: Fichier> Nouveau> RepositoryItem> Function Repository Item et vous obtiendrez un « Definition Notebook » (par programmation dans l'environnement de travail. Vous pouvez également utiliser la fonction analogique - CreateNotebook [ "FunctionResource" ] ):



Vous devrez effectuer deux actions principales: premièrement, écrire réellement le code de votre fonction et, deuxièmement, rédiger une documentation illustrant le fonctionnement de votre fonction.
Cliquez sur le bouton «Ouvrir un échantillon» en haut pour voir un exemple de ce que vous devez faire:



En fait, vous essayez de créer quelque chose de similaire à une fonction intégrée dans Wolfram Language. Sauf qu'elle peut faire quelque chose de beaucoup plus spécifique qu'une fonction en ligne. De plus, les attentes concernant son exhaustivité et sa fiabilité seront beaucoup plus faibles.
Vous devez fournir un nom pour votre fonction qui respecte les directives de dénomination des fonctions Wolfram Language. De plus, vous devrez développer une documentation pour votre fonction, similaire aux fonctions de langage intégrées. Je vais en discuter plus en détail plus tard. Maintenant, faites attention au fait que dans la rangée de boutons en haut du fichier de définition de bloc-notes, il y a un bouton "Style Guide " qui explique ce qu'il faut faire, et un bouton "Tools" qui fournit des outils pour formater la documentation de votre fonction.
Lorsque vous êtes sûr que tout est correctement rempli et que vous êtes prêt, cliquez sur le bouton «Vérifier». Il est parfaitement normal que vous n'ayez pas encore compris tous les détails. Par conséquent, la fonction de vérification s'exécutera automatiquement et effectuera un grand nombre de vérifications de style et de cohérence. Souvent, elle vous demandera immédiatement de confirmer et d'accepter les corrections (par exemple: «Cette ligne doit se terminer par deux points», et elle vous proposera d'entrer deux points). Parfois, elle vous demande d'ajouter ou de modifier quelque chose vous-même. Nous ajouterons constamment de nouvelles fonctionnalités à la fonctionnalité automatique du bouton "Vérifier", mais son objectif principal est de garantir que tout ce que vous envoyez au référentiel de fonctions correspond déjà exactement au plus grand nombre de recommandations de style possible.



Ainsi, après avoir exécuté «Vérifier», vous pouvez utiliser «Aperçu». «Aperçu» crée un aperçu de la page de documentation que vous avez définie pour votre fonction. Vous pouvez également créer un aperçu d'un fichier créé sur votre ordinateur ou d'un fichier situé dans le stockage cloud. Si, pour une raison quelconque, vous n'êtes pas satisfait de ce que vous voyez dans l'aperçu, revenez en arrière et apportez les corrections nécessaires, puis cliquez à nouveau sur le bouton Aperçu.
Vous êtes maintenant prêt à placer votre fonction dans le référentiel. Le bouton Déployer vous offre quatre options:



À cette étape, il est important que vous puissiez envoyer votre fonction au référentiel de fonctions Wolfram afin qu'elle soit disponible pour tout utilisateur. Dans le même temps, vous pouvez également placer votre fonction pour un nombre limité d'utilisateurs. Par exemple, vous pouvez créer une fonction située localement sur votre ordinateur afin qu'elle soit disponible lorsque vous utilisez cet ordinateur particulier. Ou vous pouvez le placer dans votre compte cloud afin qu'il soit disponible lorsque vous êtes connecté au cloud. Vous pouvez également placer (déployer) publiquement une fonction via votre compte cloud. Cependant, il ne sera pas dans le référentiel de fonctions Wolfram central, mais vous pouvez donner à quelqu'un une URL qui lui permettra d'obtenir votre fonction depuis votre compte. (À l'avenir, nous prendrons également en charge les référentiels centraux dans l'ensemble de notre entreprise).


Supposons donc que vous souhaitiez réellement transférer votre fonction vers la base de connaissances des fonctions Wolfram. Pour ce faire, vous cliquez sur le bouton "Envoyer" dans le référentiel. Alors qu'est-ce qui se passe en ce moment? Votre candidature entre immédiatement dans la file d'attente pour examen et approbation par notre équipe spéciale de conservateurs.


Au fur et à mesure que votre demande passe par le processus d'approbation (qui prend généralement plusieurs jours), vous recevrez des messages sur l'état de son examen, ainsi que, éventuellement, des propositions pour son utilisation ultérieure. , Wolfram . ( . .)


?


, , , 6000+ , Wolfram 30 . Wolfram , , Wolfram Language, ( ).


, Wolfram Wolfram Language — , . .


Wolfram, , . Wolfram , , - , . , SendMailFromNotebook . PolygonalDiagram . .


, , , , . , , .


, , , , — Wolfram — , , .


. , . , , API, , . nb ( « ») , , VerificationTest , . , ( , , , ).


. , , . , ? , , , , . , , , , .


( ) , . , Wolfram Data . , ?


. , , . .


, , , Wolfram Language, ? Wolfram Language , UpValues . ( , ), . ( , Wolfram Language, — , , , , , , ).


, ? , Wolfram Language , ( , , ) . : API, Wolfram Cloud , . , , . , , API , . ( «») , Wolfram Language. (, , — , .)


Wolfram Wolfram? , API Wolfram, . , , , Wolfram. ( ExternalEvaluate ExternalFunction Wolfram.)


? , Wolfram Language . , Wolfram Language , . , , . ., Wolfram Language. ( , , ).


, , , , - , , . Wolfram Language, , , , , « » , .


«»


, , Wolfram! - ( ), . , , , .


, , — — . , . ( Wolfram Enterprise , , .)


, Wolfram, ; . «» Unix — « » « », , . ., . , , , .


: « » « Wolfram ». (, ), , , , .


Wolfram, , . « », «». , , . . . , , , , , , .


Git , , , . ( ), , , , .


, «» . , , ( , ). , , . , ResourceUpdate . (« BLOB-» , .)


Wolfram , Wolfram Language . , « » (, ).


, ResourceFunction [ ... ] . , Wolfram Engine, , IDE (c , Free Wolfram Engine ).


Comment ça marche?


Wolfram , ( , Neural Net Repository , ..), Wolfram, ResourceFunction ResourceObject .


ResourceFunction :



, Information :



Comment fonctionne la définition d'une fonction de ressource? Le plus simple est un cas purement local. Voici un exemple qui prend une fonction (dans ce cas, juste une fonction pure) et la définit comme une fonction de ressource pour une session donnée dans le programme:



Après avoir fait la définition, vous pouvez utiliser la fonction de ressource:



Notez qu'il y a une icône noire dans ce blob de fonction. . Cela signifie qu'une fonction BLOB fait référence à une fonction de ressource en mémoire définie pour la session en cours. Pour la fonction de ressource, qui est constamment stockée sur votre ordinateur ou dans un compte cloud, il y a une icône grise . Et pour la fonction de ressource officielle dans le référentiel de fonctions Wolfram, il y a une icône orange .


Que se passe-t-il donc lorsque vous utilisez le menu Déployer dans le carnet de définitions? Tout d'abord, il prend toutes les définitions dans le bloc-notes et crée à partir d'eux un ResourceObject symbolique). (Et si vous utilisez un IDE ou un programme de texte, vous pouvez également créer explicitement un ResourceObject )


Le déploiement local de la fonction à partir du référentiel sur votre ordinateur est effectué à l'aide de la commande LocalCache pour l'objet ressource afin de l'enregistrer en tant que LocalObject dans votre système de fichiers. Le déploiement dans le compte cloud est effectué à l'aide de la commande CloudDeploy pour l'objet ressource, et le déploiement public dans le cloud est effectué à l'aide de CloudPublish . Dans tous les cas, ResourceRegister est également utilisé pour enregistrer le nom de la fonction de ressource, afin que ResourceFunction [ "nom" ] fonctionne.


Si vous cliquez sur le bouton Soumettre pour le référentiel de fonctions, ce qui se passe sous ResourceSubmit est appelé sur l'objet ressource. (Et si vous utilisez une interface de saisie de texte, vous pouvez également appeler ResourceSubmit directement.)


Par défaut, l'envoi s'effectue sous le nom associé à votre identifiant Wolfram. Mais si vous soumettez une demande au nom d'un groupe ou d'une organisation de développement, vous pouvez définir un identifiant d'éditeur distinct et l'utiliser à la place comme nom pour interagir avec vos soumissions.


Une fois que vous avez envoyé l'une de vos fonctions à la base de connaissances des fonctions, elle tombera dans la file d'attente pour vérification. Si vous recevez des commentaires en réponse, ils se présentent généralement sous la forme d'un fichier texte avec des «cellules de commentaire» supplémentaires. Vous pouvez toujours vérifier l'état de votre demande en vous rendant sur le portail du participant au système de ressources . Mais dès que votre fonction est approuvée, vous en serez averti (par email) et votre fonction sera placée dans le référentiel de fonctions Wolfram.


Quelques subtilités dans le travail


À première vue, vous pourriez avoir l'impression que vous pouvez simplement prendre le cahier de définitions et le placer textuellement dans le référentiel de fonctions, cependant, il existe en fait quelques subtilités - et pour les traiter, vous devez effectuer une méta-programmation assez complexe, le traitement de caractères comme code définissant la fonction et la définition du bloc-notes lui-même. La plupart de cela se produit en interne, c'est-à-dire «en coulisses», mais cela peut avoir des conséquences qui méritent d'être comprises si vous voulez contribuer à la base de connaissances des fonctions.


Première subtilité immédiate: lorsque vous remplissez le bloc-notes de définition, vous pouvez simplement référencer votre fonction partout, en utilisant un nom comme MyFunction , qui ressemble à un nom normal pour une fonction dans Wolfram Language, mais pour la documentation du référentiel de fonctions, il est remplacé par ResourceFunction [ "MyFunction " ] - c'est exactement ce que les utilisateurs utiliseront réellement lorsqu'ils travailleront avec la fonction.


Deuxième subtilité: lorsque vous créez une fonction ressource à partir du Bloc-notes de définition, toutes les dépendances impliquées dans la définition de la fonction doivent être fixes et explicitement incluses. Cependant, pour vous assurer que les définitions restent modulaires, vous devez tout placer dans un espace de noms unique. (Bien sûr, les fonctions qui font tout cela sont dans le référentiel de fonctions.)


Habituellement, vous ne verrez jamais de trace du code utilisé pour configurer cet espace de noms. Mais si pour une raison quelconque vous appelez un symbole sous-exécuté à l'intérieur de votre fonction, vous verrez que ce symbole est dans le contexte interne de la fonction. Cependant, lors du traitement des définitions du Bloc-notes, au moins le caractère correspondant à la fonction elle-même est configuré pour s'afficher au mieux en tant que BLOB fonctionnel plutôt qu'en tant que caractère brut dans le contexte interne.


Le référentiel de fonctions est destiné à définir de nouvelles fonctions. Et ces fonctions peuvent avoir des options. Souvent, ces paramètres (par exemple, Method ou ImageSize ) pourront être utilisés pour les fonctions intégrées, ainsi que pour celles pour lesquelles des caractères intégrés existent déjà. Mais parfois, de nouvelles fonctionnalités peuvent nécessiter de nouvelles options. Afin de préserver la modularité, il est nécessaire que ces paramètres soient des symboles définis dans un contexte interne unique (ou quelque chose comme des fonctions de ressources entières, c'est-à-dire isolément). Par souci de simplicité, le référentiel de fonctions vous permet de définir de nouvelles options dans les définitions sous forme de chaînes. Et pour la commodité de l'utilisateur, ces définitions (à condition qu'elles utilisent OptionValue et OptionsPattern ) sont également traitées de sorte que lorsque vous utilisez des fonctions, les paramètres peuvent être définis non seulement sous forme de chaînes, mais également sous forme de caractères globaux portant les mêmes noms.


La plupart des fonctions font simplement ce qu'elles devraient faire chaque fois qu'elles sont appelées, mais certaines fonctions doivent être initialisées avant de pouvoir fonctionner dans une session particulière - et pour résoudre ce problème, il existe une section intitulée Initialisation dans la section Définition.


Les fonctions du référentiel peuvent utiliser d'autres fonctions qui sont déjà dans le référentiel, afin de configurer les définitions du référentiel de fonctions qui incluent deux (ou plus) fonctions qui se référencent, vous devez les développer dans votre session avec le programme afin que vous puissiez vous référer sur eux comme ResourceFunction [ "nom" ] , alors vous pouvez créer les combinaisons de ces fonctions dont vous avez besoin comme exemples (je n'ai pas compris) et ajouter une nouvelle fonction au référentiel basée sur celles déjà placées. (ou déjà ou plus tôt - les deux mots sont maladroits)


Perspectives de développement. Que doit-il se passer lorsque le référentiel devient vraiment gros?


Aujourd'hui, nous ne faisons que lancer le référentiel de fonctions Wolfram, mais au fil du temps, nous nous attendons à ce qu'il (supprime) son volume et ses fonctionnalités puissent augmenter considérablement, et à mesure qu'il grandira, divers problèmes surgiront qui, comme nous le supposons déjà, peuvent survenir.


Le premier problème concerne les noms de fonction et leur unicité. Le référentiel de fonctions est conçu de telle manière que, comme pour les fonctions intégrées dans Wolfram Language, vous pouvez faire référence à n'importe quelle fonction en spécifiant simplement son nom. Mais cela signifie inévitablement que les noms de fonction doivent être globalement uniques dans tout le référentiel, de sorte que, par exemple, il ne peut y avoir qu'une seule ResourceFunction [ "MyFavoriteFunction" ] dans le référentiel.


À première vue, cela peut sembler être un gros problème, mais vous devez comprendre qu'il s'agit essentiellement du même problème que pour des choses comme les domaines Internet ou les marqueurs de réseaux sociaux. Et le fait est que dans le système, il est simplement nécessaire d'avoir un registraire - et c'est l'un des rôles que notre entreprise va jouer pour la base de connaissances des fonctions Wolfram. (Pour les versions privées du référentiel, les administrateurs peuvent être leurs bureaux d'enregistrement.) Bien sûr, le domaine Internet peut être enregistré sans avoir rien dessus, mais dans le référentiel de fonctions, le nom de la fonction ne peut être enregistré que s'il existe une définition réelle de la fonction.


Une partie de notre rôle dans la gestion de la base de connaissances des fonctions Wolfram consiste à garantir que le nom que vous sélectionnez pour la fonction est cohérent avec la définition de la fonction et qu'il est conforme aux conventions de dénomination de Wolfram Language. Nous avons plus de 30 ans d'expérience dans la dénomination de fonctions intégrées dans la langue Wolfram, et notre équipe de curateurs (curateurs?) Transférera également cette expérience au référentiel de fonctions. Bien sûr, il y a toujours des exceptions. Par exemple, il peut sembler préférable d'avoir un nom court pour une fonction, mais il est préférable de «défendre» avec un nom plus long et plus spécifique, car il est moins probable que quelqu'un veuille créer un nom de fonction similaire à l'avenir.


(Il convient de noter ici que le simple fait d'ajouter une balise de participant pour éliminer l'ambiguïté des fonctions n'apportera pas l'effet attendu. Parce que si vous n'insistez pas pour toujours attribuer une balise, vous devrez définir une balise par défaut pour une fonction donnée, ainsi que mettre en surbrillance tags d'auteur, qui nécessiteront à nouveau une coordination globale.)


Au fur et à mesure que la base de connaissances des fonctions Wolfram se développe, l'un des problèmes susceptibles de se poser est la détectabilité des fonctions, pour cela la fonction de recherche est fournie dans le système (et les fichiers de définition peuvent inclure des mots clés, etc.). Pour les fonctions intégrées dans Wolfram Language, la documentation contient toutes sortes de références croisées qui aident à «publier» les fonctions. Les fonctions d'un référentiel de fonctions peuvent référencer des fonctions intégrées. Mais qu'en est-il de l'inverse? Pour ce faire, nous allons expérimenter différents schémas pour présenter les fonctions de référentiel sur les pages de documentation des fonctions intégrées.


Pour les fonctions intégrées dans Wolfram Language, il existe un soi-disant niveau de détection fourni par un réseau de "pages d'aide" qui fournissent des listes organisées de fonctions liées à des domaines spécifiques. Il est toujours difficile d'équilibrer correctement les pages de manuel, et à mesure que Wolfram grandit, les pages de manuel doivent souvent être complètement réorganisées. Il est assez simple de classer les fonctions du référentiel en grandes catégories et même de décomposer ces catégories de manière séquentielle, mais il est beaucoup plus utile d'avoir des pages de manuel de langue correctement organisées. Il n'est pas encore clair comment les créer au mieux pour l'ensemble de la base de connaissances des fonctions. Par exemple, CreateResourceObjectGallery dans le référentiel de fonctions, chacun peut placer une page Web contenant ses "choix" dans le référentiel:



Le référentiel de fonctions Wolfram est configuré comme un référentiel permanent de fonctions, où toute fonction qu'il contient fonctionnera toujours. Bien sûr, de nouvelles versions de fonctions peuvent apparaître et nous nous attendons à ce que certaines fonctions deviennent certainement obsolètes avec le temps. Les fonctions fonctionneront si elles sont utilisées dans des programmes, mais leurs pages de documentation seront liées à de nouvelles fonctions plus avancées.


Le référentiel de fonctionnalités Wolfram est conçu pour obtenir rapidement de nouvelles fonctionnalités et explorer de nouvelles utilisations du langage Wolfram. Avec beaucoup d'optimisme, nous espérons qu'une partie de ce qui a été étudié dans le référentiel de fonctions aura finalement un sens pour devenir des parties intégrées du langage principal de Wolfram Language. Au cours de la dernière décennie, nous avions un ensemble similaire de fonctionnalités qui ont été initialement introduites dans Wolfram | Alpha Et l'une des leçons tirées de cette expérience est qu'il faut beaucoup de travail pour atteindre des normes de qualité et de cohérence sur lesquelles nous nous concentrons dans tout ce qui est intégré à Wolfram, ce qui est le plus souvent l'effort initial. introduire des idées. Mais même dans ce cas, une fonction dans la base de connaissances des fonctions peut servir de preuve très utile du concept d'une fonction future, qui peut finalement être intégrée dans le langage Wolfram.


La chose la plus importante ici est que la fonction dans le référentiel de fonctions est ce qui est disponible pour tous les utilisateurs en ce moment. La fonctionnalité de langage intégré peut être bien meilleure et plus productive, mais le référentiel de fonctions permettra aux utilisateurs d'accéder immédiatement à toutes les nouvelles fonctionnalités. Et, plus important encore, ce concept permet à chacun d'ajouter n'importe laquelle de ses nouvelles fonctionnalités.


Auparavant, dans l'histoire de la langue Wolfram, cette idée n'aurait pas fonctionné aussi bien qu'elle l'est maintenant, mais à ce stade, tant d'efforts ont déjà été déployés dans la langue, ainsi qu'une compréhension si profonde des principes de conception du langage qu'il semble désormais très possible pour une grande communauté d'utilisateurs d'ajouter des fonctions qui Maintenir la cohérence des projets pour les rendre utiles à un large éventail d'utilisateurs.


La communauté des utilisateurs de Wolfram Language possède un incroyable esprit de talent (?). (Bien sûr, cette communauté comprend de nombreux experts R&D de premier plan dans un large éventail de domaines.) J'espère que le Wolfram Feature Repository fournit une plate-forme efficace pour libérer et diffuser cet esprit de talent. Ce n'est qu'ensemble que nous pourrons créer quelque chose qui élargira considérablement la zone à laquelle le paradigme de calcul Wolfram peut être appliqué.


Depuis plus de 30 ans, nous avons parcouru un long chemin dans la langue Wolfram. Maintenant, ensemble, allons encore plus loin. J'exhorte tous les utilisateurs respectés de Wolfram dans le monde à utiliser un référentiel fonctionnel ainsi qu'un nouveau projet logiciel comme le moteur gratuit Wolfram pour les développeurs comme plate-forme pour cela.

Source: https://habr.com/ru/post/fr472914/


All Articles