Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Olá, Habr! Tenho o prazer de apresentar a vocês a tradução do post de Stephen Wolfram «O Repositório de Funções Wolfram: Lançando uma Plataforma Aberta para Expandir a Linguagem Wolfram».

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

As bases para a viabilidade da linguagem Wolfram

Hoje estamos à beira de grandes realizações junto com a linguagem de programação Wolfram Language. Há apenas três semanas, lançamos um motor Wolfram gratuito para desenvolvedores, para ajudar nossos usuários a integrar a linguagem Wolfram Language em seus grandes projetos de software. Hoje, estamos lançando o repositório de funções Wolfram, para fornecer uma plataforma coordenada para funções criadas para expandir a linguagem Wolfram, e também abrimos um repositório de funções para qualquer um que possa contribuir para o desenvolvimento do nosso produto de software.

O repositório de funções (Function Repository) Wolfram é algo que se tornou possível graças à singularidade da Wolfram Language, não apenas como uma linguagem de programação, mas sim como uma linguagem de computação completa. Em linguagens de programação tradicionais, adicionar novas funções significativas normalmente envolve a criação de bibliotecas adicionais inteiras, que podem ou não funcionar bem em conjunto. No entanto, na linguagem Wolfram Language tanta coisa já está embutida na própria linguagem, que é possível expandir significativamente sua funcionalidade, simplesmente adicionando novas funções, que se integram instantaneamente à estrutura holística de toda a linguagem.

Por exemplo, já existem no repositório de funções Wolfram 532 novas funções estruturadas em 26 categorias temáticas:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Semelhante a mais de 6000 funções padrões, embutidas na linguagem Wolfram, cada função do repositório possui uma página de documentação com descrições detalhadas e exemplos de uso:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Para acessar a página, copie o objeto acima (BLOB funcional), cole-o na linha de entrada e então execute a função – ela já está embutida na linguagem Wolfram e é suportada por padrão, começando com a versão 12.0:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Aqui deve-se notar que ao processar LogoQRCode Não é necessário, por exemplo, configurar uma «biblioteca para processamento de imagens» — pois na linguagem Wolfram Language já implementamos um método sequencial e cuidadosamente algoritmizado de processamento de imagens, que podem ser processadas imediatamente por várias funções gráficas da linguagem:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Espero que com o apoio de uma comunidade maravilhosa e talentosa, que tem crescido e se expandido (baseada na linguagem Wolfram) nas últimas décadas. O repositório de funções Wolfram permitirá, num futuro próximo, expandir significativamente a gama de funções (potencialmente significativas e especializadas em várias áreas do conhecimento em ciência e tecnologia) disponíveis na linguagem. Assim, surge a possibilidade de usar tanto o conteúdo da linguagem (suas funções embutidas), quanto os princípios de desenvolvimento, que são implementados com base na linguagem. (Aqui é importante notar que a linguagem Wolfram já possui mais de 30 anos de desenvolvimento e crescimento estável.).
Dentro das funções do repositório podem haver pequenos ou bastante extensos fragmentos de código escritos na linguagem Wolfram. Por exemplo, isso pode incluir chamadas de APIs externas e serviços ou bibliotecas externas em outras linguagens.. Uma característica única dessa abordagem é que, ao mudar para a funcionalidade em nível de usuário, não haverá possíveis desajustes, uma vez que essa abordagem é baseada em uma estrutura coerente da linguagem Wolfram — e cada função funcionará corretamente de acordo com o que se espera dela.
A interface e a estrutura programática do repositório de funções Wolfram estão configuradas de forma que qualquer pessoa possa contribuir para o esforço comum da maneira mais simples e conveniente para si — basicamente, apenas preenchendo um arquivo de texto de bloco de notas (com a extensão nb) WL. Funções automáticas embutidas permitem verificar as novas funções adicionadas ao repositório para garantir sua integração na linguagem. Nossa empresa aposta em um amplo conjunto de usuários que podem integrar suas funções na linguagem, ao invés de grandes complexidades de novas funções — e embora haja um processo de verificação implementado, não insistimos em algo como uma análise meticulosa da estrutura ou em padrões rigorosos de completude e confiabilidade das novas funções dos usuários, ao contrário de verificações mais rigorosas das funções embutidas no núcleo da linguagem, que aplicamos.

Neste approach, existem muitos compromissos e detalhes, mas nosso objetivo é otimizar o repositório de funções Wolfram tanto para a conveniência dos usuários quanto para garantir que novas funções dos usuários contribuam significativamente para o desenvolvimento da linguagem. À medida que crescemos, não tenho dúvidas de que precisaremos inventar novos métodos para processar e verificar funções incorporadas no repositório, especialmente para organizar um grande número de funções e encontrar aquelas que são necessárias aos usuários. No entanto, é encorajador que o caminho que escolhemos é um bom começo. Eu pessoalmente acrescentei algumas funções na base inicial. Muitas delas são baseadas em código que desenvolvi pessoalmente ao longo de um tempo considerável. E eu levei apenas alguns minutos para enviá-las ao repositório. Agora que estão no repositório, posso finalmente — de forma imediata e a qualquer momento — usar essas funções conforme necessário, sem me preocupar em procurar arquivos, carregar pacotes, etc.

