Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

¡Hola, Habr! Les presento la traducción del post de Stephen Wolfram «El Repositorio de Funciones de Wolfram: Lanzando una Plataforma Abierta para Ampliar el Lenguaje Wolfram».

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Contexto de la viabilidad del lenguaje Wolfram

Hoy estamos al borde de grandes logros junto al lenguaje de programación Wolfram Language. Hace solo tres semanas lanzamos un motor gratuito de Wolfram para desarrolladores, para ayudar a nuestros usuarios a integrar el lenguaje Wolfram Language en sus grandes proyectos de software. Hoy lanzamos el repositorio de funciones Wolfram, para proporcionar una plataforma coordinada para funciones diseñadas para ampliar el lenguaje Wolfram, así como también abrimos un repositorio de funciones para cualquier persona que pueda contribuir al desarrollo de nuestro producto de software.

El Repositorio de Funciones (Function Repository) de Wolfram es algo que se ha vuelto posible gracias a la singularidad de Wolfram Language no solo como un lenguaje de programación, sino también como un lenguaje computacional de pleno derecho. En los lenguajes de programación tradicionales, la adición de nuevas funciones significativas normalmente requiere la creación de bibliotecas adicionales enteras, que pueden funcionar o no en conjunto. Sin embargo, en el lenguaje Wolfram Language ya hay tanto integrado en el propio lenguaje, que es posible expandir significativamente su funcionalidad simplemente agregando nuevas funciones que se integran de inmediato en la estructura completa del lenguaje.

Por ejemplo, ya hay 532 nuevas funciones organizadas en 26 categorías temáticas:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Así como más de 6000 funciones estándar, integradas en el lenguaje Wolfram, cada función del repositorio cuenta con una página de documentación con descripciones detalladas y ejemplos de uso:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Para acceder a la página, copie el objeto anterior (BLOB funcional), pégelo en la línea de entrada y luego ejecute la función; ya está integrada en el lenguaje Wolfram y es compatible por defecto desde la versión 12.0:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Cabe destacar que al procesar LogoQRCode No es necesario, por ejemplo, configurar una «biblioteca para el procesamiento de imágenes», ya que en el lenguaje Wolfram Language ya hemos implementado un método secuencial y cuidadosamente algoritmizado para el procesamiento de imágenes, que pueden ser inmediatamente procesadas por diversas funciones gráficas del lenguaje:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Espero que con el apoyo de una comunidad maravillosa y talentosa, que ha crecido y se ha expandido (basado en el lenguaje Wolfram) durante las últimas décadas. El repositorio de funciones de Wolfram permitirá en un futuro cercano ampliar significativamente el rango (posiblemente de funciones especializadas en diversas áreas del conocimiento científico y técnico) que están disponibles en el lenguaje. Así, se abre la posibilidad de utilizar tanto el contenido del lenguaje (sus funciones incorporadas) como los principios de desarrollo, que se implementan en el lenguaje. (Es importante señalar que el lenguaje Wolfram tiene más de 30 años de desarrollo y crecimiento estable.).
Dentro de las funciones del repositorio pueden encontrarse fragmentos de código pequeños o suficientemente amplios escritos en el lenguaje Wolfram. Por ejemplo, pueden ser llamadas a APIs y servicios externos o bibliotecas externas en otros lenguajes.. La característica única de este enfoque es que, cuando accedes a la funcionalidad a nivel de usuario, no habrá posibles inconsistencias debido a que este enfoque está construido sobre una estructura coherente del lenguaje Wolfram — y cada función funcionará automáticamente de manera correcta — tal y como debe.
La interfaz y la estructura del repositorio de funciones de Wolfram están diseñadas para que cada uno pueda contribuir a la causa común de la manera más simple y conveniente que le resulte — básicamente, simplemente completando un archivo de texto de bloc de notas (con la extensión nb) WL.. Las funciones automáticas incorporadas permiten verificar las nuevas funciones añadidas al repositorio para su integración garantizada en el lenguaje. Nuestra empresa se enfoca en un amplio círculo de usuarios que pueden integrar sus funciones en el lenguaje, en lugar de complicar las nuevas funciones; y aunque se ha implementado un proceso de verificación, no insistimos en algo como un análisis minucioso de la estructura o estrictos estándares de completitud y confiabilidad para las nuevas funciones de los usuarios, a diferencia de las verificaciones más rigurosas de las funciones que están integradas en el núcleo del lenguaje, que aplicamos.

En este enfoque, existen muchos compromisos y detalles, pero nuestro objetivo es optimizar el repositorio de funciones de Wolfram tanto para la comodidad del usuario como para que las nuevas funciones de los usuarios hagan una contribución significativa al desarrollo del lenguaje. A medida que crezcamos, no tengo dudas de que tendremos que inventar nuevos métodos para manejar y verificar las funciones integradas en el repositorio, y esto no es menos importante para organizar una gran cantidad de funciones y encontrar aquellas que los usuarios necesitan. Sin embargo, no puede dejar de ser alentador que el camino que hemos elegido es un buen comienzo. Yo mismo he añadido algunas funciones a la base original. Muchas de ellas se basan en el código que he desarrollado personalmente durante bastante tiempo. Y solo me tomó unos minutos enviarlos al repositorio. Ahora que están en el repositorio, finalmente puedo utilizarlas de inmediato y en cualquier momento según sea necesario, sin preocuparme por buscar archivos, cargar paquetes, etc.

Aumento de la eficiencia mientras se reducen costos

Incluso antes de la aparición de Internet, existían formas de intercambiar código de Wolfram Language (nuestro primer gran proyecto centralizado fue MathSource, creado para Mathematica en 1991 basado en CD-ROM, etc.). Ciertamente, el enfoque propuesto para implementar el repositorio de funciones de Wolfram es una herramienta más poderosa y confiable para alcanzar los objetivos mencionados.

Durante más de 30 años, nuestra empresa ha trabajado arduamente para mantener la integridad de la estructura del lenguaje Wolfram, y esto es muy importante para que el lenguaje Wolfram no solo sea un lenguaje de programación, sino también un lenguaje de cálculo completo. Y, de este modo, la esencia del enfoque para implementar el repositorio de funciones de Wolfram es utilizar un enfoque uniforme para la programación y el desarrollo de nuevas funciones, que se añaden de manera coherente y se integran en el marco del lenguaje para su posible desarrollo y evolución conjunta.

En la estructura de implementación de cada función ocurren diferentes procesos computacionales. Es importante señalar que la función debe tener un aspecto claro y uniforme y ser fácilmente legible para el usuario. En este contexto, las funciones integradas del lenguaje Wolfram Language se presentan con más de 6000 ejemplos secuenciales de cómo se deben programar correctamente las funciones (esto es nuestra reseñas en video sobre programación en vivo, que incluyen cientos de horas del proceso de creación de programas estándar). Este enfoque permite, en última instancia, que el repositorio de funciones de Wolfram funcione de manera óptima, dada la naturaleza estructural del lenguaje Wolfram Language con su gran cantidad de bibliotecas adicionales y diversas, que ya están integradas en el lenguaje. Por ejemplo, si tiene una función que procesa imágenes, o matrices dispersas, o estructuras moleculares, así como datos geográficos o cualquier otra — el lenguaje ya ofrece su representación simbólica coherente, lo que permite que su función sea inmediatamente compatible con otras funciones en el lenguaje.

Crear un repositorio que funcione realmente bien es una tarea interesante de metaprogramación. Por ejemplo, un exceso de restricciones en un programa puede impedir que se logre la unificación y universalidad necesarias para el funcionamiento del algoritmo. De la misma manera, con un número insuficiente de restricciones funcionales, no podrá implementar una secuencia de ejecución del algoritmo suficientemente correcta. Algunos ejemplos previos de implementación del compromiso entre estos enfoques, realizados por nuestra empresa, funcionaron de manera bastante estable: El Proyecto Wolfram Demonstrations, lanzado en 2007 y ahora funcionando en modo interactivo en Internet, contiene más de 12000 demostraciones interactivas de usuario. En la base de datos Wolfram hay más de 600 bases de datos listas para usar en el lenguaje Wolfram Language, y el almacén de redes neuronales de Wolfram se actualiza con nuevas redes neuronales prácticamente cada semana (ya hay 118) y se conectan de inmediato a través de la función NetModel en el lenguaje Wolfram Language.

Todos los ejemplos mencionados anteriormente tienen una característica fundamental: los objetos y funciones que se recopilan en el proyecto tienen un alto grado de estructuración y distribución de procesos. Sin duda, los detalles de la estructura de lo que constituye una demostración o una red neuronal, o algo diferente, pueden variar significativamente, pero la estructura fundamental para cualquier repositorio actual siempre permanece constante. ¿Cuál es su opinión, estimado usuario, sobre la creación de un repositorio que añade extensiones al lenguaje Wolfram? El lenguaje Wolfram Language está diseñado para ser extremadamente flexible, por lo que se puede ampliar y modificar de cualquier manera. Esta circunstancia es extremadamente importante para la posibilidad de crear rápidamente varios proyectos de programación a gran escala en el lenguaje Wolfram Language. Cabe señalar que con el aumento de la flexibilidad del lenguaje, inevitablemente aumentará también el costo de los proyectos realizados en dicho lenguaje. Esto se debe a que cuanto más use el usuario este lenguaje, más funcionalidad específica obtendrá, pero no debe olvidarse que este enfoque puede tener aspectos negativos en términos de la imposibilidad de garantizar la consistencia coherente de los módulos de programación.

En los lenguajes de programación tradicionales existe un problema común con las bibliotecas: si, por ejemplo, utiliza una biblioteca, el código funciona correctamente, pero si intenta utilizar varias bibliotecas, no hay garantía de que interactúen correctamente entre sí. Además, en los lenguajes de programación tradicionales, a diferencia de un lenguaje de cálculos completo, no hay posibilidades de controlar garantizadamente la existencia de representaciones integradas coherentes para cualquier función o tipo de datos, además de sus estructuras básicas. Sin embargo, en esencia, el problema es aún mayor de lo que parece a simple vista: si alguien está construyendo una vertical de funcionalidad a gran escala, sin enormes costos de programación centralizada del proyecto, que hemos invertido en el lenguaje Wolfram, no es posible alcanzar la coherencia. Por lo tanto, es importante que todos los módulos de software siempre funcionen correctamente juntos.

Así, la idea del repositorio de funciones de Wolfram es evitar el problema mencionado anteriormente, añadiendo extensiones al lenguaje en forma de relativamente pequeños fragmentos de código a través de funciones individuales, cuyo desarrollo como módulos coherentes es una tarea más sencilla. Sin embargo, hay características de programación que no se pueden hacer convenientes mediante funciones individuales (y nuestra empresa tiene planes de lanzar en un futuro próximo un algoritmo de software optimizado para ayudar en la implementación de paquetes de software a gran escala). No obstante, basado en las funciones ya integradas en el lenguaje Wolfram Language, existen numerosas oportunidades para la programación que se realizan a través de funciones individuales. La idea es que, con un esfuerzo programático relativamente pequeño, se puedan crear una serie de nuevas y útiles funciones que proporcionen suficiente coherencia al proyecto, que además estén bien sincronizadas entre sí y que puedan ser utilizadas de manera fácil y amplia en el lenguaje posteriormente.

Este enfoque es, sin duda, un compromiso. Con la implementación de un paquete más robusto, se puede imaginar un mundo completamente nuevo de funcionalidad que sea extremadamente poderoso y útil. Si hay necesidad de obtener nuevas funcionalidades que encajen con todo lo demás, pero no está dispuesto a dedicar un esfuerzo enorme al desarrollo del proyecto, esto podría, lamentablemente, llevar a una disminución de la escala de su proyecto. La idea del repositorio de funciones de Wolfram es proporcionar la funcionalidad que define la parte principal del proyecto; este enfoque permite añadir potentes características mientras se simplifica el mantenimiento de una buena coherencia en la programación del proyecto.

Asistencia para añadir funciones personalizadas al repositorio de funciones

Los especialistas de nuestra empresa han trabajado arduamente para que su contribución a las funciones del repositorio de Wolfram sea lo suficientemente fácil para los usuarios. En el escritorio (ya en la versión 12.0), Puede simplemente navegar secuencialmente por las pestañas del menú principal: File > New > RepositoryItem > Function Repository Item y obtendrá «Cuaderno de Definición» (programáticamente dentro del entorno de trabajo. También puede utilizar la función análoga — CreateNotebook[«FunctionResource»]):

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Existen dos acciones principales que deberá llevar a cabo: en primer lugar, escribir el código de su función y, en segundo lugar, redactar la documentación que ilustre cómo debe funcionar su función.
Haga clic en el botón «Abrir muestra» en la parte superior para ver un ejemplo de lo que necesita hacer:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

De hecho, está tratando de crear algo similar a una función integrada en el lenguaje Wolfram Language. Excepto que puede hacer algo mucho más específico que la función integrada. Al mismo tiempo, las expectativas sobre su completitud y confiabilidad serán mucho más bajas.
Necesita asignar un nombre a su función que cumpla con los principios de nomenclatura de funciones del Wolfram Language. Además, necesitará desarrollar documentación para su función, similar a las funciones integradas del lenguaje. Más adelante daré más detalles sobre esto. Por ahora, simplemente tenga en cuenta que en la fila de botones en la parte superior del archivo del cuaderno de definiciones hay un botón «Recomendaciones de estilo», que explica qué hacer, y un botón «Herramientas», que proporciona un conjunto de herramientas para formatear la documentación de su función.
Cuando esté seguro de que todo está correctamente completado y esté listo, presione el botón «Check» («Verificar»). Es completamente normal que aún no haya dominado todos los detalles. Por lo tanto, la función «Check» se ejecutará automáticamente y realizará muchas verificaciones de estilo y consistencia. A menudo, le sugerirá confirmar y aceptar correcciones de inmediato (Por ejemplo: «Esta línea debe terminar con dos puntos», y le propondrá ingresar los dos puntos). A veces le pedirá que agregue o cambie algo por su cuenta. Continuamente estaremos añadiendo nuevas capacidades a la funcionalidad automática del botón «Check», pero su objetivo principal es garantizar que todo lo que envíe al repositorio de funciones ya cumpla con la mayor cantidad posible de recomendaciones de estilo.

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Entonces, después de iniciar "Check", puedes usar "Preview". "Preview" genera una vista previa de la página de documentación que has definido para tu función. También puedes crear una vista previa para un archivo generado en tu computadora o para un archivo que se encuentra en el almacenamiento en la nube. Si, por alguna razón, no estás satisfecho con lo que ves en la vista previa, simplemente regresa y realiza las correcciones necesarias, y luego presiona de nuevo el botón Preview.
Ahora estás listo para publicar tu función en el repositorio. El botón Deploy te ofrece cuatro opciones de acción:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

En este paso es importante que sepas que puedes enviar tu función al repositorio de funciones de Wolfram, para que esté disponible para cualquier usuario. Al mismo tiempo, puedes publicar tu función para un número limitado de usuarios. Por ejemplo, puedes crear una función que esté alojada localmente en tu computadora, de modo que esté disponible cuando uses esta computadora específica. O puedes alojarla en tu cuenta en la nube, para que esté disponible para ti cuando estés conectado a la nube. También puedes publicar (desplegar) tu función públicamente a través de tu cuenta en la nube. En este caso, no estará en el repositorio central de funciones de Wolfram, pero podrás dar a alguien una URL que les permita acceder a tu función desde tu cuenta. (En el futuro, también apoyaremos repositorios centrales a escala de toda nuestra empresa).

Entonces, supongamos que realmente deseas enviar tu función a la base de conocimientos de funciones de Wolfram. Para esto, presionas el botón "Enviar" en el repositorio. ¿Qué sucede en ese momento? Tu solicitud se coloca inmediatamente en la cola para revisión y aprobación por parte de nuestro equipo especial de curadores.

A medida que su solicitud pasa por el proceso de aprobación (que generalmente toma varios días), recibirá mensajes sobre el estado de su revisión y, posiblemente, sugerencias para su uso posterior. Pero una vez que su función esté aprobada, se publicará de inmediato en el repositorio de funciones de Wolfram y estará disponible para cualquier uso. (Y esto se mostrará en los boletines de noticias de nuevas funciones etc.)

¿Qué debería haber en el repositorio?

Cabe mencionar que en nuestra empresa tenemos estándares muy altos de integridad, confiabilidad y calidad general; de más de 6000 funciones que hemos integrado en el lenguaje Wolfram en los últimos más de 30 años, todas cumplen con estos criterios. El objetivo del repositorio de funciones de Wolfram es aprovechar toda la estructura y las capacidades funcionales que ya existen en el lenguaje Wolfram Language para añadir la mayor cantidad posible de funciones mucho más ligeras (es decir, funciones con un rendimiento superior).

Sin duda, las funciones en el repositorio de funciones de Wolfram deben adherirse a los principios de diseño del lenguaje Wolfram Language, para que puedan interactuar plenamente con otras funciones y las expectativas de los usuarios sobre cómo deberían funcionar correctamente las funciones. Sin embargo, las funciones no tienen que tener el mismo nivel de integridad o confiabilidad.

En las funciones integradas del lenguaje Wolfram, trabajamos arduamente para hacer que las funciones de software sean lo más generales posible. Al mismo tiempo, al estar en el repositorio de funciones de Wolfram, no hay nada de malo en que una función que simplemente maneja un caso muy específico pero útil sea incluida. Por ejemplo, la función SendMailFromNotebook puede recibir archivos en un formato específico y crear correos de una manera específica. PolygonalDiagram crea diagramas únicamente con colores y etiquetado específicos, etc.

Otro aspecto relacionado con las funciones incorporadas es que nuestra empresa se esfuerza por manejar todos los casos atípicos, para tratar adecuadamente la entrada incorrecta, etc. En el repositorio de funciones es completamente normal que exista una función especial que maneje los casos principales de resolución del problema e ignore todos los demás.

Es obvio que es mejor tener funciones que hagan más y las hagan mejor, pero la optimización para el repositorio de funciones, a diferencia de las funciones incorporadas del lenguaje Wolfram, debe tener más funciones vinculadas con un mayor número de funciones, en lugar de profundizar en los procesos de implementación de cada función específica.

Ahora examinemos un ejemplo de prueba de funciones en el repositorio. Las expectativas de consistencia para tales funciones son naturalmente mucho más bajas que para las funciones incorporadas del lenguaje. Esto es aún más relevante en casos donde las funciones dependen de recursos externos, como API, es importante realizar pruebas consistentes de forma continua, lo cual se lleva a cabo automáticamente dentro de los algoritmos de verificación. En el archivo nb, puede especificar explícitamente las definiciones (en la sección 'Información adicional') y establecer tantas pruebas como considere necesarias, definidas ya sea por líneas de entrada y salida, o por objetos simbólicos completos del tipo VerificationTest, tantos como considere necesario. Además, el sistema constantemente intenta convertir los ejemplos de documentación que usted proporciona en un proceso de verificación (lo cual a veces puede ser bastante intensivo en recursos, por ejemplo, para una función cuyo resultado depende de números aleatorios o de la hora del día).

Como resultado, en el repositorio de funciones habrá una serie de complejidades de implementación. Algunos serán simplemente una línea de código, otros pueden incluir miles o decenas de miles de líneas, probablemente utilizando múltiples funciones auxiliares. ¿En qué casos vale la pena agregar una función para la cual se necesita muy poco código? En principio, si la función tiene un buen nombre mnemotécnico, que los usuarios entenderían fácilmente al verlo en parte del código, entonces se puede agregar. De lo contrario, probablemente sea mejor simplemente volver a escribir el código en su programa cada vez que necesite usarlo.

El objetivo principal del repositorio de funciones (como su nombre indica) es introducir nuevas funciones en el lenguaje. Si desea agregar nuevos datos o nuevas entidades, utiliza repositorio de Wolfram Data. Pero, ¿qué hacer si desea introducir nuevos tipos de objetos para sus cálculos?

De hecho, hay dos caminos. Es posible que desee introducir un nuevo tipo de objeto que se utilizará en nuevas funciones en el repositorio de funciones. Y en este caso, siempre puede simplemente escribir su representación simbólica y usarla al introducir o al salir funciones en el repositorio de funciones.

Pero, ¿qué hacer si desea representar un objeto y luego definirlo a través de funciones existentes en el lenguaje Wolfram Language que deben trabajar junto a él? Para esto, Wolfram Language siempre ha tenido un mecanismo sencillo llamado UpValues. Con algunas limitaciones (especialmente para funciones que no pueden evaluar sus argumentos), el repositorio de funciones le permite simplemente representar una función y definir valores para ella. (Para aumentar la expectativa de consistencia al crear una nueva construcción importante, completamente integrada en todo el lenguaje Wolfram Language, — generalmente es un procedimiento muy importante que no puede lograrse solo con aumentar el costo del proyecto y esto es lo que nuestra empresa hace dentro de los proyectos de desarrollo a largo plazo del lenguaje, esta tarea no es un objetivo que se establece dentro del desarrollo del repositorio).

Entonces, ¿qué puede haber en el código de funciones en el repositorio de funciones? Todo lo que está integrado en el lenguaje Wolfram Language, por supuesto (al menos si no representa amenazas para la seguridad y la operatividad del propio programa, como entorno computacional) así como cualquier función del repositorio de funciones. Al mismo tiempo, también hay otras posibilidades de funcionamiento: una función en el repositorio de funciones puede llamar a una API, ya sea en Wolfram Cloud, o o de otra fuente. Por supuesto, existen algunos riesgos asociados con esto. Debido a la falta de garantías de que la API no cambiará, la función en el almacenamiento de funciones podría dejar de funcionar. Para identificar tales problemas, hay una nota en la página de documentación (en la sección “Requisitos”) para cualquier función que dependa no solo de la funcionalidad incorporada de Wolfram Language. (Por supuesto, cuando se trata de datos reales, pueden surgir problemas incluso con esa funcionalidad, ya que los datos reales sobre el mundo están en constante cambio y a veces incluso cambian sus definiciones y estructuras.)

¿Debería todo el código para el repositorio de funciones de Wolfram estar escrito en el lenguaje Wolfram? Definitivamente, el código dentro de la API externa no debería estar escrito en el lenguaje Wolfram, lo que en sí mismo no constituye código del lenguaje. De hecho, si encuentra una función prácticamente en cualquier lenguaje externo o biblioteca, podrá crear un contenedor que permita usarla en el repositorio de funciones de Wolfram. (Normalmente, para esto se deben utilizar funciones incorporadas. ExternalEvaluate o ExternalFunction en el código del lenguaje Wolfram.)

Entonces, ¿cuál es el sentido de hacer esto? En esencia, permite utilizar todo el sistema integrado de Wolfram Language y su conjunto unificado de capacidades de programación. En caso de que obtenga una implementación básica de una biblioteca externa o un lenguaje, puede utilizar la rica estructura simbólica de Wolfram Language para crear una función de alto nivel conveniente que permita a los usuarios utilizar fácilmente cualquier funcionalidad ya implementada. Al menos, esto debería ser factible en un mundo ideal, donde todos los elementos de carga de bibliotecas, etc., se resuelvan automáticamente con Wolfram Language. (Cabe señalar que en la práctica pueden surgir problemas con la configuración de lenguajes externos en un sistema informático específico, y en el almacenamiento en la nube pueden surgir problemas adicionales de seguridad).

Por cierto, cuando analiza por primera vez bibliotecas externas típicas, a menudo parecen demasiado complejas para abarcarse solo con unas pocas funciones, pero en muchos casos gran parte de la complejidad surge de crear la infraestructura necesaria para la biblioteca y todas las funciones para su soporte. Sin embargo, al usar el lenguaje Wolfram Language, la infraestructura generalmente ya está integrada en los paquetes, por lo que no es necesario revelar todas estas funciones de soporte en detalle, solo se deben crear funciones para unas pocas funciones "principales" orientadas a la aplicación en la biblioteca.

«Ecosistema» de la base de conocimientos

Si ha escrito funciones que utiliza constantemente, ¡envíelas al repositorio de funciones de Wolfram! Si al final no resulta en algo mayor (el desarrollo del lenguaje), seguirá siendo mucho más conveniente usar las funciones para uso personal. Sin embargo, es lógico suponer que, si usa funciones constantemente, otros usuarios también las encontrarán útiles.

Es natural que se encuentre en una situación donde no tenga la posibilidad —o no quiera— compartir sus funciones o en caso de acceder a recursos informativos privados. Incluso en tales casos, puede simplemente desplegar funciones en su propia cuenta en la nube, especificando los derechos de acceso a ellas. (Si en su organización hay una nube privada Wolfram Enterprise, pronto podrá alojar su propio repositorio privado de funciones, el cual se puede administrar desde su organización y establecer si se permite la vista previa de vistas para usuarios externos o no.)

Las funciones que envíe al repositorio de funciones de Wolfram no necesitan ser perfectas; solo deben ser útiles. Es un poco como la sección de "Errores" en la documentación clásica de Unix: en la "Sección de definiciones" hay una sección de "Notas del autor", donde puede describir limitaciones, problemas, etc., que ya conoce sobre su función. Además, al enviar su función al repositorio, puede agregar notas a la entrega, que serán leídas por un equipo de curadores especializados.

Después de publicar la función, su página siempre tiene dos enlaces en la parte inferior: «Enviar un mensaje sobre esta función» y «Discutir en la comunidad de Wolfram». Si adjunta una etiqueta (por ejemplo, informar de errores), puede marcar la opción que indica que desea que su mensaje y su información de contacto sean enviados al autor de la función.

A veces es necesario utilizar simplemente funciones del repositorio de funciones de Wolfram, como las funciones integradas, sin revisar su código. Sin embargo, si desea "echar un vistazo dentro", siempre hay un botón "Cuaderno" en la parte superior. Haga clic en él y obtendrá su propia copia del cuaderno de definición original que fue enviado al repositorio de funciones. A veces, simplemente puede usarlo como ejemplo para sus necesidades. Además, también puede desarrollar su propia modificación de esta función. Puede que desee almacenar estas funciones que ha encontrado del repositorio en su computadora o en su cuenta de su almacenamiento en la nube, o tal vez desee enviarlas a la base de conocimientos de funciones, quizás como una versión mejorada o complementada de la función original.

En el futuro, planeamos soportar ramificaciones al estilo Git para los repositorios de funciones, pero por ahora estamos tratando de simplificar esto, y siempre tenemos solo una versión común de cada función integrada en el lenguaje. La mayoría de las veces (si los desarrolladores no se niegan a mantener las funciones que han desarrollado y responden a los mensajes de los usuarios), el autor original de la función obtiene el control de las actualizaciones y envía nuevas versiones, que luego son revisadas y, si pasan el proceso de validación, se publican en el lenguaje.

Consideremos la cuestión de cómo funciona la "versionado" de las funciones desarrolladas. En este momento, cuando utiliza una función del repositorio de funciones, su definición se almacenará de forma continua en su computadora (o en su cuenta en la nube, si está utilizando la nube). Si hay una nueva versión de la función disponible, la próxima vez que la use recibirá un mensaje notificándole. Y si desea actualizar la función a la nueva versión, puede hacerlo mediante el comando ResourceUpdate("El objeto BLOB funcional" en realidad almacena más información sobre las versiones, y en el futuro planeamos hacerlo más accesible para nuestros usuarios.)

Una de las excelentes características del repositorio de funciones de Wolfram es que cualquier programa de Wolfram Language en cualquier lugar puede utilizar funciones de él. Si el programa aparece en una notebook, a menudo es conveniente formatear las funciones del repositorio como funciones fácilmente legibles de "objetos binarios funcionales" (posiblemente con un conjunto adecuado de versiones).

Siempre puedes acceder a cualquier función del repositorio de funciones usando texto ResourceFunction […]. Y esto es muy conveniente si estás escribiendo código o scripts directamente para Wolfram Engine, por ejemplo, con la ayuda de un IDE o un editor de texto de código (es importante destacar que el repositorio de funciones es completamente compatible con Free Wolfram Engine para desarrolladores).

¿Cómo funciona?

Dentro de las funciones en el repositorio de Wolfram, esto es posible utilizando el mismo sistema de recursos que en todos nuestros otros repositorios existentes (almacenamiento de datos, Neural Net Repository, colección de proyectos demostrativos etc.), así como todos los demás recursos del sistema de Wolfram, ResourceFunction se basa en última instancia en la función ResourceObject.

Consideremos ResourceFunction:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Dentro puedes ver información utilizando la función Information:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

¿Cómo funciona la configuración de la función de recurso? El más simple es un caso puramente local. Aquí hay un ejemplo que toma una función (en este caso, simplemente una función pura) y la define como una función de recurso para la sesión actual en el programa:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Una vez que hayas hecho la definición, puedes usar la función de recurso:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

Ten en cuenta que en este objeto BLOB de la función hay un ícono negro Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram. Esto significa que la función BLOB se refiere a la función de recursos en memoria, definida para la sesión actual. Para la función de recurso que se almacena permanentemente en tu computadora o en tu cuenta en la nube, hay un ícono gris Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram. Y para la función de recurso oficial en el repositorio de funciones de Wolfram, hay un ícono naranja Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram.

Entonces, ¿qué ocurre cuando usas el menú 'Despliegue' en la notebook de definición? Primero, toma todas las definiciones de la notebook y crea de ellas un símbolo ResourceObject). (Y si está utilizando un IDE de texto o un programa, también puede crear explícitamente ResourceObject)

El despliegue local de la función desde el repositorio en su computadora se realiza mediante el comando LocalCache para el objeto recurso, para guardarlo como LocalObject en su sistema de archivos. El despliegue en la cuenta en la nube se realiza mediante el comando CloudDeploy para el objeto recurso, y el despliegue público en la nube — CloudPublish. En todos los casos, ResourceRegister también se utiliza para registrar el nombre de la función de recurso, así que ResourceFunction[«name»] funcionará.

Si presiona el botón Submit para el Repositorio de Funciones, lo que sucede debajo ResourceSubmit se llama al objeto recurso. (Y si está utilizando una interfaz de texto, también puede llamarlo ResourceSubmit directamente.)

Por defecto, el envío se realiza bajo un nombre asociado con su identificación de Wolfram ID. Pero si está enviando una solicitud en nombre de un grupo de desarrolladores o una organización, puede establecer un identificador de editor separado y utilizarlo como nombre para interactuar con sus visiones.

Una vez que haya enviado cualquiera de sus funciones a la base de conocimientos de funciones, estará en la cola para revisión. Si recibe comentarios en respuesta, generalmente estarán en forma de un archivo de texto con celdas de comentarios adicionales. Siempre puede verificar el estado de su solicitud al entrar en el portal del participante del sistema de recursos. Pero una vez que su función sea aprobada, será notificado (por correo electrónico), y su función será publicada en el repositorio de funciones de Wolfram.

Algunas sutilezas en el funcionamiento

A primera vista, puede parecer que solo se puede tomar un cuaderno de definición y colocarlo literalmente en el repositorio de funciones, sin embargo, en realidad hay muchas sutilezas, y para manejarlas se requiere realizar una programación meta bastante compleja, procesando simbólicamente tanto el código que define la función como el propio cuaderno de definición. Gran parte de esto ocurre internamente, es decir, “tras bambalinas”, pero puede tener algunas implicaciones que vale la pena entender si va a contribuir a la base de conocimientos de funciones.

La primera sutileza directa: cuando llenes el "Bloc de notas de definiciones", puedes simplemente referirte a tu función en cualquier lugar utilizando un nombre como MyFunction, que parece un nombre normal para una función en el lenguaje Wolfram, pero para la documentación del repositorio de funciones, esto se reemplaza ResourceFunction["MyFunction"] – eso es exactamente lo que los usuarios utilizarán realmente al trabajar con la función.

La segunda sutileza: cuando creas una función de recurso desde el Bloc de notas de definición, todas las dependencias involucradas en la definición de la función deben estar fijadas e incluidas explícitamente. Sin embargo, para garantizar que las definiciones permanezcan modulares, todo debe estar en un único espacio de nombres. (Por supuesto, que las funciones que hacen todo esto, se encuentran en el repositorio de funciones.)

Normalmente, nunca verás rastros del código usado para configurar este espacio de nombres. Pero si por alguna razón llamas a un símbolo no completado dentro de tu función, verás que ese símbolo está en el contexto interno de la función. Sin embargo, al procesar el Bloc de notas de definiciones, al menos, el símbolo que corresponde a la función misma, se configura para una mejor visualización como un BLOB funcional, no como un símbolo crudo en el contexto interno.

El repositorio de funciones está destinado a definir nuevas funciones. Y estas funciones pueden tener opciones. Frecuentemente, estos parámetros (por ejemplo, Método o ImageSize) tendrán la posibilidad de ser utilizados para funciones integradas, así como para aquellas que ya tienen símbolos integrados. Pero a veces una nueva función puede necesitar nuevas opciones. Para mantener la modularidad, es necesario que estos parámetros sean símbolos definidos en un contexto interno único (o algo parecido a funciones completas de recurso, es decir, por sí mismas). Para simplificar, el repositorio de funciones permite definir nuevas opciones en las definiciones como cadenas. Y para la conveniencia del usuario, estas definiciones (siempre que utilicen OptionValue y OptionsPattern) también se procesan de tal manera que al utilizar las funciones, los parámetros pueden ser especificados no solo como cadenas, sino también como símbolos globales con los mismos nombres.

La mayoría de las funciones simplemente hacen lo que deben hacer cada vez que se llaman, pero algunas funciones necesitan ser inicializadas antes de que puedan trabajar en una sesión determinada; y para abordar este problema, en la sección 'Definición' hay una subsección llamada 'Inicialización'.

Las funciones del repositorio pueden utilizar otras funciones que ya están en el repositorio para configurar definiciones para el repositorio de funciones, y esas que incluyen dos (o más) funciones que se refieren entre sí deben desplegarse en su sesión de trabajo con el programa para que pueda referirse a ellas como ResourceFunction[«name»], luego puede crear las combinaciones necesarias de esas funciones y agregar una nueva función al repositorio basada en las que ya han sido introducidas anteriormente.

Perspectivas de desarrollo. ¿Qué debe suceder cuando el repositorio se vuelva realmente grande?

Hoy solo estamos lanzando el repositorio de funciones de Wolfram, pero con el tiempo esperamos que su volumen y funcionalidad puedan aumentar drásticamente, y a medida que crezca surgirán diversos problemas que, como ya anticipamos, podrían surgir.

El primer problema tiene que ver con los nombres de las funciones y su unicidad. El repositorio de funciones está diseñado de tal manera que, al igual que para las funciones integradas en el lenguaje Wolfram Language, se puede hacer referencia a cualquier función simplemente indicando su nombre. Pero esto significa inevitablemente que los nombres de las funciones deben ser globalmente únicos en todo el repositorio, así que, por ejemplo, solo puede haber una ResourceFunction[«MyFavoriteFunction»].

A primera vista, esto puede parecer un gran problema, pero hay que entender que en su mayoría es el mismo problema que enfrentan cosas como los dominios de internet o las etiquetas de redes sociales. Y la cuestión es que el sistema necesita tener un registrador — y ese es uno de los roles que nuestra empresa desempeñará para la base de conocimiento de funciones de Wolfram. (Para versiones privadas del repositorio, sus registradores pueden ser los administradores.) Por supuesto, un dominio de internet puede ser registrado sin tener nada en él, pero en el repositorio de funciones, un nombre de función solo puede ser registrado si tiene una definición de función real.

Parte de nuestro papel en la gestión de la base de conocimientos de funciones de Wolfram es asegurar que el nombre elegido para una función sea lógico en relación con la definición de la función, así como que cumpla con las convenciones de nomenclatura del Wolfram Language. Contamos con más de 30 años de experiencia en la denominación de funciones incorporadas en el lenguaje Wolfram, y nuestro equipo de curadores traerá esta experiencia también al repositorio de funciones. Sin duda, siempre hay excepciones. Por ejemplo, puede parecer más preferible tener un nombre corto para alguna función, pero es mejor "protegerse" con un nombre más largo y específico, ya que hay menos posibilidades de que alguien quiera crear un nombre de función similar en el futuro.

(Cabe señalar que simplemente agregar cualquier etiqueta de participante para eliminar la ambigüedad de las funciones no tendrá el efecto esperado. Porque, si no se insiste en que siempre se asigne una etiqueta, será necesario determinar una etiqueta por defecto para cualquier función dada, así como resaltar las etiquetas de los autores, lo que nuevamente requerirá coordinación global.)

A medida que crece el volumen de la base de conocimientos de funciones de Wolfram, uno de los problemas que inevitablemente surgirán será la detectabilidad de las funciones, para lo cual en el sistema está prevista la función de búsqueda (y los archivos de definición pueden incluir palabras clave, etc.). Para las funciones incorporadas en el lenguaje Wolfram, la documentación contiene todo tipo de referencias cruzadas que ayudan a "publicitar" las funciones. Las funciones en el repositorio de funciones pueden referirse a funciones incorporadas. ¿Y qué hay al revés? Para esto, planeamos experimentar con varios esquemas para presentar funciones del repositorio en las páginas de documentación para funciones incorporadas.

Para las funciones incorporadas en el lenguaje Wolfram, existe un llamado nivel de detectabilidad proporcionado por una red de "páginas de referencia", que proporcionan listas organizadas de funciones relacionadas con áreas específicas. Siempre es complicado equilibrar adecuadamente las páginas del directorio y a medida que el lenguaje Wolfram crece, las páginas del directorio a menudo deben reorganizarse completamente. Es bastante sencillo colocar funciones del repositorio en categorías amplias e incluso desglosar esas categorías de manera secuencial, pero es mucho más valioso tener páginas del directorio del lenguaje correctamente organizadas. Aún no está claro cómo crear mejor estas para toda la base de conocimientos de funciones. Por ejemplo, CreateResourceObjectGallery en el repositorio de funciones, cualquiera puede publicar una página web que contenga sus 'selecciones' del repositorio:

Wolfram Function Repository: acceso abierto a la plataforma para extensiones del lenguaje Wolfram

El repositorio de funciones de Wolfram está configurado como un almacenamiento permanente de funciones, donde cualquier función en él siempre funcionará. Sin duda, pueden aparecer nuevas versiones de funciones, y esperamos que algunas funciones eventualmente queden obsoletas. Las funciones funcionarán si se utilizan en programas, pero sus páginas de documentación enlazarán a nuevas funciones más avanzadas.

El repositorio de funciones de Wolfram está diseñado para obtener rápidamente nuevas funciones y explorar nuevas capacidades del lenguaje Wolfram. Con una buena dosis de optimismo, esperamos que parte de lo que se ha investigado en el repositorio de funciones eventualmente tenga sentido convertirse en partes integradas del lenguaje principal Wolfram Language. En la última década, hemos tenido un conjunto similar de funciones que se presentaron originalmente en Wolfram | Alpha. Y una de las lecciones aprendidas a partir de esta experiencia es que se requiere mucho trabajo para alcanzar los estándares de calidad y coherencia en los que nos enfocamos en todo lo que se integra en el lenguaje Wolfram, lo cual suele ser más complicado que el esfuerzo inicial de implementar una idea. Pero incluso así, una función en la base de conocimientos de funciones puede servir como una prueba de concepto muy útil para una función futura que eventualmente puede ser integrada en el lenguaje Wolfram.

Aquí lo más importante es que la función en el repositorio de funciones está disponible para que cada usuario la utilice ahora mismo. Tal vez, la función incorporada del lenguaje pueda ser mucho mejor y más eficiente, pero el repositorio de funciones permite a los usuarios acceder de inmediato a todas las nuevas características. Y, lo que es especialmente importante, este concepto permite a todos añadir sus propias nuevas funciones.

En el pasado, esta idea en la historia del lenguaje Wolfram no habría funcionado tan bien como ahora, pero en esta etapa ya se ha invertido tanto esfuerzo en el lenguaje y se ha desarrollado una comprensión tan profunda de los principios de diseño del lenguaje, que ahora parece muy posible que una gran comunidad de usuarios añada funciones que mantengan la coherencia del proyecto, haciéndolas útiles para un amplio público.

En la comunidad de usuarios del Wolfram Language hay un increíble espíritu de talento. (Por supuesto, en esta comunidad participan muchos de los principales expertos en investigación y desarrollo en diversas áreas). Espero que el repositorio de funciones de Wolfram proporcione una plataforma efectiva para descubrir y difundir este espíritu de talento. Solo juntos podremos crear algo que amplíe significativamente el ámbito de aplicación de la paradigmática computacional del lenguaje Wolfram.

Durante más de 30 años, hemos recorrido un largo camino con el Wolfram Language. Ahora, juntos, avancemos aún más. Insto a todos los respetados usuarios del Wolfram Language en todo el mundo a utilizar este repositorio funcional como plataforma, así como el nuevo proyecto de software, Free Wolfram Engine, para desarrolladores.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster