Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

¡Hola Habr! Les presento una traducción del post de Stephen Wolfram. "El repositorio de funciones Wolfram: lanzamiento de una plataforma abierta para ampliar Wolfram Language".

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Requisitos previos para la coherencia de Wolfram Language

Hoy nos encontramos en el umbral de grandes logros junto con el lenguaje de programación. Lenguaje Wolframio. Hace apenas tres semanas lanzamos Motor Wolfram gratuito para desarrolladorespara ayudar a nuestros usuarios a integrar Wolfram Language en sus proyectos de software a gran escala. Hoy estamos lanzando Repositorio de funciones de Wolfram, con el fin de proporcionar una plataforma coordinada para funciones creadas para extender el lenguaje Wolfram, y también abrimos un repositorio de funciones para cualquiera que pueda contribuir al desarrollo de nuestro producto de software.

El repositorio de funciones Wolfram es algo posible gracias a la naturaleza única de Wolfram Language no sólo como lenguaje de programación, sino también como lenguaje informático a gran escala. En los lenguajes de programación tradicionales, agregar nuevas funciones importantes generalmente implica la creación de bibliotecas adicionales completas que pueden funcionar o no cuando se usan juntas. Sin embargo, en Wolfram Language Hay muchas cosas que ya están integradas en el propio lenguaje., que es posible ampliar significativamente su funcionalidad simplemente agregando nuevas funciones que se integran inmediatamente en la estructura holística de todo el lenguaje.

Por ejemplo, el repositorio de funciones de Wolfram ya contiene 532 nuevas características estructurado en 26 categorías temáticas:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Asimismo más de 6000 funciones estándar, integrado en Wolfram Language, cada función del repositorio tiene una página de documentación con una descripción detallada de las mismas y ejemplos de trabajo:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Para acceder a la página, copie el objeto anterior (función BLOB), péguelo en la línea de entrada y luego ejecute la función; ya está integrada en Wolfram Language y es compatible de forma predeterminada a partir de versión 12.0:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Cabe señalar aquí que al procesar LogotipoQRCódigo No es necesario, por ejemplo, configurar una "biblioteca de procesamiento de imágenes", ya que ya hemos implementado una forma algorítmica consistente y cuidadosa en Wolfram Language. procesamiento de imágenes, que puede procesarse inmediatamente mediante varias funciones del lenguaje gráfico:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

espero que con el apoyo comunidad maravillosa y talentosa, que ha ido creciendo y expandiéndose (basado en Wolfram Language) durante las últimas décadas. El repositorio de funciones de Wolfram permitirá en el futuro previsible ampliar significativamente la gama de funciones (posiblemente potencialmente significativas, especializadas en diversos campos de la ciencia y la tecnología) disponibles en el lenguaje. Por lo tanto, es posible utilizar tanto el contenido del idioma (sus funciones integradas) como principios de desarrollo, que se implementan en función del idioma. (Cabe señalar aquí que Wolfram Language ya tiene más de 30 años de historia de desarrollo y crecimiento estable).
Las funciones del repositorio pueden contener fragmentos de código pequeños o grandes escritos en Wolfram Language. Por ejemplo, estas podrían ser llamadas API y servicios externos o bibliotecas externas en otros idiomas. La característica única de este enfoque es que cuando profundiza en la funcionalidad a nivel de usuario, no habrá posibles inconsistencias porque el enfoque está construido sobre la estructura consistente de Wolfram Language - y cada función funcionará automáticamente correctamente - exactamente como intencionado. Ella debería.
El shell y la estructura de programación de Wolfram Feature Repository están diseñados para que todos puedan contribuir a la causa común de la manera más simple y conveniente para ellos; de hecho, solo completando el archivo de texto del bloc de notas (con extensión nb) WL. Las funciones automáticas integradas le permiten verificar las nuevas funciones agregadas al repositorio para garantizar su integración en el idioma. Nuestra empresa apuesta por la amplia gama de usuarios que pueden integrar sus funciones en el lenguaje, más que por la gran complejidad de las nuevas funciones - y aunque hay un proceso de revisión, no insistimos en nada parecido minucioso análisis de diseño o estándares estrictos para la integridad y confiabilidad de las nuevas funciones de usuario, en lugar de las pruebas más rigurosas de las funciones integradas en el lenguaje principal que empleamos.

Hay muchas compensaciones y detalles en este enfoque, pero nuestro objetivo es optimizar el repositorio de funciones de Wolfram tanto para la experiencia del usuario como para garantizar que las nuevas funciones del usuario contribuyan significativamente al desarrollo del lenguaje. A medida que crezcamos, no tengo ninguna duda de que tendremos que inventar nuevos métodos para procesar y validar funciones integradas en el repositorio, sobre todo para organizar una gran cantidad de funciones y encontrar aquellas que los usuarios necesitan. Sin embargo, es alentador que el camino que hemos elegido sea un buen comienzo. yo personalmente Se agregaron varias características. a la base de datos original. Muchos de ellos se basan en 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, inmediatamente y en cualquier momento, utilizar estas funciones según sea necesario, sin tener que preocuparme por buscar archivos, descargar paquetes, etc.

Aumento de la eficiencia y reducción de costes

Incluso antes de Internet, había formas de compartir código de Wolfram Language (nuestro primer proyecto centralizado importante fue Fuente matemática, creado para Mathematica en 1991 basado en CD-ROM, etc.). Por supuesto, el enfoque propuesto para la implementación basado en el repositorio de funciones de Wolfram es una herramienta más poderosa y confiable para implementar las tareas anteriores.

Durante más de 30 años, nuestra empresa ha trabajado diligentemente para mantener la integridad de la estructura del lenguaje Wolfram, y esto es fundamental para garantizar que el lenguaje Wolfram se convierta no solo en un lenguaje de programación, sino también en un lenguaje informático completo. Y por lo tanto, la esencia del enfoque para implementar el repositorio de funciones de Wolfram es utilizar un enfoque unificado para programar y desarrollar nuevas funciones que se agregan secuencialmente y se ajustan al marco del lenguaje para que pueda desarrollarse y coevolucionar.

En la estructura de implementación de cada función ocurren varios procesos computacionales. Cabe señalar aquí que es necesario que la función tenga una apariencia clara y uniforme y legibilidad visual para el usuario. En este contexto, las funciones integradas de Wolfram Language se presentan con más de 6000 ejemplos secuenciales de cómo programar funciones correctamente (estos son nuestros vídeos de programación en vivoque incluyen cientos de horas de proceso de creación de programas estándar). En última instancia, lo que este enfoque hace que el repositorio de características de Wolfram sea capaz de funcionar bien es la naturaleza estructural de Wolfram Language, con su gran cantidad de bibliotecas adicionales y variadas que ya están integradas en el lenguaje. Por ejemplo, si tiene una función que procesa imágenes, o matrices dispersasO estructuras molecularesy datos geográficos u otros: su representación simbólica coherente ya existe en el idioma y, gracias a esto, su función se vuelve inmediatamente compatible con otras funciones en el idioma.

Crear un repositorio que realmente funcione bien es una tarea de metaprogramación interesante. Por ejemplo, un exceso de restricciones en el programa no permitirá obtener la unificación y universalidad requeridas del algoritmo. Al igual que con un número insuficiente de restricciones funcionales, no podrá implementar una secuencia de ejecución del algoritmo suficientemente correcta. Varios ejemplos anteriores de implementación de un compromiso de estos enfoques, implementados por nuestra empresa, funcionaron de manera bastante estable: estos son: Demostraciones del Proyecto Tungsteno, lanzado en 2007 y ahora se ejecuta en línea con más de 12000 demostraciones interactivas para el usuario. EN Base de datos Wolfram Hay más de 600 bases de datos listas para usar que se pueden utilizar en Wolfram Language, y Almacenamiento de red neuronal Wolfram se repone con nuevas redes neuronales casi todas las semanas (ya hay 118) y se conectan inmediatamente a través de la función Modelo de red en Wolfram Language.

Todos los ejemplos anteriores tienen una característica fundamental: los objetos y funciones recopilados en el proyecto tienen un grado muy alto de estructuración y distribución de procesos. Por supuesto, el detalle de la estructura de lo que es una demostración, una red neuronal o cualquier otra cosa puede variar mucho, pero la estructura fundamental de cualquier repositorio actual siempre sigue siendo la misma. Entonces, ¿cuál es su opinión, querido usuario, acerca de la creación de un repositorio que agregue extensiones al lenguaje Wolfram? Wolfram Language está diseñado para ser extremadamente flexible, por lo que puede ampliarse y modificarse de cualquier forma. Esta circunstancia es extremadamente importante para la capacidad de crear rápidamente varios proyectos de software a gran escala en Wolfram Language. Cabe señalar aquí que a medida que aumenta la flexibilidad del idioma, el costo de los proyectos implementados en dicho idioma aumentará inevitablemente. Esto se debe al hecho de que cuanto más utiliza el usuario dicho lenguaje, más funcionalidad específica recibe, pero no debemos olvidar que este enfoque también puede tener aspectos negativos en términos de la incapacidad de garantizar la coherencia coherente de los módulos del programa.

Existe un problema común con las bibliotecas en los lenguajes de programación tradicionales: si usa una biblioteca, por ejemplo, el código funcionará correctamente, pero si intenta usar 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 informático completo, no hay forma de garantizar la presencia de representaciones integradas consistentes para funciones o tipos de datos distintos de sus estructuras básicas. Pero, de hecho, el problema es aún mayor de lo que parece a primera vista: si uno está construyendo una vertical de funcionalidad a gran escala, entonces sin los enormes costos de programación centralizada de proyectos que ponemos en el lenguaje Wolfram, es imposible lograr consistencia. Por eso es importante que todos los módulos de software funcionen siempre correctamente juntos.

Entonces, la idea detrás del repositorio de funciones Wolfram es evitar el problema descrito anteriormente simplemente agregando extensiones al lenguaje en fragmentos de código relativamente pequeños a través de funciones individuales que son más fáciles de desarrollar como módulos coherentes. Dicho esto, hay características de programación que no se pueden hacer convenientes usando funciones individuales (y nuestra compañía planea lanzar un algoritmo de programación optimizado en un futuro cercano para ayudar a implementar paquetes de software a gran escala). Sin embargo, basándose en las funciones ya integradas en Wolfram Language, existen muchas posibilidades de programación que se implementan en función de funciones individuales. La idea aquí es que con relativamente poco esfuerzo de programación es posible crear una serie de funciones nuevas y muy útiles que darán suficiente coherencia al diseño, estarán bien coordinadas entre sí y además, además de esto, podrá utilizarse fácil y ampliamente en el idioma en el futuro.

Este enfoque es, por supuesto, un compromiso. Si se implementara un paquete más grande, se podría imaginar un mundo completamente nuevo de funcionalidades que sería extremadamente poderoso y útil. Si es necesario obtener una nueva funcionalidad que se adapte a todo lo demás, pero no está dispuesto a dedicar mucho esfuerzo al desarrollo del proyecto, esto, desafortunadamente, puede conducir a una reducción en el alcance de su proyecto. La idea detrás del repositorio de funciones Wolfram es proporcionar funcionalidad a una parte definitoria de un proyecto; este enfoque agregará una funcionalidad poderosa y al mismo tiempo facilitará el mantenimiento de una buena coherencia en un proyecto de programación.

Ayuda para agregar funciones personalizadas al repositorio de funciones

Nuestro equipo ha trabajado arduamente para facilitar a los usuarios la contribución a las funciones del repositorio Wolfram. En el escritorio (ya en versión 12.0), simplemente puede recorrer las pestañas del menú principal de forma secuencial: Archivo > Nuevo > Elemento del repositorio > Elemento del repositorio de funciones y obtendrá "Cuaderno de definición" (programáticamente dentro del banco de trabajo. También puede usar la función analógica - CrearCuaderno["RecursoFunción"]):

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Hay dos pasos principales que deberá realizar: primero, escriba el código de su función y, segundo, escriba la documentación que ilustre cómo debería funcionar su función.
Haga clic en el botón "Abrir muestra" en la parte superior para ver un ejemplo de lo que debe hacer:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Básicamente, está intentando crear algo similar a una función integrada en Wolfram Language. Excepto que puede hacer algo mucho más específico que una función integrada. Al mismo tiempo, las expectativas en cuanto a su integridad y fiabilidad serán mucho menores.
Debe darle a su función un nombre que siga las pautas de nomenclatura de funciones de Wolfram Language. Además, necesitará desarrollar documentación para su función, similar a las funciones integradas del lenguaje. Hablaré de esto con más detalle más adelante. Por ahora, sólo observe que en la fila de botones en la parte superior del archivo del cuaderno de definiciones hay un botón "Pautas de estilo", que explica qué hacer, y un botón Herramientas, que proporciona herramientas para formatear la documentación de su función.
Cuando esté seguro de que todo está completado correctamente y esté listo, haga clic en el botón "Verificar". Es completamente normal que aún no hayas descubierto todos los detalles. Por lo tanto, la función "Verificar" se ejecutará automáticamente y realizará muchas comprobaciones de estilo y coherencia. A menudo, le pedirá inmediatamente que confirme y acepte las correcciones (por ejemplo: "Esta línea debe terminar con dos puntos" y le pedirá que ingrese dos puntos). A veces te pedirá que agregues o cambies algo tú mismo. Agregaremos constantemente nuevas funciones a la funcionalidad automática del botón Verificar, pero básicamente su propósito es garantizar que todo lo que envíe al repositorio de funciones siga de cerca tantas pautas de estilo como sea posible.

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Entonces, después de ejecutar "Verificar", puede usar "Vista previa". "Vista previa" crea una vista previa de la página de documentación que definió para su función. También puede crear una vista previa de un archivo creado en su computadora o de un archivo ubicado en el almacenamiento en la nube. Si, por alguna razón, no está satisfecho con lo que ve en la vista previa, simplemente regrese y haga las correcciones necesarias y luego haga clic en el botón Vista previa nuevamente.
Ahora está listo para enviar su función al repositorio. El botón Implementar le ofrece cuatro opciones:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Lo importante en este paso es que puede enviar su función al repositorio de funciones de Wolfram para que esté disponible para cualquiera. Al mismo tiempo, también puedes colocar tu función para un número limitado de usuarios. Por ejemplo, puede crear una función alojada localmente en su computadora para que esté disponible cuando use esa computadora en particular. O puedes publicarlo en tu cuenta en la nube, para que esté disponible para ti cuando estés conectado a la nube. También puede alojar (implementar) públicamente la función a través de su cuenta en la nube. No estará en el repositorio central de funciones de Wolfram, pero podrá darle a alguien una URL que le permitirá obtener la función de su cuenta. (En el futuro, también admitiremos repositorios centrales en toda nuestra empresa).

Entonces digamos que realmente desea enviar su función a la base de conocimiento de funciones de Wolfram. Para hacer esto, haga clic en el botón "Enviar" al repositorio. Entonces, ¿qué está pasando en este momento? Su solicitud se pone inmediatamente en cola para que nuestro dedicado equipo de curadores la revise y apruebe.

A medida que su solicitud avance en el proceso de aprobación (que generalmente demora varios días), recibirá comunicaciones sobre su estado y posiblemente sugerencias para uso futuro. Pero una vez que se apruebe su característica, se publicará inmediatamente en el Repositorio de características de Wolfram y estará disponible para que cualquiera la use. (Y esto aparecerá en resúmenes de noticias sobre nuevas funciones y así sucesivamente)

¿Qué debería haber en el almacenamiento?

Cabe señalar que nuestra empresa tiene estándares muy altos en cuanto a integridad, confiabilidad y calidad general, y de las más de 6000 funciones que ya hemos integrado en Wolfram Language durante los últimos 30 años, todas cumplen con los requisitos anteriores. El objetivo del Wolfram Function Repository es utilizar toda la estructura y funcionalidad que ya existe en Wolfram Language para agregar tantas funciones mucho más ligeras (es decir, funciones de mayor rendimiento) como sea posible.

Por supuesto, las funciones en el repositorio de funciones de Wolfram deben ajustarse a los principios de diseño de Wolfram Language, para que puedan interactuar completamente con otras funciones y con las expectativas de los usuarios sobre cómo debería funcionar correctamente la función. Sin embargo, las funciones no tienen por qué ser igualmente completas o fiables.

En las funciones integradas del lenguaje Wolfram, trabajamos arduamente para que las funciones de programación sean lo más generales posible. Dicho esto, en el repositorio de funciones de Wolfram no hay nada malo en tener una función que simplemente maneje algún caso muy específico pero útil. Por ejemplo, la función Enviar correo desde el cuaderno Puede recibir archivos en un formato específico y crear correo de una manera específica. Diagrama poligonal crea gráficos con solo ciertos colores y etiquetas, etc.

Otro punto relacionado con las funciones integradas es que nuestra empresa hace todo lo posible para manejar todos los casos atípicos, manejar correctamente las entradas incorrectas, etc. En un repositorio de funciones, es completamente normal que haya una función especial que maneje los casos principales de resolución de un problema e ignore todos los demás.

El punto obvio es que es mejor tener funciones que hagan más y mejor, pero la optimización para un repositorio de funciones - a diferencia de las funciones integradas del lenguaje Wolfram - debería tener más funciones agrupadas con más funciones en lugar de profundizar en los procesos de implementación de cada función específica.

Ahora veamos un ejemplo de prueba de funciones en un repositorio. Las expectativas de coherencia para dichas funciones son, naturalmente, mucho más bajas que para las funciones integradas en el lenguaje. Esto es especialmente cierto en los casos en que las funciones dependen de recursos externos como las API; es importante realizar pruebas consistentes constantemente, lo que ocurre automáticamente dentro de los algoritmos de verificación. En el archivo nb, puede especificar definiciones explícitamente (en la sección Información adicional) y especificar tantas pruebas como se definen mediante cadenas de entrada y salida u objetos de tipo de caracteres completos. Prueba de verificación, tanto como mejor le parezca. Además, el sistema intenta constantemente convertir los ejemplos de documentación que usted proporciona en un proceso de verificación (y a veces esto puede consumir muchos recursos, por ejemplo, para una función cuyo resultado depende de números aleatorios o la hora del día).

Como resultado, el repositorio de funciones tendrá varias complejidades de implementación. Algunos serán solo una línea de código, otros pueden involucrar miles o decenas de miles de líneas, probablemente usando muchas funciones auxiliares. ¿Cuándo vale la pena agregar una función que requiere muy poco código para definirse? Básicamente, si para una función hay buen nombre mnemotécnico, que los usuarios entenderían fácilmente si lo vieran en un fragmento de código, entonces ya se puede agregar. De lo contrario, probablemente sea mejor volver a agregar el código a su programa cada vez que necesite usarlo.

El objetivo principal de un repositorio de funciones (como su nombre indica) es introducir nuevas funciones en el lenguaje. Si desea agregar nuevos datos o nuevas entidades, usar Repositorio de datos Wolfram. Pero ¿qué pasa si quieres introducir nuevos tipos de objetos para tus cálculos?

En realidad, hay dos formas. 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 puedes escribir su representación simbólica y usarla al ingresar o generar funciones en un repositorio de funciones.

Pero, ¿qué sucede si desea representar un objeto y luego definir, a través de funciones existentes en Wolfram Language, que desea trabajar con él? Wolfram Language siempre ha tenido un mecanismo ligero para esto, llamado valores ascendentes. Con algunas restricciones (especialmente para funciones que no puede evaluar sus argumentos), un repositorio de funciones le permite simplemente representar una función y definir valores para ella. (Elevar la expectativa de coherencia al crear un nuevo diseño principal que esté completamente integrado en Wolfram Language es generalmente un procedimiento muy importante que no se puede lograr simplemente aumentando el costo del proyecto y es algo que nuestra empresa hace como parte de los proyectos. para el desarrollo a largo plazo del lenguaje, esta tarea no es un objetivo que se establezca como parte del desarrollo del repositorio).

Entonces, ¿qué podría haber en el código de función en un repositorio de funciones? Todo integrado en Wolfram Language, por supuesto (al menos si no representa amenazas para Seguridad y el rendimiento del programa en sí, como entorno informático), así como cualquier función del repositorio de funciones. Sin embargo, existen otras funcionalidades: una función en un repositorio de funciones puede llamar a una API, o en Nube de wolframioO de otra fuente. Por supuesto, existen algunos riesgos asociados con esto. Debido al hecho de que no hay garantías de que la API no cambie y la función en el almacén de funciones dejará de funcionar. Para ayudar a identificar problemas como este, hay una nota en la página de documentación (en la sección Requisitos) para cualquier característica que dependa de algo más que la funcionalidad integrada de Wolfram Language. (Por supuesto, cuando se trata de datos reales, puede haber problemas incluso con esta funcionalidad, porque los datos del mundo real cambian constantemente y, a veces, incluso sus definiciones y estructuras cambian).

¿Todo el código para el repositorio de funciones de Wolfram debería escribirse en Wolfram? Ciertamente, el código dentro de la API externa no debe estar escrito en el lenguaje Wolfram, que ni siquiera constituye el código del lenguaje. De hecho, si encuentra una función en casi cualquier lenguaje o biblioteca externa, puede crear un contenedor que le permita usarla en el repositorio de funciones de Wolfram. (Por lo general, debería utilizar las funciones integradas para esto ExternoEvaluar o Función externa en código de lenguaje Wolfram.)

Entonces, ¿cuál es el punto de hacer esto? Básicamente, esto le permite utilizar todo el sistema integrado de Wolfram Language y todo su conjunto unificado de capacidades de software. Si obtiene la implementación base de una biblioteca o lenguaje externo, puede usar la rica estructura simbólica de Wolfram Language para crear una función conveniente de nivel superior que permita a los usuarios usar fácilmente cualquier funcionalidad ya implementada. Como mínimo, esto debería ser factible en un mundo ideal donde existan todos los componentes básicos de las bibliotecas de carga, etc., en cuyo caso serían manejados automáticamente por Wolfram Language. (Cabe señalar que en la práctica puede haber problemas con configurar idiomas externos sistema informático específico y el almacenamiento en la nube pueden plantear problemas de seguridad adicionales).

Por cierto, cuando miras por primera vez las bibliotecas externas típicas, a menudo parecen demasiado complejas para cubrirlas con solo unas pocas funciones, pero en muchos casos, gran parte de la complejidad proviene de la creación de la infraestructura necesaria para la biblioteca y todas las funciones para apoyarlo. Sin embargo, cuando se utiliza Wolfram Language, la infraestructura generalmente ya está integrada en los paquetes, por lo que no es necesario exponer todas estas funciones de soporte en detalle, sino solo crear funciones para las funciones "principales" específicas de la aplicación en la biblioteca. .

"Ecosistema" de la base de conocimientos.

Si ha escrito funciones que utiliza regularmente, envíelas al repositorio de funciones de Wolfram. Si de esto no sale algo más (desarrollo del lenguaje), aun así le resultará mucho más cómodo utilizar las funciones para uso personal. Sin embargo, es lógico suponer que si utiliza las funciones con regularidad, quizás otros usuarios también las encuentren útiles.

Naturalmente, es posible que se encuentre en una situación en la que no pueda - o no quiera - compartir sus funciones o en el caso de obtener acceso a recursos de información privados. Incluso en tales casos, simplemente puede implementar las funciones en su propia cuenta en la nube, especificando derechos acceso a ellos. (Si su organización tiene Nube privada de Wolfram Enterprise, pronto podrá albergar su propio repositorio de funciones privado, que se puede administrar desde dentro de su organización y establecer si se debe forzar o no que las vistas sean vistas por usuarios externos).

Las funciones que envíe al repositorio de funciones de Wolfram no tienen que ser perfectas; sólo tienen que ser útiles. Esto es un poco como la sección "Errores" en la documentación clásica de Unix: en la "Sección Definiciones" hay una sección "Notas del autor" donde puede describir limitaciones, problemas, etc. que ya conoce sobre su función. Además, cuando envía su característica al repositorio, puede agregar notas de envío que serán leídas por un equipo dedicado de curadores.

Una vez que se publica una característica, su página siempre tiene dos enlaces en la parte inferior: "Enviar un mensaje sobre esta característica"Y"Discutir en la comunidad Wolfram" Si adjunta una nota (por ejemplo, cuénteme sobre errores), puede marcar la casilla que dice que desea que su mensaje e información de contacto se compartan con el autor de la característica.

A veces simplemente desea utilizar funciones del repositorio de funciones de Wolfram, como funciones integradas, sin mirar su código. Sin embargo, si quieres echar un vistazo al interior, siempre hay un botón del Bloc de notas en la parte superior. Haga clic en él y obtendrá su propia copia del cuaderno de definiciones original que se envió al repositorio de funciones. A veces puedes usarlo como ejemplo para tus necesidades. Al mismo tiempo, también puedes desarrollar tu propia modificación de esta función. Es posible que desee publicar estas funciones que encontró en el repositorio en su computadora o en su cuenta de almacenamiento en la nube de Aphid, tal vez desee enviarlas a la base de conocimientos de funciones, tal vez como una versión mejorada y ampliada de la función original.

En el futuro, planeamos admitir bifurcaciones al estilo Git para repositorios de funciones, pero por ahora estamos tratando de mantenerlo simple y siempre solo tenemos una versión aceptada de cada función integrada en el lenguaje. La mayoría de las veces (a menos que los desarrolladores dejen de mantener las funciones que desarrollaron y respondan a los envíos de los usuarios), el autor original de la función toma el control de las actualizaciones y envía nuevas versiones, que luego se revisan y, si pasan el proceso de revisión. , publicado en el idioma.

Consideremos la cuestión de cómo funciona el "control de versiones" de las funciones desarrolladas. En este momento, cuando usas una función del repositorio de funciones, su definición se almacenará permanentemente en tu computadora (o en tu cuenta en la nube si estás usando la nube). Si hay una nueva versión de una función disponible, la próxima vez que la use recibirá un mensaje notificándolo. Y si deseas actualizar la función a una nueva versión, puedes hacerlo usando el comando Actualización de recursos. (El "blob de funciones" en realidad almacena más información sobre versiones y planeamos hacerla más accesible para nuestros usuarios en el futuro).

Una de las cosas hermosas del Wolfram Function Repository es que cualquier programa de Wolfram Language, en cualquier lugar, puede usar sus funciones. Si un programa aparece en un bloc de notas, a menudo es conveniente formatear las funciones del repositorio como funciones de "objeto binario de función" fáciles de leer (quizás con un conjunto de versiones apropiado).

Siempre puedes acceder a cualquier función en el repositorio de funciones usando texto Función de recurso[...]. Y esto es muy conveniente si escribe código o scripts directamente para Wolfram Engine, por ejemplo, con usando un IDE o editor de código de texto (Cabe señalar especialmente que el repositorio de funciones es totalmente compatible con Wolfram Engine gratuito para desarrolladores).

Como funciona?

Dentro de las funciones en el repositorio de Wolfram esto es posible usando exactamente el mismo sistemas de recursos bases, como en todos nuestros otros repositorios existentes (Almacén de datos, Repositorio de red neuronal, colección de proyectos de demostración etc.), como todos los demás recursos del sistema Wolfram, Función de recurso en última instancia basado en la función Objeto de recurso.

Considerar Función de recurso:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

En su interior puedes ver alguna información usando la función. Información:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

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

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Una vez que haya realizado la definición, puede utilizar la función de recurso:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

Tenga en cuenta que hay un icono negro en este blob de funciones. Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram. Esto significa que la función BLOB se refiere a la función de recurso en memoria definida para la sesión actual. Una característica de recurso que está almacenada permanentemente en su computadora o cuenta en la nube tiene un ícono gris Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram. Y hay un ícono naranja para una característica de recurso oficial en el Repositorio de características de Wolfram. Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram.

Entonces, ¿qué sucede cuando usas el menú Expandir en el Cuaderno de definiciones? Primero, toma todas las definiciones del bloc de notas y a partir de ellas crea un archivo simbólico. Objeto de recurso). (Y si está utilizando un IDE o programa basado en texto, también puede crear explícitamente Objeto de recurso)

La implementación local de una función desde un repositorio en su computadora se realiza usando el comando caché local para que un objeto de recurso lo guarde como Objeto local en su sistema de archivos. La implementación en una cuenta en la nube se realiza mediante el comando Implementación en la nube para un objeto de recurso, y una implementación de nube pública es Publicar en la nube. En todos los casos Registro de recursos También se utiliza para registrar el nombre de la función del recurso, por lo que Función de recurso["nombre"] funcionará

Si hace clic en el botón Enviar de un repositorio de funciones, ¿qué sucede debajo de él? RecursoEnviar llamado en un objeto de recurso. (Y si está utilizando una interfaz de entrada de texto, también puede llamar RecursoEnviar directamente.)

De forma predeterminada, los envíos se realizan con el nombre asociado con su ID de Wolfram. Pero si envía una solicitud en nombre de un equipo u organización de desarrollo, puede establecer un ID de editor independiente y en su lugar utilícelo como nombre para interactuar con sus vistas.

Una vez que haya enviado cualquiera de sus funciones a la base de conocimientos de funciones, se pondrá en cola para su revisión. Si recibe comentarios en respuesta, generalmente estarán en forma de un archivo de texto con “celdas de comentarios” adicionales agregadas. Siempre puedes comprobar el estado de tu solicitud visitando portal para miembros del sistema de recursos. Pero una vez que se apruebe su función, se le notificará (por correo electrónico) y su función se publicará en el repositorio de funciones de Wolfram.

Algunas sutilezas en el trabajo.

A primera vista, puede parecer que se puede simplemente tomar un cuaderno de definiciones y ponerlo palabra por palabra en un repositorio de funciones; sin embargo, en realidad hay muchas sutilezas involucradas, y manejarlas requiere realizar una metaprogramación bastante compleja, manejar el procesamiento simbólico. como el código que define la función, y se define el Bloc de notas en sí. La mayor parte de esto sucede internamente, entre bastidores, pero puede tener algunas implicaciones que vale la pena comprender si desea contribuir a la base de conocimientos de funciones.

Primera sutileza inmediata: cuando complete el Cuaderno de definiciones, puede simplemente referirse a su función en todas partes usando un nombre como Mifuncion, que parece un nombre normal para una función en Wolfram Language, pero para la documentación del repositorio de funciones se reemplaza Función de recurso["Mi función"] es lo que los usuarios realmente usarán cuando trabajen con la función.

La segunda sutileza: cuando crea una función de recurso desde el Cuaderno de definición, todas las dependencias involucradas en la definición de la función deben capturarse e incluirse explícitamente. Sin embargo, para garantizar que las definiciones sigan siendo modulares, es necesario colocar todo en un formato único. espacio de nombres. (Por supuesto, funciones que lo hacen todo, están en el repositorio de funciones).

Normalmente nunca verá ningún rastro del código utilizado para configurar este espacio de nombres. Pero si por alguna razón llamas a un símbolo subejecutado dentro de tu función, verás que este símbolo está en el contexto interno de la función. Sin embargo, al procesar el Bloc de notas de definición, al menos se muestra el símbolo correspondiente a la función en sí. ajustable para una mejor visualización como un BLOB funcional en lugar de un carácter crudo en el contexto interno.

El repositorio de funciones sirve para definir nuevas funciones. Y estas funciones pueden tener opciones. A menudo estos parámetros (por ejemplo, Método o Tamaño de la imagen) podrá utilizarse para funciones integradas, así como para aquellas para las que ya existen símbolos integrados. Pero a veces una nueva característica puede requerir nuevas opciones. Para mantener la modularidad, estos parámetros deben ser símbolos definidos en un contexto interno único (o algo así como funciones de recursos completas, es decir, ellos mismos). Para simplificar, el repositorio de funciones le permite definir nuevas opciones en las definiciones de cadenas. Y para comodidad del usuario, estas definiciones (suponiendo que usaran Valor de la opción и OpcionesPatrón) también se procesan para que, al utilizar funciones, los parámetros se puedan especificar no sólo como cadenas, sino también como símbolos globales con los mismos nombres.

La mayoría de las funciones simplemente hacen lo que se supone que deben hacer cada vez que se llaman, pero algunas funciones deben inicializarse antes de poder ejecutarse en una sesión en particular; y para resolver este problema, hay una sección de "Inicialización" en la sección Definición.

Las funciones de un repositorio pueden usar otras funciones que ya están en el repositorio; para configurar definiciones para un repositorio de funciones que incluya dos (o más) funciones que hagan referencia entre sí, debe implementarlas en la sesión de su programa para que pueda referencia como en ellos Función de recurso["nombre"], luego puedes crear las combinaciones de estas funciones que necesitas, ejemplos (no entendí) y agregar una nueva función al repositorio basada en las que ya se publicaron anteriormente. (o ya o anteriormente – ambas palabras son torpes)

Perspectivas de desarrollo. ¿Qué debería pasar cuando el repositorio crezca mucho?

Hoy recién estamos lanzando Wolfram Feature Repository, pero con el tiempo esperamos que su tamaño y funcionalidad puedan aumentar dramáticamente y, a medida que crezca en desarrollo, habrá varios problemas que ya anticipamos que pueden surgir.

El primer problema tiene que ver con los nombres de funciones y su unicidad. El repositorio de funciones está diseñado de tal manera que, al igual que las funciones integradas en Wolfram Language, puede hacer referencia a cualquier función determinada simplemente especificando su nombre. Pero esto inevitablemente significa que los nombres de las funciones deben ser globalmente únicos en todo el repositorio, de modo que, por ejemplo, sólo pueda haber una Función de recurso["Mi función favorita"].

Esto puede parecer un gran problema al principio, pero vale la pena darse cuenta de que es básicamente el mismo problema que ocurre con cosas como dominios de Internet o identificadores de redes sociales. Y el hecho es que el sistema simplemente necesita tener un registrador, y esta es una de las funciones que nuestra empresa desempeñará para la base de conocimientos de funciones de Wolfram. (Para las versiones privadas de un repositorio, sus registradores pueden ser administradores). Por supuesto, un dominio de Internet se puede registrar sin tener nada en él, pero en un repositorio de funciones, el nombre de una función sólo se puede registrar si existe una definición real de la función.

Parte de nuestra función en la gestión de la base de conocimientos de funciones de Wolfram es garantizar que el nombre elegido para una función sea lógico dada la definición de la función y que siga las convenciones de nomenclatura de Wolfram Language. Tenemos más de 30 años de experiencia nombrando funciones integradas en Wolfram Language, y nuestro equipo de curadores también aportará esa experiencia al repositorio de funciones. Por supuesto, siempre hay excepciones. Por ejemplo, puede parecer preferible tener un nombre corto para alguna función, pero es mejor "defenderse" con un nombre más largo y específico porque es menos probable que te encuentres con alguien que quiera crear un nombre de función similar en el futuro. .

(Cabe señalar aquí que simplemente agregar alguna etiqueta de miembro para eliminar la ambigüedad de las funciones no tendrá el efecto deseado. Porque, a menos que insista en asignar siempre una etiqueta, deberá definir una etiqueta predeterminada para cualquier función determinada y también asignar etiquetas de autor). , lo que nuevamente requeriría coordinación global.)

A medida que crece la base de conocimiento de las funciones de Wolfram, uno de los problemas que probablemente surgirá es la capacidad de descubrimiento de funciones, para lo cual el sistema proporciona buscando función (y los archivos de definición pueden incluir palabras clave, etc.). Para las funciones integradas en Wolfram Language, hay todo tipo de referencias cruzadas en la documentación para ayudar a “publicitar” las funciones. Las funciones en un repositorio de funciones pueden hacer referencia a funciones integradas. Pero ¿qué pasa al revés? Para hacer esto, vamos a experimentar con diferentes diseños para exponer funciones del repositorio en páginas de documentación para funciones integradas.

Para las funciones integradas en Wolfram Language existe la llamada capa de detección proporcionada por red de "páginas de ayuda", que proporcionan listas organizadas de funciones relacionadas con áreas específicas. Siempre es difícil equilibrar adecuadamente las páginas de manual y, a medida que Wolfram Language crece, las páginas de manual a menudo necesitan ser reorganizadas por completo. Es bastante fácil colocar funciones de un repositorio en categorías amplias, e incluso dividir esas categorías de manera consistente, pero es mucho más valioso tener páginas de referencia de idiomas correctamente organizadas. Aún no está claro cuál es la mejor manera de crearlos para toda la base de conocimientos de funciones. Por ejemplo, Crear galería de objetos de recursos En el repositorio de funciones, cualquiera puede publicar una página web que contenga sus "selecciones" del repositorio:

Repositorio de funciones Wolfram: plataforma de acceso abierto para extensiones de lenguaje Wolfram

El repositorio de funciones de Wolfram está configurado como un repositorio de funciones persistente, donde cualquier función que contenga siempre funcionará. Por supuesto, es posible que estén disponibles nuevas versiones de funciones y esperamos que algunas funciones queden obsoletas con el tiempo. Las funciones funcionarán si se usan en programas, pero sus páginas de documentación se vincularán a funciones nuevas y más avanzadas.

El repositorio de funciones de Wolfram está diseñado para ayudarle a descubrir rápidamente nuevas funciones y aprender nuevas formas de utilizar Wolfram Language. Somos muy optimistas de que algo de lo que se ha explorado en el repositorio de características eventualmente tendrá sentido para convertirse en partes integradas del núcleo de Wolfram Language. Durante la última década hemos tenido un conjunto similar características que se introdujeron originalmente en Wolfram | Alfa. Y una de las lecciones aprendidas de esta experiencia es que lograr los estándares de calidad y consistencia en los que nos enfocamos en todo lo integrado en Wolfram Language requiere mucho trabajo, que muchas veces es más difícil que el esfuerzo inicial para implementar la idea. Aun 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 podría integrarse en Wolfram Language.

Lo más importante aquí es que una función en un repositorio de funciones es algo que está disponible para que todos los usuarios la utilicen en este momento. Es posible que una función en el idioma nativo sea mucho mejor y más eficaz, pero un repositorio de funciones permitiría a los usuarios tener acceso a todas las funciones nuevas de inmediato. Y, lo más importante, este concepto permite a todos agregar las funciones nuevas que deseen.

En una etapa anterior de la historia de Wolfram Language, esta idea no habría funcionado tan bien como lo ha hecho, pero en esta etapa hay tanto esfuerzo puesto en el lenguaje y una comprensión tan profunda de los principios de diseño del lenguaje, que ahora parece muy útil. Es posible que una gran comunidad de usuarios agregue características que mantendrán la coherencia del diseño para que sean útiles para una amplia gama de usuarios.

Existe un increíble espíritu de talento(?) en la comunidad de usuarios de Wolfram Language. (Por supuesto, esta comunidad incluye muchos expertos líderes en I+D en una variedad de campos). Espero que Wolfram Feature Repository proporcione una plataforma eficaz para desbloquear y difundir este espíritu de talento. Sólo juntos podremos crear algo que amplíe significativamente el área en la que se puede aplicar el paradigma informático del lenguaje Wolfram.

En más de 30 años, hemos recorrido un largo camino con Wolfram Language. Ahora juntos, vayamos aún más lejos. Recomiendo encarecidamente a todos los usuarios respetados de Wolfram Language en todo el mundo que utilicen el repositorio funcional como plataforma para esto, así como el nuevo proyecto de software como Free Wolfram Engine para desarrolladores.

Fuente: habr.com

Añadir un comentario