Aumentar a eficiência enquanto reduz custos

Muito antes da chegada da Internet, já havia maneiras de compartilhar código da Wolfram Language (nosso primeiro grande projeto centralizado foi MathSource, criado para Mathematica em 1991 com base em CD-ROM, etc.). Sem dúvida, a abordagem proposta para implementar o repositório de funções Wolfram é um meio mais poderoso e confiável para realizar as tarefas mencionadas.

Por mais de 30 anos, nossa empresa trabalhou arduamente para manter a integridade da estrutura da linguagem Wolfram, e isso é muito importante para que a linguagem Wolfram se torne não apenas uma linguagem de programação, mas um linguagem computacional completa. Assim, a essência da abordagem para implementar o repositório de funções Wolfram é usar uma abordagem única para programação e desenvolvimento de novas funções, que são adicionadas de forma consistente e se encaixam nos limites da linguagem para possibilitar seu desenvolvimento e evolução conjunta.

Na estrutura de implementação de cada função, ocorrem diversos processos computacionais. É importante destacar que a função deve ter uma aparência clara e uniforme, assim como legibilidade para o usuário. Nesse contexto, as funções integradas da linguagem Wolfram Language são apresentadas através de mais de 6000 exemplos sequenciais de como programar funções corretamente (estes são nossos vídeos de programação ao vivo, que incluem centenas de horas do processo de criação de programas padrão). Essa abordagem, em última análise, permite que o repositório de funções Wolfram opere de forma eficaz, devido à natureza estrutural da linguagem Wolfram Language com sua vasta gama de bibliotecas adicionais e variadas já integradas à linguagem. Por exemplo, se você possui uma função que processa imagens ou arrays esparsos, ou estruturas moleculares, além de dados geográficos ou quaisquer outros — a linguagem já possui uma representação simbólica coerente deles, e por isso, sua função imediatamente se torna compatível com outras funções na linguagem.

Criar um repositório que realmente funcione bem é uma tarefa interessante de metaprogramação. Por exemplo, um excesso de restrições no programa não permitirá a unificação desejada e a versatilidade do funcionamento do algoritmo. Assim como, com uma quantidade insuficiente de restrições funcionais, você não conseguirá implementar uma sequência de execução do algoritmo suficientemente correta. Alguns dos exemplos anteriores de implementação do compromisso entre esses abordagens, realizadas pela nossa empresa, funcionaram de forma bastante estável — são: Projeto Wolfram Demonstrations, lançado em 2007 e agora operando de forma interativa na internet, contendo mais de 12000 demonstrações interativas criadas por usuários. Na base de dados Wolfram há mais de 600 bases de dados prontas que podem ser usadas na linguagem Wolfram Language, e o repositório de redes neurais Wolfram é atualizado com novas redes neurais praticamente todas as semanas (agora já são 118) e elas são imediatamente conectadas através da função NetModel na linguagem Wolfram Language.

Todos os exemplos acima têm uma característica fundamental — os objetos e funções coletados no projeto possuem um alto grau de estruturação e distribuição de processos. Sem dúvida, a detalhação da estrutura do que representa uma demonstração, uma rede neural ou algo diferente pode variar bastante, mas a estrutura fundamental de qualquer repositório existente permanece invariável. Qual é a sua opinião, prezado usuário, sobre a criação de um repositório que adicione extensões à linguagem Wolfram? A linguagem Wolfram Language foi projetada para ser extremamente flexível, podendo ser expandida e modificada de diversas maneiras. Essa flexibilidade é crucial para a rápida criação de projetos de software em grande escala na linguagem Wolfram. É importante notar que, à medida que a flexibilidade da linguagem aumenta, o custo dos projetos desenvolvidos nesse idioma também inevitavelmente cresce. Isso ocorre porque quanto mais o usuário utiliza essa linguagem, mais funcionalidades dedicadas ele obtém, mas não devemos esquecer que essa abordagem pode ter desvantagens em termos de consistência entre os módulos de software.

Em linguagens de programação tradicionais, existe um problema comum com bibliotecas — se você usar uma biblioteca, por exemplo, o código funciona corretamente, mas se tentar usar várias bibliotecas, não há garantia de que elas interajam corretamente. Além disso, nas linguagens de programação tradicionais — ao contrário de uma linguagem de computação completa — não há possibilidade de garantir que existam representações integradas consistentes para qualquer função ou tipo de dado, exceto suas estruturas básicas. Porém, o problema é ainda maior do que parece à primeira vista: se alguém constrói uma funcionalidade vertical em grande escala, torna-se impossível alcançar consistência sem enormes custos de programação centralizada, os quais investimos na linguagem Wolfram. Portanto, é fundamental que todos os módulos de software funcionem corretamente em conjunto.

Assim, a ideia do repositório de funções Wolfram é evitar o problema mencionado acima — simplesmente adicionando extensões à linguagem na forma de elementos de código relativamente pequenos por meio de funções separadas, cujo desenvolvimento como módulos coerentes é uma tarefa mais simples. No entanto, existem características de programação que não podem ser tornadas convenientes com funções separadas (e nossa empresa planeja lançar em breve um algoritmo de software otimizado para ajudar na implementação de pacotes de software em larga escala). Contudo, com base nas funções já integradas na linguagem Wolfram Language, existem muitas oportunidades de programação que são realizadas com base em funções separadas. A ideia aqui é que, com um esforço de programação relativamente pequeno, é possível criar uma série de novas funções muito úteis que garantirão uma coerência suficiente ao projeto, além de serem bem integradas entre si e, por outro lado, possuírem a capacidade de serem facilmente e amplamente utilizadas na linguagem no futuro.

Esta abordagem, sem dúvida, é um compromisso. Com a implementação de um pacote mais amplo, podemos imaginar um mundo totalmente novo de funcionalidade, que se tornará extremamente poderoso e útil. Se há necessidade de obter novas funcionalidades que se encaixem em tudo o mais, mas você não está disposto a dedicar enormes esforços ao desenvolvimento do projeto, isso pode, infelizmente, levar a uma redução na escala do seu projeto. A ideia do repositório de funções Wolfram é fornecer a funcionalidade que define a parte do projeto, e essa abordagem permitirá adicionar um funcionalismo poderoso, ao mesmo tempo em que simplifica a manutenção de uma boa coerência no projeto de programação.

Ajuda na adição de funções personalizadas ao repositório de funções

Os especialistas da nossa empresa trabalharam arduamente para tornar a contribuição para as funções do repositório Wolfram bastante fácil para os usuários. Na área de trabalho (já em a versão 12.0), você pode simplesmente navegar pelas abas do menu principal: Arquivo > Novo > RepositórioItem > Item do Repositório de Funções e você obterá «Caderno de Definições» (programaticamente dentro do ambiente de trabalho. Você também pode usar a função análoga — CreateNotebook[«FunctionResource»]):

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Existem duas ações principais que você precisará realizar: primeiro, realmente escrever o código da sua função e, em segundo lugar, escrever a documentação que ilustra como sua função deve funcionar.
Clique no botão «Abrir amostra» na parte superior para ver um exemplo do que você precisa fazer:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Na verdade, você está tentando criar algo semelhante a uma função embutida na linguagem Wolfram Language. Exceto que ela pode fazer algo muito mais específico do que a função embutida. As expectativas em relação à sua completude e confiabilidade serão muito mais baixas.
Você precisa dar um nome para sua função que siga os princípios de nomenclatura das funções da Wolfram Language. Além disso, você precisará desenvolver documentação para sua função, semelhante às funções embutidas da linguagem. Vou falar mais sobre isso depois. Por agora, apenas observe que na linha de botões na parte superior do arquivo do caderno de definições há um botão «Recomendações de Estilo», que explica o que fazer, e um botão «Ferramentas», que fornece um conjunto de ferramentas para formatar a documentação da sua função.
Quando você tiver certeza de que tudo está preenchido corretamente e você estiver pronto, clique no botão «Verificar». É perfeitamente normal que você ainda não tenha entendido todos os detalhes. Portanto, a função «Verificar» será executada automaticamente e fará muitas verificações de estilo e consistência. Muitas vezes, ela imediatamente lhe oferecerá confirmar e aceitar correções (Por exemplo: «Esta linha deve terminar com dois pontos», e ela sugerirá inserir os dois pontos). Às vezes, ela pedirá que você adicione ou altere algo por conta própria. Estaremos constantemente adicionando novas funcionalidades ao recurso automático do botão «Verificar», mas seu objetivo principal é garantir que tudo que você enviar ao repositório de funções já esteja de acordo com o maior número possível de recomendações de estilo.

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Assim, após clicar em "Check", você pode usar "Preview". "Preview" cria uma visualização da página de documentação que você definiu para sua função. Você também pode criar uma visualização para um arquivo que foi salvo em seu computador ou um arquivo armazenado na nuvem. Se, por algum motivo, você não estiver satisfeito com o que vê na visualização, basta voltar e fazer as correções necessárias, e então clique novamente no botão Preview.
Agora você está pronto para publicar sua função no repositório. O botão Deploy oferece quatro opções de ação:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Neste passo, é importante notar que você pode enviar sua função para o repositório de funções Wolfram, para que ela esteja disponível para qualquer usuário. Você também pode limitar a disponibilidade da sua função a um número restrito de usuários. Por exemplo, você pode criar uma função que fique localmente em seu computador, tornando-a acessível apenas quando você utilizar esse computador específico. Ou você pode publicá-la em sua conta na nuvem, para que ela esteja acessível a você sempre que estiver conectado à nuvem. Você também pode publicar (implantar) sua função publicamente através de sua conta na nuvem. Embora não apareça no repositório central de funções Wolfram, você poderá fornecer a alguém a URL que permitirá o acesso à sua função a partir de sua conta. (No futuro, também iremos suportar repositórios centrais em escala de toda a nossa empresa).

Então, suponha que você deseje realmente enviar sua função para a base de conhecimento de funções Wolfram. Para isso, você clica no botão "Enviar" para o repositório. O que acontece nesse momento? Sua solicitação vai diretamente para a fila de análise e aprovação da nossa equipe especial de curadores.

À medida que sua solicitação passa pelo processo de aprovação (que geralmente leva alguns dias), você receberá mensagens sobre o status da revisão dela, além de possíveis sugestões para seu uso posterior. Mas, assim que sua função for aprovada, ela será imediatamente publicada no repositório de funções Wolfram e ficará disponível para qualquer uso. (E isso será exibido em resumos de notícias de novas funções etc.)

O que deve estar no repositório?

Vale ressaltar que nossa empresa tem padrões muito altos de completude, confiabilidade e qualidade geral; das mais de 6000 funções que já incorporamos à linguagem Wolfram nos últimos 30 anos, todas atendem a esses critérios. O objetivo do repositório de funções Wolfram é utilizar toda a estrutura e as funcionalidades que já existem na linguagem Wolfram Language para adicionar o maior número possível de funções muito mais leves (ou seja, funções com maior desempenho).

Certamente, as funções no repositório de funções Wolfram devem estar em conformidade com os princípios de desenvolvimento da linguagem Wolfram Language — para que possam interagir plenamente com outras funções e com as expectativas dos usuários sobre como as funções devem funcionar corretamente. No entanto, as funções não precisam ter o mesmo nível de completude ou confiabilidade.

Nas funções incorporadas da linguagem Wolfram, trabalhamos arduamente para tornar as funções programáticas o mais gerais possível. Ao mesmo tempo, não há nada de errado em ter uma função no repositório de funções Wolfram que simplesmente trate um caso muito específico, mas útil. Por exemplo, a função SendMailFromNotebook pode receber arquivos em um formato específico e criar e-mails de uma certa maneira. PolygonalDiagram cria diagramas apenas com certas cores e marcações, etc.

Outro ponto relacionado às funções incorporadas é que nossa empresa se empenha ao máximo para tratar todos os casos atípicos, para garantir o correto manuseio de entradas inválidas e assim por diante. No repositório de funções, é totalmente normal que existe uma função especial que lida com os casos principais de uma tarefa e ignora todos os outros.

É evidente que é melhor ter funções que fazem mais e fazem melhor, mas a otimização para o repositório de funções — ao contrário das funções incorporadas da linguagem Wolfram — deve ter mais funções interligadas com um maior número de funcionalidades, em vez de se aprofundar nos processos de implementação de cada função específica.

Agora, vamos considerar um exemplo de testes de funções no repositório. As expectativas de consistência para tais funções são naturalmente muito mais baixas do que para as funções incorporadas da linguagem. Isso é ainda mais relevante em situações em que as funções dependem de recursos externos, como APIs, sendo importante realizar testes consistentes continuamente, o que acontece automaticamente dentro dos algoritmos de verificação. No arquivo nb, você pode especificar explicitamente as definições (na seção "Informações adicionais") e definir quantos testes considerar necessários, seja com base nas entradas e saídas ou em objetos simbólicos completos do tipo VerificationTest, conforme achar necessário. Além disso, o sistema tentará constantemente transformar os exemplos de documentação que você forneceu em um processo de verificação (embora isso possa ser bastante exigente em termos de recursos, por exemplo, para funções cujo resultado depende de números aleatórios ou do horário do dia).

Como resultado, haverá uma série de complexidades de implementação no repositório de funções. Algumas serão apenas uma linha de código, outras podem envolver milhares ou até dezenas de milhares de linhas, provavelmente utilizando várias funções auxiliares. Em que casos vale a pena adicionar uma função que requer muito pouco código para a sua definição? Em princípio, se a função tiver um bom nome mnemônico, que os usuários entenderiam facilmente ao ver isso no código, então já pode ser adicionado. Caso contrário, provavelmente é melhor apenas reescrever o código da sua programação toda vez que precisar utilizá-lo.

O principal objetivo do repositório de funções (como o próprio nome sugere) é introduzir novas funcionalidades na linguagem. Se você deseja adicionar novos dados ou novas entidades, use repositório Wolfram Data. Mas o que fazer se você quiser introduzir novos tipos de objetos para seus cálculos?

Na verdade, existem duas abordagens. Você pode querer introduzir um novo tipo de objeto que será utilizado em novas funções no repositório de funções. E, neste caso, você pode simplesmente registrar sua representação simbólica e usá-la ao inserir ou retirar funções do repositório de funções.

Mas o que fazer se você quiser representar um objeto e, em seguida, definir, através das funções existentes na linguagem Wolfram Language, aquelas que devem funcionar em conjunto com ele? Para isso, a Wolfram Language sempre teve um mecanismo simples chamado UpValues. Com algumas limitações (especialmente para funções que não podem avaliar seus argumentos), o repositório de funções permite que você simplesmente represente uma função e defina valores para ela. (Para aumentar a expectativa de consistência ao criar uma nova construção importante, totalmente integrada em toda a linguagem Wolfram Language, esta é, em geral, uma procedimento muito importante que não pode ser alcançado apenas aumentando o custo do projeto e isso é o que nossa empresa faz em projetos de longo prazo de desenvolvimento da linguagem, essa tarefa não é um objetivo estabelecido no desenvolvimento do repositório).

Então, o que pode haver no código de funções no repositório de funções? Tudo o que está embutido na linguagem Wolfram Language, claro (pelo menos se isso não comprometer de uma ameaça para segurança e a funcionalidade do próprio programa, como meio computacional) assim como qualquer função do repositório de funções. Nesse sentido, existem outras possibilidades de funcionamento: a função no repositório de funções pode chamar uma API, ou Wolfram Cloud, ou de outra fonte.. Certamente, existem alguns riscos associados a isso. Devido à falta de garantias de que a API não mudará, a função no repositório de funções pode deixar de funcionar. Para identificar tais problemas, há uma nota na página da documentação (na seção 'Requisitos') para qualquer função que dependa não apenas da funcionalidade embutida da Wolfram Language. (É importante notar que, quando se trata de dados reais, podem haver problemas mesmo com essa funcionalidade — porque os dados reais do mundo estão em constante mudança e, às vezes, até mesmo mudam suas definições e estruturas.)

Todo o código para o repositório de funções Wolfram deve ser escrito na linguagem Wolfram? Definitivamente, o código dentro da API externa não deve ser escrito na linguagem Wolfram, pois isso não o torna código da linguagem. Na verdade, se você encontrar uma função em quase qualquer linguagem externa ou biblioteca, poderá criar uma camada que permita utilizá-la no repositório de funções Wolfram. (Normalmente, isso deve ser feito usando funções embutidas. ExternalEvaluate ou ExternalFunction na linguagem Wolfram.)

Então, qual é o sentido de fazer isso? Essencialmente, isso permite usar todo o sistema integrado da Wolfram Language e todo o seu conjunto unificado de capacidades de programação. Se você obtiver uma implementação básica de uma biblioteca ou linguagem externa, poderá então usar a rica estrutura simbólica da Wolfram Language para criar uma função de alto nível que permita aos usuários utilizarem facilmente qualquer funcionalidade já implementada. Pelo menos, isso deveria ser realizável em um mundo ideal, onde todos os componentes para o carregamento de bibliotecas, etc., estivessem presentes; neste caso, eles seriam solucionados automaticamente pela Wolfram Language. (Vale a pena notar que, na prática, podem surgir problemas com a configuração de linguagens externas em um sistema computacional específico, e no armazenamento em nuvem podem surgir problemas adicionais de segurança).

Aliás, quando você analisa pela primeira vez bibliotecas externas padrão, elas muitas vezes parecem muito complexas para serem abrangidas apenas por algumas funções, mas em muitos casos, a maior parte da complexidade surge da criação da infraestrutura necessária para a biblioteca e de todas as funções para seu suporte. No entanto, ao usar a linguagem Wolfram Language, a infraestrutura geralmente já está embutida nos pacotes, portanto não é necessário detalhar todas essas funções de suporte; é preciso apenas criar funções para algumas "principais" funções orientadas a aplicações na biblioteca.

«Ecossistema» da base de conhecimento

Se você escreveu funções que usa constantemente, envie-as para o repositório de funções Wolfram! Mesmo que isso não resulte em algo maior (desenvolvimento da linguagem), será muito mais conveniente usar as funções para uso pessoal. No entanto, é lógico supor que, se você usa funções constantemente, outros usuários também podem achá-las úteis.

É natural que você possa se encontrar em uma situação em que não tenha a oportunidade — ou não queira — compartilhar suas funções ou ao acessar recursos de informação privados. Mesmo nesses casos, você pode simplesmente implantar funções em sua própria conta na nuvem, especificando os direitos de acesso a elas. (Se a sua organização tiver uma nuvem privada Wolfram Enterprise, em breve poderá hospedar seu próprio repositório privado de funções, que pode ser administrado pela sua organização e configurar a exibição forçada de visualizações ou não para usuários externos.)

As funções que você envia para o repositório de funções Wolfram não precisam ser perfeitas; elas apenas precisam ser úteis. É um pouco semelhante à seção de "Erros" na documentação clássica do Unix — na "Seção de definições", há uma seção de "Notas do autor", onde você pode descrever limitações, problemas etc., que já conhece sobre sua função. Além disso, quando você envia sua função para o repositório, pode adicionar notas à submissão que serão lidas por uma equipe especial de curadores.

Após a publicação da função, sua página sempre tem dois links na parte inferior: "Enviar mensagem sobre esta função” e “Discutir na comunidade WolframSe você anexar uma observação (como um relatório de erros), pode marcar uma caixa que diz que deseja que sua mensagem e informações de contato sejam enviadas ao autor da função.

Às vezes, é necessário simplesmente usar funções do repositório de funções Wolfram, como as funções embutidas, sem olhar seu código. No entanto, se você deseja "espiar" o código, sempre há um botão "Bloco de Notas" no topo. Clique nele e você obterá sua própria cópia do bloco de notas original que foi enviado para o repositório de funções. Às vezes, você pode usá-lo como exemplo para suas necessidades. Além disso, você pode desenvolver sua própria modificação dessa função. Você pode querer armazenar essas funções que encontrou no repositório em seu computador ou na sua conta de armazenamento em nuvem, ou talvez queira enviá-las para a base de conhecimento de funções, possivelmente como uma versão aprimorada e complementar da função original.

No futuro, planejamos suportar ramificações no estilo Git para repositórios de funções, mas atualmente estamos tentando tornar isso mais simples, e sempre teremos apenas uma versão padrão de cada função embutida na linguagem. Na maioria das vezes (a menos que os desenvolvedores renunciem ao suporte das funções que desenvolveram e não respondam às mensagens dos usuários), o autor original da função obtém o controle sobre as atualizações e envia novas versões que são então revisadas e, se passarem pelo processo de verificação, publicadas na linguagem.

Vamos considerar a questão de como funciona a "versionamento" das funções desenvolvidas. Atualmente, quando você usa uma função do repositório de funções, sua definição será armazenada continuamente em seu computador (ou em sua conta de nuvem, se você estiver usando a nuvem). Se uma nova versão da função for lançada, na próxima vez que você a usar, receberá uma notificação sobre isso. E se você quiser atualizar a função para a nova versão, pode fazer isso usando o comando ResourceUpdate. (‘BLOB funcional’ na verdade armazena mais informações sobre versões, e no futuro planejamos torná-lo mais acessível para nossos usuários.)

Uma das grandes características do repositório de funções Wolfram é que qualquer programa em Wolfram Language pode usar funções dele. Quando um programa aparece em um notebook, muitas vezes é conveniente formatar as funções do repositório como ‘objetos binários funcionais’ de fácil leitura (possivelmente com um conjunto de versões correspondente).

Você sempre pode acessar qualquer função do repositório de funções usando texto ResourceFunction […]. E isso é muito conveniente quando você está escrevendo código ou scripts diretamente para o Wolfram Engine, por exemplo, com ajuda de uma IDE ou editor de código (é importante notar que o repositório de funções é totalmente compatível com Free Wolfram Engine para desenvolvedores).

Como funciona?

Dentro das funções no repositório Wolfram, isso é possível usando exatamente o mesmo sistema de recursos da base, assim como em todos os nossos outros repositórios existentes (armazenamento de dados, Neural Net Repository, coleção de projetos demonstrativos e etc.), assim como todos os outros recursos do sistema Wolfram, ResourceFunction é baseado na função ResourceObject.

Vamos considerar ResourceFunction:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Dentro, você pode ver algumas informações usando a função Information:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Como funciona a configuração da função recurso? O mais simples — é um caso puramente local. Aqui está um exemplo que pega uma função (neste caso apenas uma função pura) e a define como uma função recurso para a sessão atual do programa:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Depois de ter feito a definição, você pode usar a função recurso:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

Observe que neste BLOB de função há um ícone preto Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram. Isso significa que a função BLOB se refere à função de recursos na memória, definida para a sessão atual. Para uma função recurso que é armazenada permanentemente no seu computador ou na conta em nuvem, há um ícone cinza Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram. E para a função recurso oficial no repositório de funções Wolfram, há um ícone laranja Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram.

Então, o que acontece quando você usa o menu ‘Implantação’ no notebook de definição? Primeiro, ele pega todas as definições no notebook e cria delas um símbolo ResourceObject). (E se você estiver usando uma IDE de texto ou um programa, você também pode criar explicitamente ResourceObject)

A implantação local de uma função do repositório em seu computador é feita usando o comando LocalCache para o objeto de recurso, para salvá-lo como LocalObject em seu sistema de arquivos. A implantação em uma conta em nuvem é feita usando o comando CloudDeploy para o objeto de recurso, enquanto a publicação pública na nuvem é CloudPublish. Em todos os casos, ResourceRegister também é usado para registrar o nome da função de recurso, de modo que ResourceFunction[«nome»] funcione.

Se você clicar no botão Enviar para Repositório de Funções, o que acontece abaixo dele ResourceSubmit é chamado no objeto de recurso. (E se você estiver usando a interface de entrada de texto, você também pode chamar ResourceSubmit diretamente.)

Por padrão, o envio é feito sob o nome associado ao seu identificador Wolfram ID. Mas se você estiver enviando uma solicitação em nome de um grupo de desenvolvedores ou de uma organização, você pode definir um identificador de editor separado e usá-lo como nome para interagir com suas visualizações.

Depois de enviar qualquer uma de suas funções para o repositório de funções, ela entrará na fila para revisão. Se você receber comentários de volta, geralmente virão na forma de um arquivo de texto com células de comentários adicionais adicionadas. Você sempre pode verificar o status de sua solicitação acessando o portal do participante do sistema de recursos. Mas assim que sua função for aprovada, você será notificado (por e-mail), e sua função será listada no repositório de funções Wolfram.

Algumas sutilezas no trabalho

À primeira vista, pode parecer que você pode simplesmente pegar o bloco de definição e colocá-lo literalmente no repositório de funções, no entanto, na verdade, existem muitas sutilezas — e para lidar com elas é necessário realizar uma programação meta bastante complexa, tratando simbolicamente tanto o código que define a função quanto o próprio bloco de definição. Grande parte disso ocorre internamente, ou seja, 'nos bastidores', mas isso pode ter algumas consequências que vale a pena entender se você pretende contribuir para o banco de dados de funções.

A primeira sutileza imediata: quando você preenche o "Bloco de Notas de Definições", você pode simplesmente se referir à sua função em qualquer lugar, usando um nome como MyFunction, que parece um nome comum para uma função na linguagem Wolfram, mas, para a documentação do repositório de funções, isso é substituído por ResourceFunction["MyFunction"] – é exatamente isso que os usuários realmente usarão ao trabalhar com a função.

A segunda sutileza: quando você cria uma função de recurso a partir do Bloco de Notas de Definições, todas as dependências envolvidas na definição da função devem ser fixadas e explicitamente incluídas. No entanto, para garantir que as definições permaneçam modulares, é necessário colocar tudo em um espaço de nomes. (Obviamente, que funções que fazem tudo isso, estão no repositório de funções.)

Normalmente, você nunca verá rastros do código usado para configurar esse espaço de nomes. Mas se, por algum motivo, você chamar um símbolo não resolvido dentro da sua função, você verá que esse símbolo está no contexto interno da função. No entanto, ao processar o Bloco de Notas de Definições, pelo menos, o símbolo correspondente à própria função, é configurado para melhor exibição na forma de um BLOB funcional, e não um símbolo bruto no contexto interno.

O repositório de funções destina-se a definir novas funções. E essas funções podem ter opções. Muitas vezes, esses parâmetros (por exemplo, Método ou ImageSize) terão a capacidade de serem utilizados para funções embutidas, bem como para aquelas para as quais já existem símbolos embutidos. Mas, às vezes, uma nova função pode precisar de novas opções. Para manter a modularidade, é necessário que esses parâmetros sejam símbolos definidos em um contexto interno exclusivo (ou algo como funções de recurso inteiras, ou seja, por si mesmos). Para simplificar, o repositório de funções permite especificar novas opções nas definições na forma de strings. E para a conveniência do usuário, essas definições (desde que tenham usado OptionValue e OptionsPattern) também são processadas de forma que, ao usar funções, os parâmetros podem ser especificados não apenas como strings, mas também como símbolos globais com os mesmos nomes.

A maioria das funções simplesmente faz o que deve fazer toda vez que é chamada, mas algumas funções precisam ser inicializadas antes que possam funcionar em uma sessão específica — e para resolver esse problema, na seção 'Definição', há uma seção de 'Inicialização'.

As funções do repositório podem usar outras funções que já estão no repositório para configurar definições para o repositório de funções, incluindo duas (ou mais) funções que se referem uma à outra. É necessário desdobrá-las em sua sessão de trabalho com o programa para que você possa referenciá-las como ResourceFunction[«nome»], então você pode criar as combinações necessárias dessas funções como exemplos e adicionar uma nova função ao repositório com base nas já existentes.

Perspectivas de desenvolvimento. O que deve acontecer quando o repositório se tornar realmente grande?

Hoje, estamos apenas lançando o repositório de funções Wolfram, mas esperamos que, com o tempo, seu volume e funcionalidade possam aumentar drasticamente, e à medida que ele cresce, surgirão diferentes problemas que, como já suspeitamos, podem ocorrer.

O primeiro problema diz respeito aos nomes das funções e sua unicidade. O repositório de funções foi projetado de forma que, assim como para funções integradas na linguagem Wolfram, você pode se referir a qualquer função simplesmente mencionando seu nome. Mas isso inevitavelmente significa que os nomes das funções devem ser globalmente únicos em todo o repositório, de modo que, por exemplo, no repositório, pode haver apenas uma ResourceFunction[«MyFavoriteFunction»].

À primeira vista, isso pode parecer um grande problema, mas é importante entender que é basicamente o mesmo problema que ocorre com coisas como domínios da internet ou identificadores de redes sociais. E o fato é que, no sistema, deve haver um registrador — e esse é um dos papéis que nossa empresa desempenhará para a base de conhecimento das funções Wolfram. (Para versões privadas do repositório, seus registradores podem ser administradores.) É claro que um domínio da internet pode ser registrado sem nada nele, mas no repositório de funções, o nome de uma função pode ser registrado somente na presença de uma definição real da função.

Parte do nosso papel na gestão da base de conhecimento das funções Wolfram é garantir que o nome escolhido para uma função seja lógico, considerando a definição da função, e que também siga as convenções de nomenclatura da Wolfram Language. Temos mais de 30 anos de experiência na nomeação de funções integradas na Wolfram Language, e nossa equipe de curadoria aplicará essa experiência também ao repositório de funções. Sem dúvida, sempre há exceções. Por exemplo, pode parecer mais preferível ter um nome curto para uma função, mas é melhor "proteger-se" com um nome mais longo e específico, pois isso reduz as chances de alguém querer criar um nome de função semelhante no futuro.

(Aqui vale a pena notar que simplesmente adicionar qualquer tag de participante para eliminar a ambiguidade das funções não trará o efeito desejado. Porque, se não insistirmos que a tag sempre seja atribuída, será necessário definir uma tag padrão para qualquer função dada, além de destacar as tags dos autores, o que novamente exigirá uma coordenação global.)

À medida que o volume da base de conhecimento das funções Wolfram cresce, um dos problemas que certamente surgirá é a descobribilidade das funções, para isso o sistema conta com a função de busca (e os arquivos de definição podem incluir palavras-chave, etc.). Para funções integradas na linguagem Wolfram, a documentação possui diversos tipos de links cruzados que ajudam a "promover" as funções. As funções no repositório de funções podem fazer referência a funções integradas. E vice-versa? Para isso, planejamos experimentar diferentes esquemas para apresentar as funções do repositório nas páginas de documentação para funções integradas.

Para funções integradas na linguagem Wolfram, existe o chamado nível de descobribilidade, garantido pela rede de "páginas de referência", que fornecem listas organizadas de funções relacionadas a áreas específicas. Sempre é difícil equilibrar adequadamente as páginas de referência, e à medida que a linguagem Wolfram cresce, as páginas de referência frequentemente precisam ser totalmente reorganizadas. É relativamente simples colocar funções do repositório em categorias amplas e até mesmo dividir essas categorias sequencialmente, mas é muito mais valioso ter páginas de referência da linguagem bem organizadas. Ainda não está claro como melhor criá-las para todo o conhecimento das funções. Por exemplo, CreateResourceObjectGallery no repositório de funções, qualquer pessoa pode publicar uma página da web contendo suas 'escolhas' do repositório:

Repositório de Funções Wolfram: acesso aberto à plataforma para extensões da linguagem Wolfram

O repositório de funções Wolfram é configurado como um armazenamento permanente de funções, onde qualquer função nele sempre funcionará. Certamente, novas versões das funções podem surgir e esperamos que algumas funções eventualmente fiquem obsoletas com o tempo. As funções funcionarão se forem utilizadas em programas, mas suas páginas de documentação referenciarão novas funções mais avançadas.

O repositório de funções Wolfram destina-se a facilitar o acesso a novas funções e a explorar novas possibilidades de uso da linguagem Wolfram. Com uma boa dose de otimismo, esperamos que parte do que foi explorado no repositório de funções, eventualmente, faça sentido se tornar componentes embutidos da linguagem principal Wolfram Language. Na última década, tivemos um conjunto semelhante de funções que foram inicialmente apresentadas no Wolfram | Alpha. E uma das lições aprendidas com essa experiência é que, para alcançar os padrões de qualidade e consistência que enfatizamos em tudo que é embutido na linguagem Wolfram, é necessário muito trabalho, que muitas vezes é mais complicado do que os esforços iniciais para implementar a ideia. Mas mesmo assim, a função no conhecimento das funções pode servir como uma prova de conceito muito útil para uma futura função que pode eventualmente ser incorporada à linguagem Wolfram.

Aqui, o mais importante é que a função no repositório de funções está disponível para cada usuário utilizar imediatamente. Embora a função integrada da linguagem possa ser muito melhor e mais eficiente, o repositório de funções permitirá que os usuários acessem imediatamente todas as novas funcionalidades. E, o que é especialmente importante, este conceito permite que qualquer um adicione suas novas funções.

No passado, essa ideia na história da linguagem Wolfram não teria funcionado tão bem quanto agora, mas neste momento, tanto esforço já foi investido na linguagem, assim como um entendimento profundo dos princípios de design da linguagem, que agora parece bastante possível que uma grande comunidade de usuários adicione funções que manterão a coerência do projeto, tornando-as úteis para um amplo espectro de usuários.

Na comunidade de usuários da Wolfram Language, há um espírito incrível de talento. (Claro, essa comunidade inclui muitos dos principais especialistas em pesquisa e desenvolvimento de diversas áreas.) Espero que o repositório de funções da Wolfram forneça uma plataforma eficaz para revelar e disseminar esse espírito de talento. Apenas juntos poderemos criar algo que ampliará significativamente a área de aplicação da paradigma computacional da linguagem Wolfram.

Em mais de 30 anos, percorremos um longo caminho com a linguagem Wolfram. Agora, juntos, vamos mais longe. Encorajo todos os respeitáveis usuários da linguagem Wolfram em todo o mundo a utilizar o repositório de funções como plataforma, assim como este novo projeto de software, o Free Wolfram Engine para desenvolvedores.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster