From d9d44f614caee627953c41d95a13f8f7de502c89 Mon Sep 17 00:00:00 2001 From: egonzalez Date: Fri, 26 Aug 2022 19:52:15 -0300 Subject: [PATCH 1/2] Spanish translation --- README.md | 10 + es_es/README.md | 0 es_es/berry-rm-es-es.bbl | 0 es_es/berry-rm-es-es.blg | 18 + es_es/berry-rm-es-es.tex | 14301 +++++++++++++++++++++++++++++++++ es_es/berry_rm_es_es.epub | Bin 0 -> 126320 bytes es_es/berry_rm_es_es.odt | Bin 0 -> 156328 bytes es_es/berryrmeses-img001.png | Bin 0 -> 13072 bytes 8 files changed, 14329 insertions(+) create mode 100644 es_es/README.md create mode 100644 es_es/berry-rm-es-es.bbl create mode 100644 es_es/berry-rm-es-es.blg create mode 100644 es_es/berry-rm-es-es.tex create mode 100644 es_es/berry_rm_es_es.epub create mode 100644 es_es/berry_rm_es_es.odt create mode 100644 es_es/berryrmeses-img001.png diff --git a/README.md b/README.md index f994b18..239e570 100644 --- a/README.md +++ b/README.md @@ -11,3 +11,13 @@ Details: [./zh_cn/README.md](./zh_cn/README.md) Folder: *./en_us*. Details: [./en_us/README.md](./en_us/README.md) + +## Spanish + +Folder: *./es_es*. + +Details: [./es_es/README.md](./es_es/README.md) + + + + diff --git a/es_es/README.md b/es_es/README.md new file mode 100644 index 0000000..e69de29 diff --git a/es_es/berry-rm-es-es.bbl b/es_es/berry-rm-es-es.bbl new file mode 100644 index 0000000..e69de29 diff --git a/es_es/berry-rm-es-es.blg b/es_es/berry-rm-es-es.blg new file mode 100644 index 0000000..e3d09d5 --- /dev/null +++ b/es_es/berry-rm-es-es.blg @@ -0,0 +1,18 @@ +This is 8-bit Big BibTeX version 0.99d +Implementation: C for Unix +Release version: 3.71 (04 mar 2019) + +The 8-bit codepage and sorting file: 88591lat.csf +The top-level auxiliary file: berry-rm-es-es.aux +I found no \citation commands---while reading file berry-rm-es-es.aux +I found no \bibdata command---while reading file berry-rm-es-es.aux +I found no \bibstyle command---while reading file berry-rm-es-es.aux + +Here's how much of BibTeX's memory you used: + Cites: 0 out of 750 + Fields: 0 out of 5000 + Hash table: 200001 out of 200000 + Strings: 81 out of 200000 + Free string pool: 485 out of 65000 + Wizard functions: 0 out of 3000 +(There were 3 error messages) diff --git a/es_es/berry-rm-es-es.tex b/es_es/berry-rm-es-es.tex new file mode 100644 index 0000000..34a6ef5 --- /dev/null +++ b/es_es/berry-rm-es-es.tex @@ -0,0 +1,14301 @@ +% This file was converted to LaTeX by Writer2LaTeX ver. 1.6.1 +% see http://writer2latex.sourceforge.net for more info +\documentclass[a4paper]{article} +\usepackage[latin1]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb,amsfonts,textcomp} +\usepackage[T1]{fontenc} +\usepackage[english,spanish]{babel} +\usepackage{color} +\usepackage{array} +\usepackage{supertabular} +\usepackage{hhline} +\usepackage{hyperref} +\hypersetup{pdftex, colorlinks=true, linkcolor=blue, citecolor=blue, filecolor=blue, urlcolor=blue, pdftitle=, pdfauthor=, pdfsubject=, pdfkeywords=} +\usepackage[pdftex]{graphicx} +% Text styles +\newcommand\textstyleDefinition[1]{#1} +\newcommand\textstyleSourceText[1]{\texttt{#1}} +% Outline numbering +\setcounter{secnumdepth}{0} +\makeatletter +\newcommand\arraybslash{\let\\\@arraycr} +\makeatother +% Page layout (geometry) +\setlength\voffset{-1in} +\setlength\hoffset{-1in} +\setlength\topmargin{2.54cm} +\setlength\oddsidemargin{2.54cm} +\setlength\textheight{23.096cm} +\setlength\textwidth{15.920999cm} +\setlength\footskip{1.524cm} +\setlength\headheight{0cm} +\setlength\headsep{0cm} +% Footnote rule +\setlength{\skip\footins}{0.119cm} +\renewcommand\footnoterule{\vspace*{-0.018cm}\setlength\leftskip{0pt}\setlength\rightskip{0pt plus 1fil}\noindent\textcolor{black}{\rule{0.25\columnwidth}{0.018cm}}\vspace*{0.101cm}} +% Pages styles +\makeatletter +\newcommand\ps@Standard{ + \renewcommand\@oddhead{} + \renewcommand\@evenhead{} + \renewcommand\@oddfoot{\thepage{}\ } + \renewcommand\@evenfoot{\@oddfoot} + \renewcommand\thepage{\arabic{page}} +} +\newcommand\ps@FirstPage{ + \renewcommand\@oddhead{} + \renewcommand\@evenhead{} + \renewcommand\@oddfoot{} + \renewcommand\@evenfoot{} + \renewcommand\thepage{\arabic{page}} +} +\makeatother +\pagestyle{Standard} +\setlength\tabcolsep{1mm} +\renewcommand\arraystretch{1.3} +% List styles +\newcommand\liststyleLii{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLiii{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLiv{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLv{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLvi{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLvii{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLviii{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLix{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLx{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLxiii{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLxiv{% +\renewcommand\theenumi{\arabic{enumi}} +\renewcommand\theenumii{\arabic{enumii}} +\renewcommand\theenumiii{\arabic{enumiii}} +\renewcommand\theenumiv{\arabic{enumiv}} +\renewcommand\labelenumi{\theenumi.} +\renewcommand\labelenumii{\theenumii.} +\renewcommand\labelenumiii{\theenumiii.} +\renewcommand\labelenumiv{\theenumiv.} +} +\newcommand\liststyleLxv{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLxvi{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLxvii{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLxviii{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLxix{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLxx{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLxxi{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\newcommand\liststyleLxxii{% +\renewcommand\theenumi{\arabic{enumi}} +\renewcommand\theenumii{\arabic{enumii}} +\renewcommand\theenumiii{\arabic{enumiii}} +\renewcommand\theenumiv{\arabic{enumiv}} +\renewcommand\labelenumi{\theenumi.} +\renewcommand\labelenumii{\theenumii.} +\renewcommand\labelenumiii{\theenumiii.} +\renewcommand\labelenumiv{\theenumiv.} +} +\newcommand\liststyleLxxiii{% +\renewcommand\labelitemi{{\textbullet}} +\renewcommand\labelitemii{${\circ}$} +\renewcommand\labelitemiii{${\blacksquare}$} +\renewcommand\labelitemiv{{\textbullet}} +} +\title{} +\author{} +\date{2022-08-26} +\begin{document} +\clearpage\setcounter{page}{1}\pagestyle{Standard} +\thispagestyle{FirstPage} + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + +{\centering\sffamily\bfseries +Manual de referencia del lenguaje Berry Script +\par} + + +\bigskip + +{\centering\selectlanguage{spanish} +V1.0.0 +\par} + +{\centering\selectlanguage{spanish} +Guan Wenliang y Stephan Hadinger +\par} + +{\centering +\foreignlanguage{spanish}{5 de julio de 2022} +\par} + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + + +\bigskip + +{\centering\selectlanguage{spanish} +Traducción al Español: Emiliano González (egonzalez.hiperion@gmail.com) +\par} + +\clearpage\clearpage\setcounter{page}{1}\pagestyle{Standard} +\section{Prefacio} +\hypertarget{RefHeadingToc354593639824055}{} +\bigskip + +{\selectlanguage{spanish} +Hace algunos años, intenté portar el lenguaje de script Lua al microcontrolador STM32F4 y luego experimenté un firmware +basado en Lua en ESP8266: NodeMCU. Estas experiencias me hicieron experimentar la conveniencia del desarrollo de +guiones. Más tarde, entré en contacto con algunos lenguajes de script, como Python, JavaScript, Basic y MATLAB. En la +actualidad, solo unos pocos lenguajes son adecuados para portar a la plataforma de microcontroladores. Solía prestar +más atención a Lua porque es un lenguaje de script integrado muy compacto y su objetivo de diseño es estar integrado en +el programa host. Sin embargo, para el microcontrolador, el intérprete de Lua puede no ser lo suficientemente pequeño y +no puede ser ejecutado en un microcontrolador de 32 bits con una memoria relativamente pequeña. Con este fin, comencé a +leer el código Lua y desarrollé mi propio lenguaje de script, Berry, sobre esta base.} + +{\selectlanguage{spanish} +Este es un lenguaje de script integrado ultraligero, también es un lenguaje dinámico multiparadigma. Admite estilos +orientados a objetos, orientados a procesos y funcionales (menos soportado). Muchos aspectos de este lenguaje se +refieren a Lua, pero su sintaxis también se inspira en el diseño de otros lenguajes. Si el lector ya conoce un lenguaje +de alto nivel, la gramática de Berry debería ser muy fácil de entender: el lenguaje tiene solo algunas reglas simples y +un diseño de alcance muy natural.} + +{\selectlanguage{spanish} +El principal escenario de aplicación que considero son los sistemas integrados con bajo rendimiento. La memoria de estos +sistemas puede ser muy pequeña, por lo que es muy difícil ejecutar un lenguaje de script con todas las funciones. Esto +significa que es posible que tengamos que hacer una elección. Es posible que Berry solo proporcione las funciones +principales básicas y más utilizadas, mientras que otras características innecesarias solo se usan como módulos +opcionales. Esto conducirá inevitablemente a que la biblioteca estándar del idioma sea demasiado pequeña, incluso el +lenguaje. También habrá diseños inciertos (como la implementación de números de punto flotante y enteros, etc.). Los +beneficios de estas compensaciones son más espacio para la optimización, mientras que la desventaja es obviamente la +inconsistencia de los estándares del idioma. El intérprete de Berry se refiere a la implementación del intérprete de +Lua, que se divide principalmente en dos partes: compilador y máquina virtual. El compilador de Berry es un compilador +de un solo paso para generar bytecode. Esta solución no genera un árbol de sintaxis abstracto, por lo que ahorra +memoria. La máquina virtual es de tipo registro. En términos generales, la máquina virtual de tipo registro es más +eficiente que la máquina virtual de tipo pila. Además de implementar funciones de lenguaje, también esperamos optimizar +el uso de la memoria y la eficiencia operativa del intérprete. En la actualidad, los indicadores de rendimiento del +intérprete de Berry no son comparables con los de los lenguajes principales, pero la huella de memoria es muy pequeña.} + +{\selectlanguage{spanish} +No fue hasta más tarde que me enteré del proyecto MicroPython: un intérprete de Python simplificado diseñado para +microcontroladores. Hoy en día, Python está muy de moda, y este intérprete de Python diseñado para microcontroladores +también es muy popular. En comparación con la tecnología madura actual, Berry es un lenguaje nuevo sin una base de +usuarios suficiente. Su ventaja es que es fácil de dominar la gramática y puede tener ventajas en términos de consumo +de recursos y rendimiento.} + +{\selectlanguage{spanish} +Si necesita migrar el intérprete de Berry, debe asegurarse de que el compilador que usa brinde soporte para el estándar +C99 (anteriormente cumplia completamente con C89, y algunos trabajos de optimización más tarde me hicieron renunciar a +esta decisión). En la actualidad, la mayoría de los compiladores brindan soporte para C99, y los compiladores comunes +como ARMCC (KEIL MDK), ICC (IAR) y GCC en el desarrollo de procesadores ARM también admiten C99. Este documento +presenta las reglas gramaticales de Berry, la biblioteca estándar y otras instalaciones, y finalmente guía a los +lectores para trasplantar y ampliar Berry. Este documento no explica el mecanismo de implementación del intérprete, y +puede ser explicado en otros documentos, si tenemos tiempo.} + +{\selectlanguage{spanish} +El nivel del autor es limitado y la escritura apresurada. Si hay omisiones o errores en el artículo, espero que los +lectores no duden en corregirlos.} + +{\selectlanguage{spanish} +Guan Wenliang} + +{\selectlanguage{spanish} +abril 2019} + +\setcounter{tocdepth}{10} +\renewcommand\contentsname{Sumario} +\tableofcontents + +\bigskip + +\clearpage\section[Capítulo 1: Información básica]{Capítulo 1: \foreignlanguage{spanish}{Información básica}} +\hypertarget{RefHeadingToc354613639824055}{} +\bigskip + +\subsection[1.1 Introducción]{\selectlanguage{spanish} 1.1 Introducción} +\hypertarget{RefHeadingToc354633639824055}{}{\selectlanguage{spanish} +Berry es un lenguaje de script integrado de tipo dinámico ultraligero. El lenguaje admite principalmente programación +procedural, así como programación orientada a objetos y programación funcional. Un objetivo de diseño importante de +Berry es poder ejecutarse en dispositivos integrados con muy poca memoria, por lo que el lenguaje está muy optimizado. +Sin embargo, Berry sigue siendo un lenguaje de secuencias de comandos rico en funciones.} + +\subsection[1.2 Empezar a usar]{\selectlanguage{spanish} 1.2 Empezar a usar} +\hypertarget{RefHeadingToc354653639824055}{}\subsubsection[1.2.1 Obtener el intérprete]{\selectlanguage{spanish} 1.2.1 +Obtener el intérprete} +\hypertarget{RefHeadingToc354673639824055}{}\foreignlanguage{spanish}{Los lectores pueden ir a la página de GitHub del +proyecto: +}\textstyleDefinition{\foreignlanguage{spanish}{https://github.com/berry-lang/berry}}\foreignlanguage{spanish}{ para +obtener el código fuente del intérprete de Berry. Los lectores necesitan compilar el intérprete de Berry por sí mismos. +El método de compilación específico se puede encontrar en el documento README.md en el directorio raíz del código +fuente, que también se puede ver en la página de GitHub del proyecto.} + +\foreignlanguage{spanish}{Primero, debe instalar un software como GCC, git y make. Si no usa el control de versiones, +puede descargar el código fuente directamente en GitHub sin instalar git. Los lectores pueden usar motores de búsqueda +para recuperar información sobre este software. Los lectores que utilizan sistemas Linux y macOS también deben instalar +la biblioteca GNU Readline[1]. Use el comando +}\textstyleSourceText{\foreignlanguage{spanish}{git}}\foreignlanguage{spanish}{ [2] Clone el código fuente del +intérprete del almacén remoto al local:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +git clone https://github.com/berry-lang/berry} + + +\bigskip + +\foreignlanguage{spanish}{Ingrese al directorio berry y use el comando +}\textstyleSourceText{\foreignlanguage{spanish}{make}}\foreignlanguage{spanish}{ para compilar el intérprete:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +cd berry} + +{\selectlanguage{spanish}\ttfamily +make} + + +\bigskip + +\foreignlanguage{spanish}{Ahora debería poder encontrar el archivo ejecutable del intérprete en el directorio +}\foreignlanguage{spanish}{\textit{berry}}\foreignlanguage{spanish}{ (en los sistemas Windows, el nombre del archivo +del programa intérprete es ``}\foreignlanguage{spanish}{\textit{berry.exe}}\foreignlanguage{spanish}{{}'', mientras que +en los sistemas Linux y macOS el nombre del archivo es +``}\foreignlanguage{spanish}{\textit{berry}}\foreignlanguage{spanish}{{}''), puede ejecutar el archivo ejecutable +directamente. Para iniciar el intérprete: En Linux o macOS, puede usar el comando +}\textstyleSourceText{\foreignlanguage{spanish}{sudo make install}}\foreignlanguage{spanish}{ para instalar el +intérprete, y luego puede iniciar el intérprete con el comando +}\textstyleSourceText{\foreignlanguage{spanish}{berry}}\foreignlanguage{spanish}{ en la terminal.} + +\subsubsection[1.2.2 Entorno REPL]{\selectlanguage{spanish} 1.2.2 Entorno REPL} +\hypertarget{RefHeadingToc354693639824055}{}{\selectlanguage{spanish} +REPL (Leer Evaluar Imprimir Bucle) generalmente se traduce como un intérprete interactivo, y este elemnto también se ha +convertido en el modo interactivo del intérprete. Este modo consta de cuatro elementos: \textbf{Leer}, lee el código +fuente ingresado por el usuario desde el dispositivo de entrada; \textbf{Evaluar}, compila y ejecuta el código fuente +ingresado por el usuario; \textbf{Imprimir}, muestra el resultado del proceso de evaluación; \textbf{Bucle}, realiza un +ciclo de las operaciones anteriores.} + +\foreignlanguage{spanish}{Inicie el intérprete directamente (ingrese +}\textstyleSourceText{\foreignlanguage{spanish}{berry}}\foreignlanguage{spanish}{ en la terminal o en la ventana de +comandos sin parámetros, o haga doble clic en berry.exe en Windows) para ingresar al modo REPL y verá la siguiente +interfaz:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +Berry 1.0.0 (build in Feb 1 2022, 13:14:04)} + +{\selectlanguage{spanish}\ttfamily +[GCC 8.1.0] on Windows (default)} + +{\selectlanguage{spanish}\ttfamily +{\textgreater}} + + +\bigskip + +\foreignlanguage{spanish}{Las dos primeras líneas de la interfaz muestran la versión, el tiempo de compilación, el +compilador y el sistema operativo del intérprete de Berry. El símbolo +``}\textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}}}\foreignlanguage{spanish}{{}'' en la tercera línea se +llama indicador y el cursor se muestra detrás del indicador. Al usar el modo REPL, después de ingresar el código +fuente, al presionar la tecla {\textquotedbl}Enter{\textquotedbl} se ejecutará inmediatamente el código y se generará +el resultado. Presione la combinación de teclas }\textstyleSourceText{\foreignlanguage{spanish}{Ctrl + +C}}\foreignlanguage{spanish}{ para salir de REPL. En el caso de usar la biblioteca Readline, use la combinación de +teclas }\textstyleSourceText{\foreignlanguage{spanish}{Ctrl + D}}\foreignlanguage{spanish}{ para salir de REPL cuando +la entrada esté vacía. Dado que no hay necesidad de editar archivos de secuencias de comandos, el modo REPL se puede +utilizar para un desarrollo rápido o verificación de ideas.} + +\paragraph[Programa Hola Mundo]{\selectlanguage{spanish} Programa Hola Mundo} +\hypertarget{RefHeadingToc354713639824055}{}\foreignlanguage{spanish}{Tomemos como ejemplo el clásico programa ``Hola +Mundo''. Introduzca }\textstyleSourceText{\foreignlanguage{spanish}{print('Hola Mundo')}}\foreignlanguage{spanish}{ en +el REPL y ejecútelo. Los resultados son los siguientes:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +Berry 1.0.0 (build in Feb 1 2022, 13:14:04)} + +{\selectlanguage{spanish}\ttfamily +[GCC 8.1.0] on Windows (default)} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} print('Hola Mundo')} + +{\selectlanguage{spanish}\ttfamily +Hola Mundo} + +{\selectlanguage{spanish}\ttfamily +{\textgreater}} + + +\bigskip + +\foreignlanguage{spanish}{El intérprete emite el texto ``}\textstyleSourceText{\foreignlanguage{spanish}{Hola +Mundo}}\foreignlanguage{spanish}{{}''. Esta línea de código realiza la salida de la cadena +}\textstyleSourceText{\foreignlanguage{spanish}{{}'Hola Mundo'}}\foreignlanguage{spanish}{ llamando a la función +}\textstyleSourceText{\foreignlanguage{spanish}{print}}\foreignlanguage{spanish}{. En REPL, si el valor de retorno de +la expresión no es }\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{, se mostrará el +valor de retorno. Por ejemplo, ingresar la expresión }\textstyleSourceText{\foreignlanguage{spanish}{1 + +2}}\foreignlanguage{spanish}{ mostrará el resultado del cálculo +}\textstyleSourceText{\foreignlanguage{spanish}{3}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} 1 + 2} + +{\selectlanguage{spanish}\ttfamily +3} + + +\bigskip + +\foreignlanguage{spanish}{Por lo tanto, el programa ``Hola Mundo'' más simple bajo REPL es ingresar directamente la +cadena }\textstyleSourceText{\foreignlanguage{spanish}{{}'Hola Mundo'}}\foreignlanguage{spanish}{ y ejecutar:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} 'Hola Mundo'} + +{\selectlanguage{spanish}\ttfamily +Hola Mundo} + +\paragraph[Más uso de REPL]{\selectlanguage{spanish} Más uso de REPL} +\hypertarget{RefHeadingToc354733639824055}{}\foreignlanguage{spanish}{También puede utilizar el modo interactivo del +intérprete de Berry como calculadora científica. Sin embargo, algunas funciones matemáticas no se pueden utilizar +directamente. }\foreignlanguage{spanish}{En su lugar, use la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{import math}}\foreignlanguage{spanish}{ para importar la biblioteca +matemática y luego use las funciones en la biblioteca. Utilice +``}\textstyleSourceText{\foreignlanguage{spanish}{math.}}\foreignlanguage{spanish}{{}'' como prefijo, por ejemplo, la +función }\textstyleSourceText{\foreignlanguage{spanish}{sin}}\foreignlanguage{spanish}{ debe escribirse como +}\textstyleSourceText{\foreignlanguage{spanish}{math.sin}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} import math} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} math.pi} + +{\selectlanguage{spanish}\ttfamily +3.14159} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} math.sin(math.pi / 2)} + +{\selectlanguage{spanish}\ttfamily +1} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} math.sqrt(2)} + +{\selectlanguage{spanish}\ttfamily +1.41421} + +\subsubsection[1.2.3 Archivo de comandos]{\selectlanguage{spanish} 1.2.3 Archivo de comandos} +\hypertarget{RefHeadingToc354753639824055}{}{\selectlanguage{spanish} +El archivo de secuencia de comandos de Berry es un archivo que almacena el código de Berry, y un intérprete puede +ejecutar el archivo de script. Normalmente, el archivo de script es un archivo de texto con la extensión +{\textquotedbl}.be{\textquotedbl}. El comando para ejecutar el script usando el intérprete es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +berry script\_file} + + +\bigskip + +\textstyleSourceText{\foreignlanguage{spanish}{script\_file}}\foreignlanguage{spanish}{ es el nombre de archivo del +archivo de script. El uso de este comando ejecutará el intérprete para ejecutar el código Berry en el archivo de script +}\textstyleSourceText{\foreignlanguage{spanish}{script\_file}}\foreignlanguage{spanish}{ y el intérprete se cerrará +después de la ejecución.} + +\foreignlanguage{spanish}{Si desea que el intérprete ingrese al modo REPL después de ejecutar el archivo de script, +puede agregar el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{{}-i}}\foreignlanguage{spanish}{ al comando +para llamar al intérprete:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +berry script\_file} + + +\bigskip + +\foreignlanguage{spanish}{Este comando primero ejecutará el código en el archivo +}\textstyleSourceText{\foreignlanguage{spanish}{script\_file}}\foreignlanguage{spanish}{ y luego ingresará al modo +REPL.} + +\subsection[1.3 Palabras (Words)]{\selectlanguage{spanish} 1.3 Palabras (Words)} +\hypertarget{RefHeadingToc354773639824055}{}{\selectlanguage{spanish} +Antes de presentar la sintaxis de Berry, echemos un vistazo a un código simple (puede ejecutar este código en modo +REPL):} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func(x) \# una función ejemplo} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return x + 1.5} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +print('func(10) =', func(10))} + + +\bigskip + +\foreignlanguage{spanish}{Este código define una función +}\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{ y la llama más tarde. Antes de +entender cómo funciona este código, primero presentaremos los elementos de sintaxis del lenguaje Berry.} + +\foreignlanguage{spanish}{En el código anterior, la clasificación específica de los elementos gramaticales es: +}\textstyleSourceText{\foreignlanguage{spanish}{def}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{. Estas son palabras clave del lenguaje +Berry; y ``}\textstyleSourceText{\foreignlanguage{spanish}{\# una función ejemplo}}\foreignlanguage{spanish}{{}'' en la +primera línea se llama comentario; }\textstyleSourceText{\foreignlanguage{spanish}{print}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{x}}\foreignlanguage{spanish}{ son algunos identificadores, generalmente +se usan para representar una variable; }\textstyleSourceText{\foreignlanguage{spanish}{1.5}}\foreignlanguage{spanish}{ +y }\textstyleSourceText{\foreignlanguage{spanish}{10}}\foreignlanguage{spanish}{ estos números se llaman +}\foreignlanguage{spanish}{literales numéricos, son equivalentes a los números usados en la vida diaria; +}\textstyleSourceText{\foreignlanguage{spanish}{{}'func(10) ='}}\foreignlanguage{spanish}{ Es un literal de cadena, se +usan en lugares donde necesitas representar texto; +}\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{ es un operador de suma, aquí el operador +de suma se puede usar para sumar la variable +}\textstyleSourceText{\foreignlanguage{spanish}{x}}\foreignlanguage{spanish}{ y el valor +}\textstyleSourceText{\foreignlanguage{spanish}{1.5}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +La clasificación anterior se realiza en realidad desde la perspectiva de un analizador lexicográfico. El análisis +lexicográfico es el primer paso en el análisis del código fuente de Berry. Para escribir el código fuente correcto, +comenzamos con la introducción lexicográfica más básica.} + +\subsubsection[1.3.1 Comentario]{\selectlanguage{spanish} 1.3.1 Comentario} +\hypertarget{RefHeadingToc354793639824055}{}\foreignlanguage{spanish}{Los comentarios son textos que no genera ningún +código. Se utilizan para hacer comentarios en el código fuente y ser leídos por personas, mientras que el compilador no +interpretará su contenido. Berry admite comentarios de una sola línea y comentarios de bloque de líneas cruzadas. Los +comentarios de una sola línea comienzan con el carácter +``}\textstyleSourceText{\foreignlanguage{spanish}{\#}}\foreignlanguage{spanish}{{}' hasta el final del carácter de +nueva línea. La nota rápida comienza con el texto +``}\textstyleSourceText{\foreignlanguage{spanish}{\#-}}\foreignlanguage{spanish}{{}'' y termina con el texto +``}\textstyleSourceText{\foreignlanguage{spanish}{{}-\#}}\foreignlanguage{spanish}{{}''. El siguiente es un ejemplo del +uso de anotaciones:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# \ Este es un comentario de línea} + +{\selectlanguage{spanish}\ttfamily +\#- Este es un} + +{\selectlanguage{spanish}\ttfamily +\ \ \ bloque de comentario} + +{\selectlanguage{spanish}\ttfamily +{}-\#} + + +\bigskip + +\foreignlanguage{spanish}{Similar al lenguaje C, los comentarios rápidos no admiten el anidamiento. El siguiente código +terminará el análisis de los comentarios en el primer texto +``}\textstyleSourceText{\foreignlanguage{spanish}{{}-\#}}\foreignlanguage{spanish}{{}'':} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#- - Algunos comentarios -\# ... -\#} + +\subsubsection[1.3.2 Valor literal]{\selectlanguage{spanish} 1.3.2 Valor literal} +\hypertarget{RefHeadingToc354813639824055}{}\foreignlanguage{spanish}{El valor literal es un valor fijo escrito +directamente en el código fuente durante la programación. Los literales de Berry son números enteros, números reales, +booleanos, cadenas y nil. Por ejemplo, el valor +}\textstyleSourceText{\foreignlanguage{spanish}{34}}\foreignlanguage{spanish}{ es una denominación entera.} + +\paragraph[Valor literal numérico]{\selectlanguage{spanish} Valor literal numérico} +\hypertarget{RefHeadingToc354833639824055}{}{\selectlanguage{spanish} +Los literales numéricos incluyen literales \textbf{Integer} (entero) y literales \textbf{Número real} (real).} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +40 \# \ Literal entero} + +{\selectlanguage{spanish}\ttfamily +0x80 \# Literal hexadecimal (entero)} + +{\selectlanguage{spanish}\ttfamily +3.14 \# \ Literal real} + +{\selectlanguage{spanish}\ttfamily +1.1e-6 \# \ Literal real} + + +\bigskip + +\foreignlanguage{spanish}{Los literales numéricos se escriben de manera similar a la escritura cotidiana. Berry admite +denominaciones enteras hexadecimales. Los literales hexadecimales comienzan con el prefijo +}\textstyleSourceText{\foreignlanguage{spanish}{0x}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{0X}}\foreignlanguage{spanish}{, seguido de un número hexadecimal.} + +\paragraph[Valor literal booleano]{\selectlanguage{spanish} Valor literal booleano} +\hypertarget{RefHeadingToc354853639824055}{}\foreignlanguage{spanish}{Los valores booleanos (booleanos) se utilizan para +representar verdadero y falso en el estado }\foreignlanguage{spanish}{lógico. Puede utilizar las palabras clave +}\textstyleSourceText{\foreignlanguage{spanish}{true}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{false}}\foreignlanguage{spanish}{ para representar literales +booleanos.} + +\paragraph[Literal de cadena]{\selectlanguage{spanish} Literal de cadena} +\hypertarget{RefHeadingToc354873639824055}{}\foreignlanguage{spanish}{Una cadena es un fragmento de texto, y su +escritura literal consiste en usar un par de +}\textstyleSourceText{\foreignlanguage{spanish}{{}'}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}}}\foreignlanguage{spanish}{ para rodear el texto de la +cadena:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{}'esto es una cadena'} + +{\selectlanguage{spanish}\ttfamily +{\textquotedbl}esto es una cadena{\textquotedbl}} + + +\bigskip + +\foreignlanguage{spanish}{Los literales de cadena proporcionan algunas secuencias de escape para representar caracteres +que no se pueden ingresar directamente. La secuencia de escape comienza con el carácter +}\textstyleSourceText{\foreignlanguage{spanish}{{}'{\textbackslash}'}}\foreignlanguage{spanish}{ y luego sigue una +secuencia específica de caracteres para lograr el escape. Las secuencias de escape especificadas por Berry son:} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Caracter de Escape} & +{\selectlanguage{spanish}\bfseries significado} & +\centering{\selectlanguage{spanish}\bfseries Caracter de Escape} & +{\selectlanguage{spanish}\bfseries significado}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Caracter de Escape} & +{\selectlanguage{spanish}\bfseries significado} & +\centering{\selectlanguage{spanish}\bfseries Caracter de Escape} & +{\selectlanguage{spanish}\bfseries significado}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{3.779cm}m{3.779cm}m{3.779cm}m{3.781cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}a}} & +{\selectlanguage{spanish} Suena la campana} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}b}} & +{\selectlanguage{spanish} Retroceso}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}f}} & +{\selectlanguage{spanish} Alimentación de formulario.} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}n}} & +{\selectlanguage{spanish} Nueva línea}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}r}} & +{\selectlanguage{spanish} Retorno de carro} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}t}} & +{\selectlanguage{spanish} Tabulación Horizontal}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}v}} & +{\selectlanguage{spanish} Tabulación Vertical} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}{\textbackslash}}} & +{\selectlanguage{spanish} Barra invertida}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}'}} & +{\selectlanguage{spanish} Apóstrofe} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}{\textquotedbl}}} & +{\selectlanguage{spanish} Comillas dobles}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}?}} & +{\selectlanguage{spanish} Signo de interrogación} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}0}} & +{\selectlanguage{spanish} Caracter Null}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 1: Secuencia de Caracter de Escape} + + +\bigskip + +{\selectlanguage{spanish} +Las secuencias de escape se pueden usar en cadenas, por ejemplo} + +{\selectlanguage{spanish}\ttfamily +print('caracter de escape LF{\textbackslash}n{\textbackslash}tnueva línea')} + +{\selectlanguage{spanish} +El resultado de la operación es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +caracter de escape LF} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ nueva línea} + + +\bigskip + +\foreignlanguage{spanish}{También puede usar secuencias de escape generalizadas, en forma de +}\textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}x}}\foreignlanguage{spanish}{ seguido de 2 dígitos +hexadecimales, o }\textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}}}\foreignlanguage{spanish}{ 3 dígitos +octales, usando esta secuencia de escape puede representar cualquier carácter. Estos son algunos ejemplos del uso del +conjunto de caracteres ASCII:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{}'{\textbackslash}115' \#-'M' -\#'{\textbackslash}x34' \#- '4' -\#'{\textbackslash}064' \#- '4' -\#} + +\paragraph[Valor literal nulo]{\selectlanguage{spanish} Valor literal nulo} +\hypertarget{RefHeadingToc354893639824055}{}\foreignlanguage{spanish}{Nil representa un valor nulo, y su valor literal +está representado por la palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + +\subsubsection[1.3.3 Identificador]{\selectlanguage{spanish} 1.3.3 Identificador} +\hypertarget{RefHeadingToc354913639824055}{}\foreignlanguage{spanish}{El identificador es un nombre definido por el +usuario, que comienza con un guión bajo o una letra, y luego consiste en una combinación de varios guiones bajos, +letras o números. Al igual }\foreignlanguage{spanish}{que la mayoría de los lenguajes, Berry distingue entre mayúsculas +y minúsculas, por lo que los identificadores +}\textstyleSourceText{\foreignlanguage{spanish}{A}}\foreignlanguage{spanish}{ y los identificadores +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ se resolverán en dos identificadores +diferentes.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +a} + +{\selectlanguage{spanish}\ttfamily +TestVariable} + +{\selectlanguage{spanish}\ttfamily +Test\_Var} + +{\selectlanguage{spanish}\ttfamily +\_init} + +{\selectlanguage{spanish}\ttfamily +baseCass} + +{\selectlanguage{spanish}\ttfamily +\_} + +\subsubsection[1.3.4 Palabras clave]{\selectlanguage{spanish} 1.3.4 Palabras clave} +\hypertarget{RefHeadingToc354933639824055}{}{\selectlanguage{spanish} +Berry reserva los siguientes tokens como palabras clave del lenguaje:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +if elif else while for def} + +{\selectlanguage{spanish}\ttfamily +end class break continue return true} + +{\selectlanguage{spanish}\ttfamily +false nil var do import as static} + + +\bigskip + +\foreignlanguage{spanish}{El uso específico de palabras clave se presentará en los capítulos correspondientes. Tenga en +cuenta que las palabras clave no se pueden utilizar como identificadores. Debido a que Berry distingue entre mayúsculas +y minúsculas, }\textstyleSourceText{\foreignlanguage{spanish}{If}}\foreignlanguage{spanish}{ puede usarse para +identificadores.} + +\foreignlanguage{spanish}{[1] Para GNU Readline, el comando de instalación para la serie Debian de distribuciones de +Linux es }\textstyleSourceText{\foreignlanguage{spanish}{sudo apt install libreadline-dev}}\foreignlanguage{spanish}{, +y el comando de instalación para la serie RedHat de distribuciones de Linux es +}\textstyleSourceText{\foreignlanguage{spanish}{yum install readline-devel}}\foreignlanguage{spanish}{, bajo macOS el +comando de instalación es }\textstyleSourceText{\foreignlanguage{spanish}{brew install +readline}}\foreignlanguage{spanish}{. Además, es fácil encontrar documentación de GNU Readline y materiales +relacionados en los motores de búsqueda.} + +{\selectlanguage{spanish} +[2] Los comandos deben usarse en la {\textquotedbl}interfaz de línea de comandos{\textquotedbl} después de completar el +trabajo de preparación. El entorno de la línea de comandos en los sistemas Windows suele ser una ventana del símbolo +del sistema (CMD), mientras que el entorno de la línea de comandos en los sistemas similares a Unix suele llamarse +{\textquotedbl}Terminal{\textquotedbl}. Esto no es muy preciso, pero no se ampliará aquí.} + +{\selectlanguage{spanish} +[3] En Windows, puede hacer doble clic directamente para ejecutar el archivo ejecutable. En Linux o macOS, use la +terminal para ejecutarlo. También puede ejecutar el intérprete en la ventana del símbolo del sistema de Windows. +Consulte el archivo README.md para un uso específico.} + +\clearpage\section{Capítulo 2: Tipos y Variables} +\hypertarget{RefHeadingToc354953639824055}{} +\bigskip + +{\selectlanguage{spanish} +El \textbf{Tipo} es un atributo de datos, que define el significado de los datos y las operaciones que se pueden +realizar en los datos. Los tipos se pueden dividir en tipos integrados y tipos definidos por el usuario. Los tipos +integrados se refieren a algunos tipos básicos integrados en el lenguaje Berry, entre los cuales los tipos que no se +basan en definiciones de clase se denominan \textbf{Tipo simple}. Los tipos basados en definiciones de clase se +denominan \textbf{Tipo de clase}, algunos de los tipos integrados son tipos de clase y los tipos definidos por el +usuario también son tipos de clase.} + +\subsection[2.1 Tipo incorporado]{\selectlanguage{spanish} 2.1 Tipo incorporado} +\hypertarget{RefHeadingToc354973639824055}{}\subsubsection[2.1.1 Tipo simple]{\selectlanguage{spanish} 2.1.1 Tipo +simple} +\hypertarget{RefHeadingToc354993639824055}{}\paragraph[nil]{\textstyleSourceText{\foreignlanguage{spanish}{nil}}} +\hypertarget{RefHeadingToc355013639824055}{}\foreignlanguage{spanish}{El tipo Nil es el tipo nulo, lo que significa que +el objeto tiene un valor no válido, o se puede decir que el objeto no tiene un valor significativo. Este es un tipo muy +especial. Aunque podríamos decir que una variable es +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{, de hecho el tipo nil no tiene valor, +entonces de lo que estamos hablando aquí es que el tipo de la variable es nil (no un valor).} + +\foreignlanguage{spanish}{El valor predeterminado de una variable antes de la asignación es +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{. Este tipo se puede utilizar en +operaciones lógicas. En este caso 'nil' es equivalente a 'falso'.} + +\paragraph[Tipo entero]{\selectlanguage{spanish} Tipo entero} +\hypertarget{RefHeadingToc355033639824055}{}{\selectlanguage{spanish} +El tipo entero (integer) representa un entero con signo, denominado entero. El número de bits del entero representado +por este tipo depende de la implementación específica y, por lo general, consta de un entero de 32 bits con signo en +una plataforma de 32 bits. Integer es un tipo aritmético y admite todas las operaciones aritméticas. Preste atención al +rango de valores de los enteros cuando use este tipo. El rango de valores típico de los enteros con signo de 32 bits +está entre $-$2147483648 y 2147483647.} + +\foreignlanguage{spanish}{Cualquier valor se puede convertir a +}\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{ usando la función +}\textstyleSourceText{\foreignlanguage{spanish}{int()}}\foreignlanguage{spanish}{; sin embargo +}\textstyleSourceText{\foreignlanguage{spanish}{int(nil) == nil}}\foreignlanguage{spanish}{. Si el argumento es una +instancia, y si contiene un miembro +}\textstyleSourceText{\foreignlanguage{spanish}{toint()}}\foreignlanguage{spanish}{, se nos llamará y el valor devuelto +se convertirá en }\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{.} + +\paragraph[Tipo de número real]{\selectlanguage{spanish} Tipo de número real} +\hypertarget{RefHeadingToc355053639824055}{}\foreignlanguage{spanish}{El tipo real (real), para ser precisos, es un tipo +de coma flotante. Los tipos de números reales generalmente se implementan como números de punto flotante de precisión +simple o números de punto flotante de precisión doble. El tipo de número real también es un tipo aritmético. En +comparación con el tipo de número entero, el tipo de número real tiene mayor precisión y un mayor rango de valores, por +lo que este tipo es más adecuado para cálculos matemáticos. Cabe señalar que el tipo de número real es en realidad un +número de coma flotante, por lo que aun existen problemas de precisión. Por ejemplo, no se recomienda comparar dos +valores de tipo }\textstyleSourceText{\foreignlanguage{spanish}{real}}\foreignlanguage{spanish}{ para la igualdad.} + +{\selectlanguage{spanish} +Cuando los enteros y los números reales participan en operaciones al mismo tiempo, los enteros generalmente se +convierten en números reales.} + +\paragraph[Tipo booleano]{\selectlanguage{spanish} Tipo booleano} +\hypertarget{RefHeadingToc355073639824055}{}\foreignlanguage{spanish}{El tipo booleano (boolean) se utiliza para +operaciones lógicas. Tiene dos valores }\textstyleSourceText{\foreignlanguage{spanish}{true}}\foreignlanguage{spanish}{ +y }\textstyleSourceText{\foreignlanguage{spanish}{false}}\foreignlanguage{spanish}{, que representan los dos valores +verdaderos (verdadero y falso) en lógica y álgebra booleana. El tipo booleano se utiliza principalmente para el juicio +condicional. Los operandos y los valores devueltos de las expresiones lógicas y las expresiones relacionales son todos +de tipo booleano, y las sentencias como }\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ +y }\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ utilizan tipos booleanos como +comprobaciones condicionales.} + +\foreignlanguage{spanish}{En muchos casos, los valores no booleanos también se pueden usar como tipos booleanos. Esto se +debe a que el intérprete convertirá implícitamente los parámetros. Esta es también la razón por la que las expresiones +de verificación condicional, como las declaraciones +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{, pueden usar cualquier tipo de +parámetros. Las reglas para convertir varios tipos a tipos booleanos son:} + +\liststyleLii +\begin{itemize} +\item \textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{: convertido a +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Entero}}\foreignlanguage{spanish}{: cuando el valor es +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{, de lo contrario, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Número real}}\foreignlanguage{spanish}{: cuando el valor es +}\textstyleSourceText{\foreignlanguage{spanish}{0.0}}\foreignlanguage{spanish}{, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{, de lo contrario, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Cadena}}\foreignlanguage{spanish}{: cuando el valor es +{\textquotedbl}{\textquotedbl} (cadena vacía) se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{ de lo contrario, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Comobj}}\foreignlanguage{spanish}{ y +}\foreignlanguage{spanish}{\textbf{Comptr}}\foreignlanguage{spanish}{: cuando el puntero interno es +}\textstyleSourceText{\foreignlanguage{spanish}{NULL}}\foreignlanguage{spanish}{ es convertido a +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{, de lo contrario se convierte a +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Instancia}}\foreignlanguage{spanish}{: si la instancia contiene un método +}\textstyleSourceText{\foreignlanguage{spanish}{tobool()}}\foreignlanguage{spanish}{, se utilizará el valor de retorno +del método, de lo contrario, se convertirá en +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{Todos los demás tipos: converten a +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\end{itemize} +\foreignlanguage{spanish}{Cualquier valor se puede convertir a +}\textstyleSourceText{\foreignlanguage{spanish}{bool}}\foreignlanguage{spanish}{ usando la función +}\textstyleSourceText{\foreignlanguage{spanish}{bool()}}\foreignlanguage{spanish}{.} + +\paragraph[Cadena]{\selectlanguage{spanish} Cadena} +\hypertarget{RefHeadingToc355093639824055}{}{\selectlanguage{spanish} +Una cadena es una secuencia de caracteres. En términos de almacenamiento, Berry divide las cadenas en cadenas largas y +cadenas cortas. Solo hay una instancia de la misma cadena de caracteres cortos en la memoria, y todas las cadenas de +caracteres cortos están vinculadas en una tabla hash. Este diseño ayuda a mejorar el rendimiento de la comparación de +igualdad de cadenas y puede reducir el uso de memoria. Dado que la frecuencia de uso de cadenas largas es baja y la +sobrecarga de la operación hash es bastante alta, no están vinculadas a la tabla hash, por lo que puede haber varias +instancias idénticas en la memoria. La cadena es de solo lectura después de que se crea. Por lo tanto, +{\textquotedbl}modificar{\textquotedbl} la cadena generará una nueva cadena y la cadena original no se modificará.} + +\foreignlanguage{spanish}{Berry no se preocupa por el formato o la codificación de los caracteres. Por ejemplo, la +cadena }\textstyleSourceText{\foreignlanguage{spanish}{{}'abc'}}\foreignlanguage{spanish}{ es en realidad el código +ASCII de los caracteres }\textstyleSourceText{\foreignlanguage{spanish}{{}'a'}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{{}'b'}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{{}'c'}}\foreignlanguage{spanish}{. Por lo tanto, si +}\foreignlanguage{spanish}{hay caracteres anchos en la cadena (la longitud de los caracteres es superior a 1 byte), el +número de caracteres de la cadena no se puede contar directamente. De hecho, usar la función +}\textstyleSourceText{\foreignlanguage{spanish}{size()}}\foreignlanguage{spanish}{ solo puede obtener el número de +bytes en la cadena. Además, para facilitar la interacción con el lenguaje C, la cadena de Berry siempre termina con los +caracteres }\textstyleSourceText{\foreignlanguage{spanish}{{}'{\textbackslash}0'}}\foreignlanguage{spanish}{. Esta +función es transparente para el programa Berry.} + +{\selectlanguage{spanish} +El tipo de cadena se puede comparar en tamaño, por lo que se puede usar en operaciones relacionales.} + +\paragraph[Función]{\selectlanguage{spanish} Función} +\hypertarget{RefHeadingToc355113639824055}{}{\selectlanguage{spanish} +Una función es una pieza de código que está encapsulada y disponible para llamadas, generalmente utilizada para +implementar una función específica. La función es en realidad una categoría grande, que incluye varios subtipos, como +cierres, funciones nativas y cierres nativos. Para el código Berry, todos los subtipos de funciones tienen el mismo +comportamiento. Las funciones pertenecen al primer tipo de valor en Berry, por lo que se pueden pasar como valores. +Además, se puede usar directamente en expresiones a través de la forma {\textquotedbl}literal{\textquotedbl} de +{\textquotedbl}funciones anónimas{\textquotedbl}.} + +{\selectlanguage{spanish} +Una función es un objeto de solo lectura y no se puede modificar una vez definida. Puede comparar si dos funciones son +iguales (si son la misma función), pero no se puede comparar el tipo de función. \textbf{Función nativa} y +\textbf{Cierre nativo} se refieren a funciones y cierres implementados en lenguaje C. Uno de los propósitos principales +de las funciones nativas y los cierres nativos es proporcionar funciones que el lenguaje Berry no proporciona, como +operaciones de E/S y operaciones de bajo nivel. Si un fragmento de código se usa con frecuencia y tiene requisitos de +rendimiento, se recomienda reescribirlo como una función nativa o un cierre nativo.} + +\paragraph[Clase]{\selectlanguage{spanish} Clase} +\hypertarget{RefHeadingToc355133639824055}{}\foreignlanguage{spanish}{En la programación orientada a objetos, una clase +es una plantilla de código de programa extensible. Las clases se utilizan para crear objetos de instancia, por lo que +se puede decir que la clase es el {\textquotedbl}tipo{\textquotedbl} de la instancia. Todos los objetos de instancia +son del tipo }\textstyleSourceText{\foreignlanguage{spanish}{instancia}}\foreignlanguage{spanish}{ y todos tienen una +clase correspondiente, que se llama instancia }\foreignlanguage{spanish}{\textbf{Tipo de +clase}}\foreignlanguage{spanish}{. En pocas palabras, una clase es un valor que representa el tipo de un objeto de +instancia y una clase es una abstracción de las características de una instancia. Una clase también es un objeto de +solo lectura, una vez definida, no se puede modificar.} + +{\selectlanguage{spanish} +Las clases solo pueden comparar iguales y desiguales, pero no pueden comparar tamaños.} + +\paragraph[Ejemplos]{\selectlanguage{spanish} Ejemplos} +\hypertarget{RefHeadingToc355153639824055}{}\foreignlanguage{spanish}{Una instancia es un objeto materializado generado +por una clase, y el proceso de generar una instancia a partir de una clase se llama +}\textstyleSourceText{\foreignlanguage{spanish}{Instanciación}}\foreignlanguage{spanish}{. En la programación orientada +a objetos, {\textquotedbl}instancia{\textquotedbl} suele ser sinónimo de {\textquotedbl}objeto{\textquotedbl}. Sin +embargo, para distinguir los objetos que no son de instancia, no usamos el término {\textquotedbl}objeto{\textquotedbl} +solo, sino que usamos {\textquotedbl}instancia{\textquotedbl} u {\textquotedbl}objeto de instancia{\textquotedbl}. Las +instancias de Berry siempre se asignan dinámicamente y deben usarse con un recolector de basura. Además de la +asignación de memoria, el proceso de creación de instancias también necesita inicializar la instancia, este proceso lo +completa el }\textstyleSourceText{\foreignlanguage{spanish}{Constructor}}\foreignlanguage{spanish}{. Además, puedes +completar la destrucción del objeto a través del +}\textstyleSourceText{\foreignlanguage{spanish}{Destructor}}\foreignlanguage{spanish}{ antes de recuperar la memoria +del objeto.} + +{\selectlanguage{spanish} +En la implementación interna, la instancia contendrá una referencia a la clase, y la instancia en sí misma solo almacena +variables miembro y no métodos.} + +\subsubsection[2.1.2 Tipo de clase]{\selectlanguage{spanish} 2.1.2 Tipo de clase} +\hypertarget{RefHeadingToc355173639824055}{}\foreignlanguage{spanish}{Algunos de los tipos incorporados son tipos de +clase, son }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{range}}\foreignlanguage{spanish}{. A diferencia de los tipos +personalizados, los tipos de clase integrados se pueden construir usando literales, por ejemplo, +}\textstyleSourceText{\foreignlanguage{spanish}{[1, 2, 3]}}\foreignlanguage{spanish}{ es un literal de tipo +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{.} + +\paragraph[Lista]{\selectlanguage{spanish} Lista} +\hypertarget{RefHeadingToc355193639824055}{}{\selectlanguage{spanish} +La clase List es un contenedor que proporciona soporte para tipos de datos de lista. La lista de Berry es una colección +ordenada de elementos, y cada elemento de la lista tiene un índice entero único, y se puede acceder a cada elemento +directamente según el índice. List admite la inserción o eliminación de elementos en cualquier posición, y el elemento +puede ser de cualquier tipo. Además de usar índices, también puede usar iteradores para acceder a los elementos de la +lista.} + +{\selectlanguage{spanish} +La implementación de List es una matriz dinámica y esta estructura de datos tiene un buen rendimiento de acceso +aleatorio. La eficiencia de agregar y eliminar elementos al final de la lista es muy alta, pero la eficiencia de +agregar y eliminar elementos en el medio de la lista es baja.} + +{\selectlanguage{spanish} +El método de inicialización literal del contenedor List es usar una lista de objetos entre corchetes y múltiples objetos +separados por comas, por ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +[]} + +{\selectlanguage{spanish}\ttfamily +['string']} + +{\selectlanguage{spanish}\ttfamily +[0, 1, 2,'list']} + +{\selectlanguage{spanish} +Operaciones: ver capítulo 7.} + +\paragraph[Mapa]{\selectlanguage{spanish} Mapa} +\hypertarget{RefHeadingToc355213639824055}{}{\selectlanguage{spanish} +El mapa también es un tipo de contenedor, el mapa es una colección de pares clave-valor, y cada clave posible aparece +como máximo una vez en la colección. El contenedor Mapa proporciona las siguientes operaciones básicas:} + +\liststyleLiii +\begin{itemize} +\item {\selectlanguage{spanish} +Agregar pares clave-valor a la colección} +\item {\selectlanguage{spanish} +Eliminar pares clave-valor de la colección} +\item {\selectlanguage{spanish} +Modificar el valor correspondiente a una clave existente} +\item {\selectlanguage{spanish} +Encuentra el valor correspondiente por clave} +\end{itemize} +{\selectlanguage{spanish} +El mapa se implementa utilizando una tabla hash y tiene una alta eficiencia de búsqueda. La operación de agregar y +eliminar pares clave-valor consumirá más tiempo si se produce un {\textquotedbl}rehashing{\textquotedbl}.} + +{\selectlanguage{spanish} +El contenedor Map también se puede inicializar con valores literales, escritos entre llaves para encerrar una lista de +pares clave-valor, separados por dos puntos entre claves y valores, y separados por comas entre pares clave-valor. +P.ej:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\{\}} + +{\selectlanguage{spanish}\ttfamily +\{'str':'hola'\}} + +{\selectlanguage{spanish}\ttfamily +\{'str':'hola','int': 45, 78: nil\}} + + +\bigskip + +{\selectlanguage{spanish} +Operaciones: ver capítulo 7.} + +\paragraph[Rango]{\selectlanguage{spanish} Rango} +\hypertarget{RefHeadingToc355233639824055}{}\foreignlanguage{spanish}{El contenedor Range representa un rango de +enteros, que generalmente se usa para iterar en un rango de enteros. Este tipo tiene un miembro +}\textstyleSourceText{\foreignlanguage{spanish}{\_\_lower\_\_}}\foreignlanguage{spanish}{ y un miembro +}\textstyleSourceText{\foreignlanguage{spanish}{\_\_upper\_\_}}\foreignlanguage{spanish}{, que representan los límites +inferior y superior del rango, respectivamente. El valor literal de Range es un par de enteros conectados mediante el +operador }\textstyleSourceText{\foreignlanguage{spanish}{..}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +0 .. 10} + +{\selectlanguage{spanish}\ttfamily +{}-5 .. 5} + + +\bigskip + +\foreignlanguage{spanish}{Cuando la clase Range se usa para la iteración, los elementos de la iteración son todos +valores enteros desde el límite inferior hasta el límite superior, incluidos los valores límite. Por ejemplo, el +resultado de la iteración de }\textstyleSourceText{\foreignlanguage{spanish}{0..5}}\foreignlanguage{spanish}{ es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +0 1 2 3 4 5} + + +\bigskip + +{\selectlanguage{spanish} +Por tanto, cabe señalar que para un rango de \textit{x} .. (\textit{x}+\textit{n}), el número de iteraciones es +\textit{n} + 1. Una construcción común para iterar a través de los elementos de una lista por elemento es:} + +{\selectlanguage{spanish}\ttfamily +for i: 0..size(l)-1} + +{\selectlanguage{spanish} +Rango abierto: si omite el último rango, se reemplaza implícitamente con MAXINT.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} r = 10..} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} r} + +{\selectlanguage{spanish}\ttfamily +(10..9223372036854775807)} + +\paragraph[Bytes]{\selectlanguage{spanish} Bytes} +\hypertarget{RefHeadingToc355253639824055}{}{\selectlanguage{spanish} +El objeto Bytes denota un búfer de bytes que se puede usar para manipular búferes de bytes o para leer/escribir algunas +áreas o estructuras de memoria C.} + +{\selectlanguage{spanish} +Consulte el Capítulo 7.} + +\subsection[2.2 Variables]{\selectlanguage{spanish} 2.2 Variables} +\hypertarget{RefHeadingToc355273639824055}{}{\selectlanguage{spanish} +Una variable es un espacio de almacenamiento con un nombre, y los datos o la información almacenados en el espacio de +almacenamiento se denominan valor de la variable. Los nombres de variables se utilizan para hacer referencia a las +variables en el código fuente. En diferentes ámbitos, un nombre de variable puede vincular varias variables +independientes, pero las variables no tienen alias. El valor de la variable se puede acceder o cambiar en cualquier +momento durante la ejecución del programa. Berry es un lenguaje de tipo dinámico, por lo que el tipo de valor de la +variable se determina en tiempo de ejecución y la variable puede almacenar cualquier tipo de valor.} + +\subsubsection[2.2.1 Definir variables]{\selectlanguage{spanish} 2.2.1 Definir variables} +\hypertarget{RefHeadingToc355293639824055}{}{\selectlanguage{spanish} +La primera forma de definir una variable es usar una declaración de asignación para asignar un valor a un nuevo nombre +de variable:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{}'var' = \ expresión} + + +\bigskip + +{\selectlanguage{spanish} +\textbf{var} es el nombre de la variable, y el nombre de la variable es un identificador (consulte la sección +identificador). \textbf{expresión} es la expresión para inicializar la variable.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +a = 1} + +{\selectlanguage{spanish}\ttfamily +b ='str'} + + +\bigskip + +{\selectlanguage{spanish} +Sin embargo, este método de definición de variables tiene algunas limitaciones. Tome el siguiente código como ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +i = 0} + +{\selectlanguage{spanish}\ttfamily +do} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ i = 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print(i) \# 1} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +print(i) \# 1} + + +\bigskip + +\foreignlanguage{spanish}{La instrucción }\textstyleSourceText{\foreignlanguage{spanish}{do}}\foreignlanguage{spanish}{ +en la rutina constituye el alcance interno. Modificamos el valor de la variable +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ en la línea 3, y el valor de +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ sigue siendo +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{ después de dejar el alcance interno en la +línea 6. Si queremos que la variable }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ del +ámbito interno sea una variable independiente, el método de definir la variable mediante la asignación directa al nuevo +nombre de variable no puede cumplir el requisito, porque el identificador +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ ya existe en el ámbito externo. En este +caso, la variable se puede definir mediante la palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{}'var' variable} + +{\selectlanguage{spanish}\ttfamily +{}'var' variable = expresión} + + +\bigskip + +\foreignlanguage{spanish}{Hay dos formas de usar +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ para definir una variable: la primera +es seguir el nombre de la variable }\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ después de +la palabra clave }\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{, en este caso la +variable se inicializará a }\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{, y la otra +se escribe en la variable y se inicializa al mismo tiempo que se define la variable. En este caso, se requiere una +expresión de valor inicial }\foreignlanguage{spanish}{\textbf{expresión}}\foreignlanguage{spanish}{. Usar +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ para definir una variable tiene dos +posibles resultados: si el alcance actual no define la variable de +}\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{, definir e inicializar la variable, de lo +contrario, es equivalente a reinicializar la variable. Por lo tanto, la variable definida con +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ protegerá a la variable con el mismo +nombre en el ámbito externo.} + +\foreignlanguage{spanish}{Ahora cambiamos el ejemplo anterior para usar la palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ para definir variables:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +i = 0} + +{\selectlanguage{spanish}\ttfamily +do} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var i = 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print(i) \# 1} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +print(i) \# 0} + + +\bigskip + +\foreignlanguage{spanish}{A partir de la rutina modificada, se puede encontrar que el valor de la variable +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ en el ámbito interno es +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, y su valor en el ámbito externo es +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. Esto prueba que después de usar la +palabra clave }\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{, se define una nueva +variable }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ en el ámbito interno y se +bloquea la variable con el mismo nombre en el ámbito externo. Una vez que finaliza el ámbito interno, el identificador +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ vuelve a vincularse a la variable +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ en el ámbito externo.} + +\foreignlanguage{spanish}{Al usar la palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ para definir una variable, también +puede usar una lista de múltiples nombres de variables, separados por comas. También puede inicializar una o más +variables al definir variables:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +var a = 0, b, c ='test'} + +\subsubsection[2.2.2 Alcance y Ciclo de Vida]{\selectlanguage{spanish} 2.2.2 Alcance y Ciclo de Vida} +\hypertarget{RefHeadingToc355313639824055}{}{\selectlanguage{spanish} +Como se mencionó anteriormente, los nombres de las variables se pueden vincular a varias entidades de variables +(espacios de almacenamiento) y los nombres de las variables se vinculan a una sola entidad en cada posición. La entidad +vinculada por el nombre de la variable debe determinarse de acuerdo con la posición en la que aparece el nombre de la +variable.} + +{\selectlanguage{spanish} +\textbf{Ámbito} se refiere al área de código donde el nombre y la entidad están vinculados de forma única. Fuera del +alcance, el nombre puede estar vinculado a otras entidades, o no estar vinculado a ninguna entidad. La entidad solo es +visible en el alcance asociado al nombre, es decir, la variable solo es válida en su alcance. Un bloque de código (ver +bloque) es un alcance. Una variable solo está disponible dentro del bloque, y los nombres en diferentes bloques pueden +vincular diferentes entidades variables. El siguiente ejemplo demuestra el alcance de las variables:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +var i = 0} + +{\selectlanguage{spanish}\ttfamily +do} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var j ='str'} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print(i, j) \# 0 str} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +\# \ La variable j no está disponible aquí} + +{\selectlanguage{spanish}\ttfamily +print(i) \# 0} + + +\bigskip + +\foreignlanguage{spanish}{Los nombres }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{j}}\foreignlanguage{spanish}{ se definen en esta rutina. El nombre +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ se define fuera de la Sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{do}}\foreignlanguage{spanish}{, y el nombre definido en el bloque más +externo tiene }\foreignlanguage{spanish}{\textbf{Alcance global}}\foreignlanguage{spanish}{. El nombre con alcance +global está disponible en todo el programa después de la personalización. El nombre +}\textstyleSourceText{\foreignlanguage{spanish}{j}}\foreignlanguage{spanish}{ se define en el bloque en la Sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{do}}\foreignlanguage{spanish}{, y el nombre de este tipo de definición +en el bloque no exterior tiene }\foreignlanguage{spanish}{\textbf{Ámbito local}}\foreignlanguage{spanish}{. No se puede +acceder a un nombre con un ámbito local fuera del ámbito.} + +\foreignlanguage{spanish}{Berry tiene algunos objetos integrados, que están todos en el ámbito global. Sin embargo, los +objetos integrados y las variables globales definidas en los scripts no están en el mismo ámbito global. Los objetos +integrados en realidad pertenecen al }\foreignlanguage{spanish}{\textbf{Alcance integrado}}\foreignlanguage{spanish}{. +El alcance es visible globalmente como el alcance global ordinario, pero puede estar cubierto por el alcance global +ordinario. Los objetos incorporados incluyen funciones y clases en la }\foreignlanguage{spanish}{biblioteca estándar. +Estos objetos incluyen funciones de +}\textstyleSourceText{\foreignlanguage{spanish}{impresión}}\foreignlanguage{spanish}{, funciones de +}\textstyleSourceText{\foreignlanguage{spanish}{tipo}}\foreignlanguage{spanish}{ y clases de +}\textstyleSourceText{\foreignlanguage{spanish}{mapa}}\foreignlanguage{spanish}{. A diferencia de otros ámbitos, las +variables en el ámbito integrado son de solo lectura, por lo que la {\textquotedbl}asignación{\textquotedbl} a las +variables en el ámbito integrado en realidad define una variable con el mismo nombre en el ámbito global, que anula los +símbolos en el ámbito en el alcance incorporado.} + +\paragraph[Alcance anidado]{\selectlanguage{spanish} Alcance anidado} +\hypertarget{RefHeadingToc355333639824055}{}\foreignlanguage{spanish}{Ámbito anidado significa que el ámbito contiene +otro ámbito. Llamamos al ámbito contenido }\foreignlanguage{spanish}{\textbf{Ámbito interno}}\foreignlanguage{spanish}{ +y al ámbito que contiene el ámbito interno }\foreignlanguage{spanish}{\textbf{Ámbito +externo}}\foreignlanguage{spanish}{. Se puede acceder al nombre definido en el ámbito externo en todos los ámbitos +internos. El ámbito interno también puede volver a vincular el nombre ya definido en el ámbito externo. El ejemplo +anterior usando }\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ para definir variables +describe este escenario.} + +\paragraph[Ciclo de vida variable]{\selectlanguage{spanish} Ciclo de vida variable} +\hypertarget{RefHeadingToc355353639824055}{}{\selectlanguage{spanish} +No existe el concepto de nombres de variables cuando el programa se está ejecutando, y las variables existen en forma de +entidades en este momento. El {\textquotedbl}período de validez{\textquotedbl} de una variable durante la ejecución del +programa es el \textbf{ciclo de vida} de la variable. Las variables en tiempo de ejecución solo son válidas dentro del +alcance. Después de salir del alcance, las variables se destruirán para recuperar recursos.} + +{\selectlanguage{spanish} +Las variables definidas en el ámbito global se denominan \textbf{Variable global} y tienen \textbf{Ciclo de vida +estático}. Se puede acceder a dichas variables durante todo el programa en ejecución y no se destruirán. Las variables +definidas en el ámbito local se denominan \textbf{Variable local} y tienen \textbf{Ciclo de vida dinámico}. No se puede +acceder a dichas variables después de abandonar el alcance y se destruirán.} + +{\selectlanguage{spanish} +Debido a los diferentes ciclos de vida, las variables locales y las variables globales usan diferentes formas de asignar +el espacio de almacenamiento. Las variables locales se asignan en una estructura llamada \textbf{Pila} (stack), y los +objetos asignados en función de la pila se pueden reclamar rápidamente al final del alcance. Las variables globales se +asignan en \textbf{Tabla global} (tabla global). Los objetos de la tabla global no se reciclarán una vez creados y se +puede acceder a la tabla desde cualquier parte del programa.} + +\subsubsection[2.2.3 Tipo de variable]{\selectlanguage{spanish} 2.2.3 Tipo de variable} +\hypertarget{RefHeadingToc355373639824055}{}\foreignlanguage{spanish}{Berry determina el tipo de variable en tiempo de +ejecución. En otras palabras, la variable puede almacenar cualquier tipo de valor. Por lo tanto, Berry es un lenguaje +de }\foreignlanguage{spanish}{\textbf{escritura dinámica}}\foreignlanguage{spanish}{. El intérprete no deduce el tipo +de la variable en tiempo de compilación, lo que puede provocar que se expongan algunos errores en tiempo de ejecución. +Por ejemplo, el error generado al ejecutar la expresión }\textstyleSourceText{\foreignlanguage{spanish}{{}'1' + +1}}\foreignlanguage{spanish}{ es un error de tiempo de ejecución y no un error del compilador. La ventaja de usar tipos +dinámicos es que se pueden simplificar muchos diseños y el programa será más flexible, sin mencionar la necesidad de +diseñar un sistema de inferencia de tipos complejo.} + +\foreignlanguage{spanish}{Debido a que el intérprete no verifica el tipo, es posible que el código de usuario deba +determinar el tipo de valor por sí mismo, y esta característica también se puede usar para implementar algunas +operaciones especiales. Esta característica también hace que las funciones sobrecargadas sean innecesarias. Por +ejemplo, la función nativa }\textstyleSourceText{\foreignlanguage{spanish}{type}}\foreignlanguage{spanish}{ acepta +cualquier tipo de parámetro y devuelve una cadena que describe el tipo de parámetro.} + +\clearpage\section[Capítulo 3: Expresiones]{Capítulo 3: \foreignlanguage{spanish}{Expresiones}} +\hypertarget{RefHeadingToc355393639824055}{} +\bigskip + +\subsection[3.1 Conceptos básicos]{\selectlanguage{spanish} 3.1 Conceptos básicos} +\hypertarget{RefHeadingToc355413639824055}{}{\selectlanguage{spanish} +Una expresión (Declaración) se compone de uno a más operandos y operadores, y se puede obtener un resultado evaluando la +expresión. Este resultado se llama el valor de la expresión. El operando puede ser un valor literal, una variable, una +llamada de función o una subexpresión, etc. Las expresiones y operadores simples también se pueden combinar en +expresiones más complejas. Similar a las cuatro operaciones aritméticas, la precedencia de los operadores afecta el +orden de evaluación de las expresiones. Cuanto mayor sea la precedencia del operador, antes se evaluará la expresión.} + +\subsubsection[3.1.1 Operadores y expresiones]{\selectlanguage{spanish} 3.1.1 Operadores y expresiones} +\hypertarget{RefHeadingToc355433639824055}{}\foreignlanguage{spanish}{Berry proporciona algunos operadores unarios y +operadores binarios. Por ejemplo, el operador AND lógico +}\textstyleSourceText{\foreignlanguage{spanish}{\&\&}}\foreignlanguage{spanish}{ es un operador binario, y el operador +de negación lógica }\textstyleSourceText{\foreignlanguage{spanish}{!}}\foreignlanguage{spanish}{ es un operador unario. +Algunos operadores pueden ser operadores unarios u operadores binarios. El significado específico de tales operadores +depende del contexto. Por ejemplo, el operador +}\textstyleSourceText{\foreignlanguage{spanish}{{}-}}\foreignlanguage{spanish}{ es un símbolo unario en la expresión +}\textstyleSourceText{\foreignlanguage{spanish}{{}-1}}\foreignlanguage{spanish}{, pero es un signo menos binario en la +expresión }\textstyleSourceText{\foreignlanguage{spanish}{1-2}}\foreignlanguage{spanish}{.} + +\paragraph[Expresión de combinación de operadores]{\selectlanguage{spanish} Expresión de combinación de operadores} +\hypertarget{RefHeadingToc355453639824055}{}{\selectlanguage{spanish} +Tanto el lado izquierdo como el derecho de un operador binario pueden ser subexpresiones, por lo que puede usar +operadores binarios para combinar expresiones. Una expresión más compleja suele tener varios operadores y operandos. En +este momento, el orden de evaluación de cada subexpresión en la expresión puede afectar el valor de la expresión. La +precedencia y asociatividad de los operadores garantizan la unicidad del orden de evaluación de la expresión. Por +ejemplo, una expresión combinada:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +1 + 10/2 * 3} + + +\bigskip + +\foreignlanguage{spanish}{Las cuatro operaciones aritméticas de uso diario calcularán primero la expresión de división +}\textstyleSourceText{\foreignlanguage{spanish}{10/2}}\foreignlanguage{spanish}{, luego la expresión de multiplicación +y finalmente la expresión de suma. Esto se debe a que la multiplicación y la división tienen mayor prioridad que la +suma.} + +\paragraph[Tipo de operando]{\selectlanguage{spanish} Tipo de operando} +\hypertarget{RefHeadingToc355473639824055}{}\foreignlanguage{spanish}{En la operación de expresiones, los operandos +pueden tener tipos que no coincidan con los operadores. Además, los operadores binarios normalmente requieren que los +operandos izquierdo y derecho sean del mismo tipo. La expresión +}\textstyleSourceText{\foreignlanguage{spanish}{{}'10'+10}}\foreignlanguage{spanish}{ es incorrecta. No puede agregar +una cadena a un número entero. El problema con la expresión +}\textstyleSourceText{\foreignlanguage{spanish}{{}-'b'}}\foreignlanguage{spanish}{ es que no puedes tomar un valor +negativo en una cadena. A veces, un operador binario tiene diferentes tipos de operandos pero puede realizar +operaciones. Por ejemplo, al agregar un número entero a un número real, el objeto entero se convertirá en un número +real y se agregará a otro objeto de número real. Los operadores lógicos AND y OR lógicos permiten que los operandos a +ambos lados del operador sean de cualquier tipo. En expresiones lógicas, siempre se convertirán al tipo +}\textstyleSourceText{\foreignlanguage{spanish}{booleano}}\foreignlanguage{spanish}{ de acuerdo con ciertas reglas.} + +{\selectlanguage{spanish} +Otra situación es que los operadores pueden sobrecargarse al usar clases personalizadas. En esencia, puede interpretar +este operador arbitrariamente y depende de usted decidir qué tipo de operando debe ser.} + +\subsubsection[3.1.2 Prioridad y asociatividad]{\selectlanguage{spanish} 3.1.2 Prioridad y asociatividad} +\hypertarget{RefHeadingToc355493639824055}{}{\selectlanguage{spanish} +En una expresión compuesta de varios operadores, la precedencia y la asociatividad de los operadores determinan el orden +de evaluación de las expresiones. La precedencia y asociatividad de cada operador se dan en la Tabla 2 .} + +\foreignlanguage{spanish}{La precedencia especifica el orden de evaluación entre diferentes operadores, y las +expresiones con operadores de mayor precedencia se evaluarán primero. Por ejemplo, el proceso de evaluar la expresión +}\textstyleSourceText{\foreignlanguage{spanish}{1+2*3}}\foreignlanguage{spanish}{ calculará primero el resultado de +}\textstyleSourceText{\foreignlanguage{spanish}{2*3}}\foreignlanguage{spanish}{ y luego el resultado de la expresión de +suma. El uso de paréntesis puede mejorar el orden de evaluación de las expresiones de baja prioridad. Por ejemplo, en +la evaluación de la expresión }\textstyleSourceText{\foreignlanguage{spanish}{(1+2)*3}}\foreignlanguage{spanish}{, +primero se calcula el resultado de la expresión +}\textstyleSourceText{\foreignlanguage{spanish}{1+2}}\foreignlanguage{spanish}{ entre paréntesis y luego se calcula la +expresión de multiplicación fuera de los paréntesis.} + +\foreignlanguage{spanish}{La asociatividad se refiere al orden de evaluación de los operandos en ambos lados del +operador, donde los operandos pueden ser subexpresiones. Por ejemplo, en la expresión de suma +}\textstyleSourceText{\foreignlanguage{spanish}{expr1 + expr2}}\foreignlanguage{spanish}{, el valor de +}\textstyleSourceText{\foreignlanguage{spanish}{expr1}}\foreignlanguage{spanish}{ se calcula primero y luego el valor +de }\textstyleSourceText{\foreignlanguage{spanish}{expr2}}\foreignlanguage{spanish}{, porque el operador de suma es +asociativo por la izquierda.} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Prioridad} & +\centering{\selectlanguage{spanish}\bfseries Operador} & +{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Asociatividad}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Prioridad} & +\centering{\selectlanguage{spanish}\bfseries Operador} & +{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Asociatividad}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{2.303cm}m{3.462cm}m{5.573cm}m{3.783cm}} +\centering{\selectlanguage{spanish} 1} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{()}} & +{\selectlanguage{spanish} Símbolo de agrupación} & +\centering\arraybslash{\selectlanguage{spanish} {}-}\\ +\centering{\selectlanguage{spanish} 2} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{() [] .}} & +{\selectlanguage{spanish} Operación de campo} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 3} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}-! \~{}}} & +{\selectlanguage{spanish} Signo negativo, negación lógica, cambio de bit} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 4} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{* / \%}} & +{\selectlanguage{spanish} Multiplicación, división y resto} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 5} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{+ -}} & +{\selectlanguage{spanish} Suma, resta} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 6} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textless}{\textless} {\textgreater}{\textgreater}}} & +{\selectlanguage{spanish} Mover a la izquierda, mover a la derecha} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 7} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{\&}} & +{\selectlanguage{spanish} Bit a bit Y} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 8} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{\^{}}} & +{\selectlanguage{spanish} XOR bit a bit} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 9} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbar}}} & +{\selectlanguage{spanish} Bit a bit O} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 10} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{..}} & +{\selectlanguage{spanish} Operador de concatenación} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 11} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textless} {\textless}= {\textgreater} {\textgreater}=}} & +{\selectlanguage{spanish} Mayor que, mayor que o igual a} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 12} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{== !=}} & +{\selectlanguage{spanish} Igual a, no igual a} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 13} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{\&\&}} & +{\selectlanguage{spanish} Y lógico} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 14} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbar}{\textbar}}} & +{\selectlanguage{spanish} O lógico} & +\centering\arraybslash{\selectlanguage{spanish} izquierda}\\ +\centering{\selectlanguage{spanish} 15} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{? :}} & +{\selectlanguage{spanish} Operador condicional} & +\centering\arraybslash{\selectlanguage{spanish} derecha}\\ +\centering{\selectlanguage{spanish} 16} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{\&= {\textbar}= \^{}= {\textless}{\textless}= +{\textgreater}{\textgreater}=}} & +{\selectlanguage{spanish} Asignación} & +\centering\arraybslash{\selectlanguage{spanish} derecha}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 2: Lista de operadores} + + +\bigskip + +\paragraph[Utilice corchetes para aumentar la prioridad]{\selectlanguage{spanish} Utilice corchetes para aumentar la +prioridad} +\hypertarget{RefHeadingToc355513639824055}{}{\selectlanguage{spanish} +Los paréntesis se pueden usar cuando necesitamos que los operadores con menor precedencia se evalúen primero. Durante la +evaluación de expresiones, primero se calcula el valor de la expresión entre paréntesis. En otras palabras, para toda +la expresión, la expresión entre paréntesis es equivalente a un operando, independientemente de la composición de la +expresión entre paréntesis.} + +\subsection[3.2 Operador]{\selectlanguage{spanish} 3.2 Operador} +\hypertarget{RefHeadingToc355533639824055}{}\subsubsection[3.2.1 Operadores aritméticos]{\selectlanguage{spanish} 3.2.1 +Operadores aritméticos} +\hypertarget{RefHeadingToc355553639824055}{}{\selectlanguage{spanish} +Los operadores aritméticos se utilizan para implementar operaciones aritméticas. Estos operadores son similares a los +símbolos matemáticos que solemos usar. Los operadores aritméticos provistos por Berry se muestran en la Tabla 3 .} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Operador} & +\centering{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Ejemplo}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Operador} & +\centering{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Ejemplo}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{3.178cm}m{7.0350003cm}m{5.1080003cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}-}} & +\centering{\selectlanguage{spanish} menos unario} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{{}- expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{+}} & +\centering{\selectlanguage{spanish} Concatenación más/cadena} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr + expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}-}} & +\centering{\selectlanguage{spanish} signo menos} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr-expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{*}} & +\centering{\selectlanguage{spanish} Signo de multiplicación} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr * expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{/}} & +\centering{\selectlanguage{spanish} Signo de división} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr / expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{\%}} & +\centering{\selectlanguage{spanish} Toma el resto} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr\%expr}}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 3: Operador aritmético} + + +\bigskip + +\foreignlanguage{spanish}{Operador binario }\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{ +Además de ser un signo más, también es una concatenación de cadenas. Cuando el operando de este operador es una cadena, +la concatenación de cadenas se realizará para concatenar dos cadenas en una cadena más larga. Para ser precisos, +}\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{ como concatenación de cadenas ya no está +en la categoría de operadores aritméticos.} + +\foreignlanguage{spanish}{El operador binario +}\textstyleSourceText{\foreignlanguage{spanish}{\%}}\foreignlanguage{spanish}{ es el símbolo de resto. Sus operandos +deben ser números enteros. El resultado de la operación de resto es el resto después de dividir el operando izquierdo +por el operando derecho. Por ejemplo, el resultado de +}\textstyleSourceText{\foreignlanguage{spanish}{11\%4}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{3}}\foreignlanguage{spanish}{. El tipo de número real no puede ser +divisible, por lo que no se admite el resto.} + +\foreignlanguage{spanish}{En general, los operadores aritméticos no cumplen la ley conmutativa. Por ejemplo, los valores +de las expresiones }\textstyleSourceText{\foreignlanguage{spanish}{2/4}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{4/2}}\foreignlanguage{spanish}{ no son iguales.} + +{\selectlanguage{spanish} +Todos los operadores aritméticos se pueden sobrecargar en la clase. Los operadores sobrecargados no están necesariamente +limitados a su diseño funcional original, sino que son determinados por el programador.} + +\subsubsection[3.2.2 Operadores relacionales]{\selectlanguage{spanish} 3.2.2 Operadores relacionales} +\hypertarget{RefHeadingToc355573639824055}{}{\selectlanguage{spanish} +Los operadores relacionales se utilizan para comparar la magnitud de los operandos. Los seis operadores relacionales +soportados por Berry se dan en la Tabla 4 .} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Operador} & +\centering{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Ejemplo}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Operador} & +\centering{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Ejemplo}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{3.6629999cm}m{6.55cm}m{5.1080003cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textless}}} & +\centering{\selectlanguage{spanish} Menor que} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr {\textless} expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textless}=}} & +\centering{\selectlanguage{spanish} Menor o igual que} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr {\textless}= expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{==}} & +\centering{\selectlanguage{spanish} Igual} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr == expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{!=}} & +\centering{\selectlanguage{spanish} No es igual a} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr != expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}=}} & +\centering{\selectlanguage{spanish} Mayor o igual a} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr {\textgreater}= expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}}} & +\centering{\selectlanguage{spanish} Mayor qu e} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{{}-expr}}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 4: Operador relacional} + + +\bigskip + +\foreignlanguage{spanish}{Al comparar la relación de magnitud de los operandos o juzgar si los operandos son iguales, la +evaluación de la expresión relacional producirá un resultado booleano. Cuando se cumple la relación, el valor de la +expresión de la relación es {\textquotedbl}verdadero{\textquotedbl}, de lo contrario, es +{\textquotedbl}falso{\textquotedbl}. Los operadores relacionales +}\textstyleSourceText{\foreignlanguage{spanish}{==}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{!=}}\foreignlanguage{spanish}{ pueden usar cualquier tipo de operando y +permiten que los operandos izquierdo y derecho tengan diferentes tipos. Otros operadores relacionales permiten el uso +de las siguientes combinaciones de operandos:} + +{\selectlanguage{spanish} +\textbf{integer} relop} + +{\selectlanguage{spanish} +\textbf{integer} \textbf{real} relop} + +{\selectlanguage{spanish} +\textbf{real} \textbf{integer} relop} + +{\selectlanguage{spanish} +\textbf{real} \textbf{real} relop} + +{\selectlanguage{spanish} +\textbf{integer} \textbf{string} relop \textbf{string}} + +\foreignlanguage{spanish}{En operaciones relacionales, el signo igual +}\textstyleSourceText{\foreignlanguage{spanish}{==}}\foreignlanguage{spanish}{ y el signo de desigualdad +}\textstyleSourceText{\foreignlanguage{spanish}{!=}}\foreignlanguage{spanish}{ satisfacen la ley conmutativa. Si los +operandos izquierdo y derecho son del mismo tipo o ambos son de tipo numérico (número entero y número real), los +operandos se consideran iguales según el valor de los operandos; de lo contrario, los operandos se consideran +desiguales. La igualdad y la desigualdad son operaciones recíprocas: si +}\textstyleSourceText{\foreignlanguage{spanish}{a==b}}\foreignlanguage{spanish}{ es verdadero, entonces +}\textstyleSourceText{\foreignlanguage{spanish}{a!=b}}\foreignlanguage{spanish}{ es falso, y viceversa. Otros +operadores relacionales no satisfacen la ley conmutativa, pero tienen las siguientes propiedades: +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}=}}\foreignlanguage{spanish}{ son operaciones recíprocas, +y }\textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}=}}\foreignlanguage{spanish}{ son operaciones recíprocas. +Las operaciones relacionales requieren que los operandos sean del mismo tipo, de lo contrario es una expresión +incorrecta.} + +{\selectlanguage{spanish} +Las instancias pueden sobrecargar a los operadores como métodos. Si el operador relacional está sobrecargado, el +programa debe garantizar las propiedades anteriores.} + +\foreignlanguage{spanish}{Entre los operadores relacionales, los operadores +}\textstyleSourceText{\foreignlanguage{spanish}{==}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{!=}}\foreignlanguage{spanish}{ tienen requisitos más relajados que +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}=}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}=}}\foreignlanguage{spanish}{, que solo permiten +comparaciones entre los mismos tipos. En el desarrollo de un programa real, el juicio de igualdad o desigualdad suele +ser más simple que el juicio de tamaño. Es posible que algunos objetos de operación no puedan juzgar el tamaño, pero +solo pueden juzgar la igualdad o desigualdad. Este es el caso del tipo booleano.} + +\subsubsection[3.2.3 Operadores logicos]{\selectlanguage{spanish} 3.2.3 Operadores logicos} +\hypertarget{RefHeadingToc355593639824055}{}{\selectlanguage{spanish} +Los operadores lógicos se dividen en tres tipos: AND lógico, OR lógico y NOT lógico. Como se muestra en la Tabla 5 .} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Operador} & +\centering{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Ejemplo}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Operador} & +\centering{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Ejemplo}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{3.462cm}m{6.7510004cm}m{5.1080003cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{\&\&}} & +\centering{\selectlanguage{spanish} Y lógico} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr \&\& expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbar}{\textbar}}} & +\centering{\selectlanguage{spanish} O lógico} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr{\textbar}{\textbar} expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{!}} & +\centering{\selectlanguage{spanish} Negación lógica} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{!expr}}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 5: Operadores lógicos} + + +\bigskip + +{\selectlanguage{spanish} +Para el operador lógico AND, cuando los valores de ambos operandos son {\textquotedbl}verdaderos{\textquotedbl}, el +valor de la expresión lógica es {\textquotedbl}verdadero{\textquotedbl}, de lo contrario, es +{\textquotedbl}falso{\textquotedbl}.} + +\foreignlanguage{spanish}{Para el operador lógico OR, cuando los valores de ambos operandos son +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{, el valor de la expresión lógica es +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{, de lo contrario es +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +El papel del operador de negación lógica es cambiar el estado lógico del operando. Cuando el valor del operando es +{\textquotedbl}verdadero{\textquotedbl}, el valor de la expresión lógica es {\textquotedbl}falso{\textquotedbl}, de lo +contrario, el valor es {\textquotedbl}verdadero{\textquotedbl}.} + +{\selectlanguage{spanish} +Los operadores lógicos requieren que el operando sea de tipo booleano, y si el operando no es de tipo booleano, se +convertirá. Consulte la sección [Capitulo-2: Tipo booleano] para conocer las reglas de conversión.} + +{\selectlanguage{spanish} +Las operaciones lógicas utilizan una estrategia de evaluación llamada \textbf{Evaluación de cortocircuito}. Esta +estrategia de evaluación es: para el operador lógico AND, el segundo operando se evaluará si y solo si el operando de +la izquierda es verdadero; para el operador lógico OR, si y solo si el operando izquierdo es falso evaluará el operando +derecho. La naturaleza de la evaluación de cortocircuito hace que no se ejecute todo el código de la expresión lógica.} + +\subsubsection[3.2.4 Operador bit a bit]{\selectlanguage{spanish} 3.2.4 Operador bit a bit} +\hypertarget{RefHeadingToc355613639824055}{}{\selectlanguage{spanish} +Los operadores de bits pueden implementar algunas operaciones de bits binarios, y las operaciones de bits solo se pueden +usar en tipos enteros. La información detallada de los operadores de bit se muestra en la Tabla 6 . La operación de +bits se refiere a la operación de bits binarios directamente en números enteros. Las operaciones lógicas se pueden +extender a operaciones de bits. Tomando AND lógico como ejemplo, podemos realizar esta operación en cada bit binario +para lograr AND bit a bit, como \$110\_b{\textbackslash} \{{\textbackslash}rm AND\}{\textbackslash} 011\_b = 010\_b\$. +Las operaciones de bits también admiten operaciones de cambio, que mueven números de forma binaria.} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Operador} & +~ + & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Ejemplo}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Operador} & +~ + & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Ejemplo}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{3.555cm}m{6.658cm}m{5.1080003cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{\~{}}} & +{\selectlanguage{spanish} Negar} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{\~{}expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{\&}} & +{\selectlanguage{spanish} Bit a bit y} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr \& expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbar}}} & +{\selectlanguage{spanish} Bit a bit o} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr{\textbar} expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{\^{}}} & +{\selectlanguage{spanish} O exclusivo bit a bit} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr\^{}expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textless}{\textless}}} & +{\selectlanguage{spanish} Desplazar a la izquierda} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr {\textless}{\textless} expr}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}{\textgreater}}} & +{\selectlanguage{spanish} Desplazar a la derecha} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{expr {\textgreater}{\textgreater} expr}}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 6: Operador bit a bit} + + +\bigskip + +\foreignlanguage{spanish}{Aunque solo se puede usar para números enteros, las operaciones con bits siguen siendo +versátiles. Las operaciones de bits pueden implementar muchas técnicas de optimización. En muchos algoritmos, el uso de +operaciones de bits puede ahorrar mucho código. Por ejemplo, para determinar si un número +}\textstyleSourceText{\foreignlanguage{spanish}{n}}\foreignlanguage{spanish}{ es una potencia de 2, podemos juzgar si +el resultado de }\textstyleSourceText{\foreignlanguage{spanish}{n \& (n - 1)}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. En algunos lenguajes con alta eficiencia +de ejecución, las operaciones de cambio también se pueden usar para optimizar la multiplicación y la división (por lo +general, no hay un efecto obvio en los lenguajes de secuencias de comandos).} + +\foreignlanguage{spanish}{El operador AND bit a bit +{\textquotedbl}}\textstyleSourceText{\foreignlanguage{spanish}{\&}}\foreignlanguage{spanish}{{\textquotedbl} es un +operador binario, que realiza la operación AND binaria de dos operandos enteros: solo cuando los bits binarios +correspondientes a los operandos son todos +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, el resultado es +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{. Por ejemplo, 1110 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ \& 0111 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ = 0110 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ .} + +\foreignlanguage{spanish}{El operador OR bit a bit +{\textquotedbl}}\textstyleSourceText{\foreignlanguage{spanish}{{\textbar}}}\foreignlanguage{spanish}{{\textquotedbl} es +un operador binario, que realiza una operación OR de bits binarios en dos operandos enteros: solo cuando los bits +binarios correspondientes a los operandos son ambos +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, el bit del resultado es +}\textstyleSourceText{\foreignlanguage{spanish}{\ 0}}\foreignlanguage{spanish}{. Por ejemplo, 1000 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ {\textbar} 0001 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ = 1001 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ .} + +\foreignlanguage{spanish}{El operador OR exclusivo bit a bit +``}\textstyleSourceText{\foreignlanguage{spanish}{\^{}}}\foreignlanguage{spanish}{{}'' es un operador binario, que +realiza una operación OR exclusiva binaria en dos operandos enteros: cuando los bits binarios correspondientes a los +operandos son diferentes, el valor de bit del resultado es +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{. Por ejemplo, \$1100\_b{\textbackslash} +{\textbackslash}hat\{\}{\textbackslash} 0101\_b = 1001\_b\$.} + +\foreignlanguage{spanish}{El operador de desplazamiento a la izquierda +``}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}{\textless}}}\foreignlanguage{spanish}{{}'' es un operador +binario, que mueve el operando izquierdo hacia la izquierda el número de bits especificado por el operando derecho +sobre una base binaria. Por ejemplo, 00001010 }\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ ${\ll}$ +3 = 01010000 }\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ . El operador de desplazamiento a la +derecha ``}\textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}{\textgreater}}}\foreignlanguage{spanish}{{}'' +es un operador binario, que desplaza el operando izquierdo hacia la derecha el número de bits especificado por el +operando derecho en un binario. base. Por ejemplo, 10100000 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ ${\gg}$ 3 = 00010100 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ .} + +\foreignlanguage{spanish}{El operador de inversión bit a bit ``\~{}'' es un operador unario, y el resultado de la +expresión es invertir el valor de cada bit binario del operando. Por ejemplo, +}\textstyleSourceText{\foreignlanguage{spanish}{${\sim}$}}\foreignlanguage{spanish}{10100011 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ = 01011100 +}\foreignlanguage{spanish}{\textit{b}}\foreignlanguage{spanish}{ .} + +{\selectlanguage{spanish} +Los siguientes son algunos ejemplos del uso de operaciones con bits. Por lo general, no usamos binario directamente. Los +resultados de los ejemplos se han convertido en bases comunes.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +1 {\textless}{\textless} 1 \# 2} + +{\selectlanguage{spanish}\ttfamily +168 {\textgreater}{\textgreater} 4 \# 10} + +{\selectlanguage{spanish}\ttfamily +456 \& 127 \# 72} + +{\selectlanguage{spanish}\ttfamily +456 {\textbar} 127 \# 511} + +{\selectlanguage{spanish}\ttfamily +0xA5 \^{} 0x5A \# 255} + +{\selectlanguage{spanish}\ttfamily +\~{}2 \# -3} + +\subsubsection[3.2.5 Operador de asignación]{\selectlanguage{spanish} 3.2.5 Operador de asignación} +\hypertarget{RefHeadingToc355633639824055}{}{\selectlanguage{spanish} +El operador de asignación solo aparece en la expresión de asignación y el operando del operador debe ser un objeto de +escritura. La expresión de asignación no tiene resultado, por lo que no se pueden utilizar operaciones de asignación +continua.} + +\paragraph[Operador de asignación simple]{\selectlanguage{spanish} Operador de asignación simple} +\hypertarget{RefHeadingToc355653639824055}{}\foreignlanguage{spanish}{El operador de asignación simple +}\textstyleSourceText{\foreignlanguage{spanish}{=}}\foreignlanguage{spanish}{ se puede utilizar para la asignación de +variables. Si la }\foreignlanguage{spanish}{variable de operando de la izquierda no está definida, se definirá la +variable. El operador de asignación se utiliza para vincular el valor del operando derecho con el operando izquierdo. +Este proceso también se llama {\textquotedbl}asignación{\textquotedbl}. Por lo tanto, el operando izquierdo no puede +ser una constante, ni puede ser ningún objeto que no se pueda escribir. Estas son algunas expresiones legales de +asignación:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +a = 45 b ='string' c = 0} + + +\bigskip + +{\selectlanguage{spanish} +Y la siguiente expresión de asignación es incorrecta:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +1 = 5 \# Tratando de asignar una constante 1} + +{\selectlanguage{spanish}\ttfamily +a = b = 0 \# \ Asignación continua} + + +\bigskip + +\foreignlanguage{spanish}{Al asignar tipos +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{, enteros, reales y booleanos a +variables, el valor del objeto se pasará al operando izquierdo, pero para otros tipos, la operación de asignación +simplemente pasa la referencia del objeto al operando izquierdo. Dado que las cadenas, las funciones y los tipos de +clase son de solo lectura, todas las referencias que pasan no tendrán efectos secundarios, pero debe tener mucho +cuidado con los tipos de instancia.} + +\paragraph[Operador de asignación compuesto]{\selectlanguage{spanish} Operador de asignación compuesto} +\hypertarget{RefHeadingToc355673639824055}{}{\selectlanguage{spanish} +Los operadores de asignación compuestos son operadores que combinan operadores binarios y operadores de asignación. Son +extensiones prácticas de operadores de asignación simples. Los operadores de asignación compuestos pueden simplificar +la escritura de algunas expresiones. La Tabla 7 enumera todos los operadores de asignación compuestos} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Operador} & +{\selectlanguage{spanish}\bfseries Descripción}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Operador} & +{\selectlanguage{spanish}\bfseries Descripción}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{3.756cm}m{11.764cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{+=}} & +{\selectlanguage{spanish} Asignación de adición}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}-=}} & +{\selectlanguage{spanish} Asignación de resta}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{*=}} & +{\selectlanguage{spanish} Asignación de multiplicación}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{/=}} & +{\selectlanguage{spanish} Asignación de división}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{\%=}} & +{\selectlanguage{spanish} Asignación de resto}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{\&=}} & +{\selectlanguage{spanish} Asignación AND bit a bit}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textbar}=}} & +{\selectlanguage{spanish} Asignación OR bit a bit}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{\^{}=}} & +{\selectlanguage{spanish} Asignación XOR bit a bit}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textless}{\textless}=}} & +{\selectlanguage{spanish} Asignación de desplazamiento a la izquierda}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{\textgreater}{\textgreater}=}} & +{\selectlanguage{spanish} Asignación de desplazamiento a la derecha}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 7: Operador de bits} + + +\bigskip + +\foreignlanguage{spanish}{La expresión de asignación compuesta realiza la operación binaria correspondiente al operador +de asignación compuesta en el operando izquierdo y el operando derecho, y luego asigna el resultado al operando +izquierdo. Tomando }\textstyleSourceText{\foreignlanguage{spanish}{+=}}\foreignlanguage{spanish}{ como ejemplo, la +expresión }\textstyleSourceText{\foreignlanguage{spanish}{a += b}}\foreignlanguage{spanish}{ es equivalente a +}\textstyleSourceText{\foreignlanguage{spanish}{a = a + b}}\foreignlanguage{spanish}{. El operador de asignación +compuesto también es un operador de asignación, por lo que tiene una prioridad más baja. El operador binario +correspondiente al operador de asignación compuesto siempre se evalúa después del operando derecho, por lo que una +expresión como }\textstyleSourceText{\foreignlanguage{spanish}{a *= 1 + 2}}\foreignlanguage{spanish}{ debería ser +equivalente a }\textstyleSourceText{\foreignlanguage{spanish}{a = a * (1 + 2)}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +A diferencia del operador de asignación simple, el operando izquierdo del operador de asignación compuesto debe +participar en la evaluación, por lo que la expresión de asignación compuesta no tiene la función de definir variables. +El operador de asignación en sí no se puede sobrecargar en la clase. Los usuarios solo pueden sobrecargar el operador +binario correspondiente al operador de asignación compuesto. Esto también asegura que el operador de asignación +compuesto siempre se ajustará a las características básicas de las operaciones de asignación.} + +\subsubsection{3.2.6 Operador de dominio y operador de subíndice} +\hypertarget{RefHeadingToc355693639824055}{}\foreignlanguage{spanish}{El operador de dominio +}\textstyleSourceText{\foreignlanguage{spanish}{.}}\foreignlanguage{spanish}{ se utiliza para acceder a un atributo o +miembro de un objeto. Puede utilizar operadores de dominio para ambos tipos de módulos e instancias:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +l = list[]} + +{\selectlanguage{spanish}\ttfamily +l.push('item 0')} + +{\selectlanguage{spanish}\ttfamily +s = l.item(0) \# 'item 0'} + + +\bigskip + +\foreignlanguage{spanish}{El operador de subíndice +}\textstyleSourceText{\foreignlanguage{spanish}{[]}}\foreignlanguage{spanish}{ se utiliza para acceder a los elementos +de un objeto, por ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +l[2] = 10 \# Leido por índice} + +{\selectlanguage{spanish}\ttfamily +n = l[2] \# Escrito por índice} + + +\bigskip + +\foreignlanguage{spanish}{Las clases que admiten la lectura de subíndices deben implementar el método +}\textstyleSourceText{\foreignlanguage{spanish}{item}}\foreignlanguage{spanish}{ y las clases que admiten la escritura +de subíndices deben implementar el método +}\textstyleSourceText{\foreignlanguage{spanish}{setitem}}\foreignlanguage{spanish}{. El mapa y la lista en el +contenedor estándar implementan estos dos métodos, por lo que admiten la lectura y escritura mediante el operador de +subíndice. La cadena admite la lectura de subíndices, pero no admite la escritura de subíndices (las cadenas son +valores de solo lectura):} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{}'string'[2] \#'r'} + +{\selectlanguage{spanish}\ttfamily +{}'string'[2] ='a' \# error: \ valor 'string' no admite asignación de índice} + + +\bigskip + +{\selectlanguage{spanish} +Actualmente, las cadenas admiten subíndices enteros y el rango de subíndices no puede exceder la longitud de la cadena.} + +\subsubsection[3.2.7 Operador condicional]{\selectlanguage{spanish} 3.2.7 Operador condicional} +\hypertarget{RefHeadingToc355713639824055}{}\foreignlanguage{spanish}{El operador condicional +(}\textstyleSourceText{\foreignlanguage{spanish}{? :}}\foreignlanguage{spanish}{) es similar a la declaración +}\foreignlanguage{spanish}{\textbf{if else}}\foreignlanguage{spanish}{, pero la primera puede usarse en expresiones. La +forma de uso del operador condicional es: \$\${\textbackslash}begin\{gathered\} cond{\textbackslash} +{\textbackslash}bm\{?\}{\textbackslash} expr1{\textbackslash} {\textbackslash}bm\{:\}{\textbackslash} +expr2{\textbackslash}end\{gathered\}\$\$} + +{\selectlanguage{spanish} +\textbf{\textit{cond}} es la expresión utilizada para juzgar la condición. El proceso de evaluación del operador +condicional es: primero encuentra el valor de \textbf{\textit{cond}}, si la condición es verdadera, evalúa +\textbf{\textit{expr1}} y devuelve el valor, de lo contrario, el valor de \textit{**expr2 **} ] Evalúa y devuelve el +valor. \textbf{\textit{expr1}} y \textbf{\textit{expr2}} pueden tener diferentes tipos, por lo que lo siguiente es +correcto:} + +{\selectlanguage{spanish}\ttfamily +resultado = alcance {\textless} 6 ? 'malo' : alcance} + +\foreignlanguage{spanish}{Esta expresión primero determina si +}\textstyleSourceText{\foreignlanguage{spanish}{alcance}}\foreignlanguage{spanish}{ es menor que +}\textstyleSourceText{\foreignlanguage{spanish}{6}}\foreignlanguage{spanish}{, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{malo}}\foreignlanguage{spanish}{, de lo contrario, devuelve el valor de +}\textstyleSourceText{\foreignlanguage{spanish}{alcance}}\foreignlanguage{spanish}{. Independientemente de la condición +de la expresión }\foreignlanguage{spanish}{condicional, solo se ejecutará uno de +}\foreignlanguage{spanish}{\textbf{\textit{expr1}}}\foreignlanguage{spanish}{ o +}\foreignlanguage{spanish}{\textbf{\textit{expr2}}}\foreignlanguage{spanish}{, similar a la característica de +cortocircuito de las operaciones lógicas AND y lógicas OR.} + +\paragraph[Operadores de condiciones anidadas]{\selectlanguage{spanish} Operadores de condiciones anidadas} +\hypertarget{RefHeadingToc355733639824055}{}{\selectlanguage{spanish} +Un operador condicional se puede anidar en otro operador condicional, es decir, la expresión condicional se puede usar +como \textbf{\textit{cond}} o \textbf{\textit{expr}} de otra expresión condicional. Por ejemplo, use expresiones +condicionales para dividir puntajes en tres niveles: excelente, bueno y malo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +resultado = alcance {\textgreater}= 9 ? 'excelente' : alcance {\textgreater}= 6 ? 'bueno' : 'malo'} + + +\bigskip + +\foreignlanguage{spanish}{La primera condición comprueba si la puntuación no es inferior a +}\textstyleSourceText{\foreignlanguage{spanish}{9}}\foreignlanguage{spanish}{ puntos. Si es así, ejecute la rama +después de }\textstyleSourceText{\foreignlanguage{spanish}{?}}\foreignlanguage{spanish}{ y devuelva +}\textstyleSourceText{\foreignlanguage{spanish}{{}'excelente'}}\foreignlanguage{spanish}{; de lo contrario, ejecute la +rama después de }\textstyleSourceText{\foreignlanguage{spanish}{:}}\foreignlanguage{spanish}{, que también es una +expresión condicional. La condición comprueba si la puntuación no es inferior a +}\textstyleSourceText{\foreignlanguage{spanish}{6}}\foreignlanguage{spanish}{, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{{}'bueno'}}\foreignlanguage{spanish}{, de lo contrario, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{{}'malo'}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +El operador condicional satisface la asociatividad correcta, por lo que el valor de la expresión de bifurcación debe +evaluarse primero para obtener el valor de la expresión condicional. Por lo tanto, en una expresión condicional +anidada, la expresión condicional anidada se evalúa primero y luego se evalúa la expresión condicional externa.} + +\paragraph[Prioridad de los operadores condicionales]{\selectlanguage{spanish} Prioridad de los operadores +condicionales} +\hypertarget{RefHeadingToc355753639824055}{}{\selectlanguage{spanish} +Dado que la precedencia de las expresiones condicionales es muy baja (sólo superada por los operadores de asignación), a +menudo es necesario agregar paréntesis fuera de las expresiones condicionales. Por ejemplo, cuando se usa una expresión +condicional como operando de una expresión aritmética, los paréntesis tendrán diferentes efectos en el resultado:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +resultado = 10 * (signo {\textless} 0 ? -1 : 1) \# el resultado es -10 ó 10} + +{\selectlanguage{spanish}\ttfamily +resultado = 10 * signo {\textless} 0 ? -1 : 1 \# el resultado es -1 ó 1} + + +\bigskip + +\foreignlanguage{spanish}{El resultado de la primera expresión es correcto, y la segunda expresión toma +}\textstyleSourceText{\foreignlanguage{spanish}{10 * signo {\textless} 0}}\foreignlanguage{spanish}{ como condición a +juzgar, lo que no cumple con la expectativa de la expresión condicional como el operando derecho de la multiplicación.} + +\subsubsection[3.2.8 Operador de concatenación]{\foreignlanguage{spanish}{3.2.8 }\foreignlanguage{spanish}{Operador de +concatenación}} +\hypertarget{RefHeadingToc355773639824055}{}\paragraph[Operador +]{\foreignlanguage{spanish}{Operador +}\textstyleSourceText{\foreignlanguage{spanish}{+}}} +\hypertarget{RefHeadingToc355793639824055}{}\foreignlanguage{spanish}{Cuando los operandos izquierdo y derecho son +cadenas, el operador }\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{ se usa para conectar +las dos cadenas, y la nueva cadena obtenida es el valor de la expresión. Por lo tanto, este operador se usa a menudo +para la concatenación de cadenas:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +resultado ='abc' + '123' \# el resultado es 'abc123'} + + +\bigskip + +\foreignlanguage{spanish}{Los operadores }\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{ +también se pueden usar para conectar dos instancias de lista:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +resultado = [1, 2] + [3, 4] \# el resultado es [1, 2, 3, 4]} + + +\bigskip + +\foreignlanguage{spanish}{A diferencia del método +}\textstyleSourceText{\foreignlanguage{spanish}{list.push}}\foreignlanguage{spanish}{, el operador +}\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{ fusiona dos listas en un objeto de lista +más grande, con los elementos del operando izquierdo al principio de la lista de resultados y los elementos del +operando derecho al final de la lista de resultados} + +\paragraph[Operador ..]{\foreignlanguage{spanish}{Operador }\textstyleSourceText{\foreignlanguage{spanish}{..}}} +\hypertarget{RefHeadingToc355813639824055}{}\textstyleSourceText{\foreignlanguage{spanish}{..}}\foreignlanguage{spanish}{ +es un operador especial. Si el operando izquierdo es una cadena, el comportamiento de la expresión es concatenar los +operandos izquierdo y derecho en una nueva cadena (conversión automática si el operando derecho no es una cadena):} + +{\selectlanguage{spanish}\ttfamily +resultado ='abc' + 123 \# el resultado es 'abc123'} + +\foreignlanguage{spanish}{El operador }\textstyleSourceText{\foreignlanguage{spanish}{..}}\foreignlanguage{spanish}{ se +usa a menudo cuando se concatena una cadena y un valor que no es una cadena. Si el operando izquierdo es una instancia +de lista, el operador }\textstyleSourceText{\foreignlanguage{spanish}{..}}\foreignlanguage{spanish}{ agregará el +operando derecho al final de la lista y luego usará esta lista como el valor de la expresión:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +resultado ='abc' + 123 \# el resultado es 'abc123'} + + +\bigskip + +\foreignlanguage{spanish}{Este proceso modificará directamente el operando izquierdo, que es muy similar al método +}\textstyleSourceText{\foreignlanguage{spanish}{push}}\foreignlanguage{spanish}{ de +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ (excepto las cadenas que son objetos +inmutables). La operación de unión de la lista se puede ejecutar en cadena:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +resultado = [1, 2] .. 3 .. 4 \# el resultado es [1, 2, 3, 4]} + + +\bigskip + +{\selectlanguage{spanish} +Todos los valores en este proceso se agregarán al objeto de lista más a la izquierda.} + +\foreignlanguage{spanish}{Si los operandos izquierdo y derecho son enteros, utilice el operador +}\textstyleSourceText{\foreignlanguage{spanish}{..}}\foreignlanguage{spanish}{ para obtener un objeto de rango de +enteros:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +resultado = 1 .. 10 \# el resultado es (1..10)} + + +\bigskip + +{\selectlanguage{spanish} +Este objeto se utiliza para representar un intervalo cerrado de enteros, donde el operando izquierdo es el límite +inferior y el operando derecho es el límite superior. Dichos objetos de rango de enteros se utilizan a menudo para la +iteración.} + +\clearpage\section{Capítulo 4: Declaración} +\hypertarget{RefHeadingToc355833639824055}{} +\bigskip + +{\selectlanguage{spanish} +Berry es un lenguaje de programación imperativo. Este paradigma asume que los programas se ejecutan paso a paso. +Normalmente, las declaraciones de Berry se ejecutan secuencialmente, y esta estructura de programa se denomina +estructura secuencial. Aunque la estructura de la secuencia es muy básica, las estructuras de rama y las estructuras de +bucle se utilizan normalmente en los programas reales. Berry proporciona varias declaraciones de control para realizar +esta compleja estructura de flujo, como declaraciones condicionales y declaraciones de iteración.} + +\foreignlanguage{spanish}{A excepción de los comentarios de línea, los retornos de carro o los saltos de línea +({\textquotedbl}}\textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}r}}\foreignlanguage{spanish}{{\textquotedbl} +y +{\textquotedbl}}\textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}n}}\foreignlanguage{spanish}{{\textquotedbl}) +solo se usan como caracteres en blanco, por lo que las declaraciones se pueden escribir en líneas. Además, puede +escribir varias declaraciones en la misma línea.} + +{\selectlanguage{spanish} +Puede agregar un punto y coma al final de la declaración para indicar el final de la declaración, pero el intérprete +generalmente puede dividir la declaración automáticamente sin usar un punto y coma. Puede usar punto y coma para +decirle al intérprete cómo analizar el código para el código que será ambiguo. Sin embargo, es mejor no escribir código +ambiguo.} + +\subsection[4.1 Sentencia simple]{\selectlanguage{spanish} 4.1 Sentencia simple} +\hypertarget{RefHeadingToc355853639824055}{}\subsubsection[4.1.1 Declaración de expresión]{\selectlanguage{spanish} +4.1.1 Declaración de expresión} +\hypertarget{RefHeadingToc355873639824055}{}\foreignlanguage{spanish}{Las declaraciones de expresión son principalmente +declaraciones compuestas de expresiones de asignación o expresiones de llamada de función. Otras expresiones también +pueden formar Sentencias, pero no tienen significado. Por ejemplo, la expresión +}\textstyleSourceText{\foreignlanguage{spanish}{1+2}}\foreignlanguage{spanish}{ es una Sentencia escrita sola, pero no +tiene ningún efecto. Las siguientes rutinas dan ejemplos de sentencias de expresión y sentencias de función:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +a = 1 \# \ Declaración de asignación} + +{\selectlanguage{spanish}\ttfamily +print(a) \# \ Declaración de llamada} + + +\bigskip + +\foreignlanguage{spanish}{La línea 1 es una declaración de asignación simple que asigna el valor literal +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ a la variable +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{. La declaración en la línea 2 es una +declaración de llamada de función, que imprime el valor de la variable 'a' llamando a la función 'imprimir'.} + +{\selectlanguage{spanish} +Las expresiones de líneas cruzadas se escriben de la misma manera que las expresiones de una sola línea y no se +requieren símbolos especiales de continuación de línea. P.ej:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +a = 1 +} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ func() \# Ajustar línea} + + +\bigskip + +{\selectlanguage{spanish} +También puede escribir varias declaraciones de expresión en una línea y varios tipos de declaraciones se pueden escribir +en una línea. Este ejemplo pone dos declaraciones de expresión en la misma línea:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = 1 c = 2 \# \ sentencias múltiples} + + +\bigskip + +{\selectlanguage{spanish} +A veces el programador quiere escribir dos declaraciones, pero el intérprete puede pensar erróneamente que es una +declaración. Este problema es causado por la ambigüedad en el proceso de análisis gramatical. Tome este código como +ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +a = c} + +{\selectlanguage{spanish}\ttfamily +(b) = 1 \# \ Considérese como una llamada de función} + + +\bigskip + +\foreignlanguage{spanish}{Supongamos que las líneas 1 y 2 están destinadas a ser dos Sentencias de expresión: +}\textstyleSourceText{\foreignlanguage{spanish}{a = c}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{(b) = 1}}\foreignlanguage{spanish}{, pero el intérprete las +interpretará como una Sentencia: }\textstyleSourceText{\foreignlanguage{spanish}{a = c(b) = +1}}\foreignlanguage{spanish}{. La causa de este problema es que el intérprete analiza incorrectamente +}\textstyleSourceText{\foreignlanguage{spanish}{c}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{(b)}}\foreignlanguage{spanish}{ en llamadas de función. Para evitar +ambigüedades, podemos agregar un punto y coma al final de la declaración para separar claramente la declaración:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +a = c; (b) = 1;} + + +\bigskip + +{\selectlanguage{spanish} +Una mejor manera es no usar paréntesis en el lado izquierdo del número de tarea. Obviamente, no hay razón para usar +paréntesis aquí. En circunstancias normales, las expresiones complejas no deberían aparecer en el lado izquierdo del +operador de asignación, sino solo expresiones simples compuestas de nombres de variables, expresiones de operación de +dominio y expresiones de operación de subíndice:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +a = c b = 1} + + +\bigskip + +{\selectlanguage{spanish} +Usar expresiones simples solo en el lado izquierdo del signo de asignación no causará ambigüedad en la segmentación de +Sentencias. Por lo tanto, en la mayoría de los casos, no es necesario usar punto y coma para separar expresiones y no +recomendamos esta forma de escritura.} + +\subsubsection[4.1.2 Bloque]{\selectlanguage{spanish} 4.1.2 Bloque} +\hypertarget{RefHeadingToc355893639824055}{}\foreignlanguage{spanish}{Un +}\foreignlanguage{spanish}{\textbf{Bloque}}\foreignlanguage{spanish}{ es una colección de varias Sentencias. Un bloque +es un alcance, por lo que solo se puede acceder a las variables definidas en el bloque dentro del bloque y sus +sub-bloques. Hay muchos lugares donde se utilizan bloques, como declaraciones +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{, declaraciones +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{, declaraciones de funciones, etc. +Estas declaraciones contendrán un bloque a través de un par de palabras clave. Por ejemplo, el bloque utilizado en la +sentencia }\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +if isOpen} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ close()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('el dispositivo fue cerrado')} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Las sentencias en las líneas 2 a 3 constituyen un bloque, que se intercala entre el par de +palabras clave }\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{ (la expresión condicional de la +sentencia en }\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ no está en el bloque). No +es necesario que el bloque contenga declaraciones, lo que constituye un bloque vacío, o se puede decir que es un bloque +que contiene una declaración vacía. En términos generales, cualquier cantidad de Sentencias consecutivas puede llamarse +bloque, pero preferimos }\foreignlanguage{spanish}{expandir el alcance del bloque tanto como sea posible, lo que puede +garantizar que el área del bloque sea consistente con el alcance del alcance. En el ejemplo anterior, tendemos a pensar +que las filas 2 a 3 son un bloque completo, que es el rango más grande entre las palabras clave +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{.} + +\paragraph[Declaración do]{\foreignlanguage{spanish}{Declaración }\textstyleSourceText{\foreignlanguage{spanish}{do}}} +\hypertarget{RefHeadingToc355913639824055}{}\foreignlanguage{spanish}{A veces solo queremos abrir un nuevo ámbito, pero +no queremos usar ninguna declaración de control. En este caso, podemos usar la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{do}}\foreignlanguage{spanish}{ para encapsular el bloque, entonces la +sentencia no tiene función de control. La Sentencia tiene la forma:} + +\textstyleSourceText{\foreignlanguage{spanish}{do}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{end}} + +\foreignlanguage{spanish}{Entre ellos }\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ está el +bloque que necesitamos. Esta instrucción utiliza un par de palabras clave +}\textstyleSourceText{\foreignlanguage{spanish}{do}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{ para contener bloques. La declaración +no tiene función de control, ni genera ninguna instrucción de tiempo de ejecución.} + +\subsection[4.2 Sentencia condicional]{\selectlanguage{spanish} 4.2 Sentencia condicional} +\hypertarget{RefHeadingToc355933639824055}{}\foreignlanguage{spanish}{Berry proporciona sentencias +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ para realizar la función de ejecución de +control condicional. Este tipo de estructura de programa generalmente se denomina estructura de rama +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{. La declaración determinará la rama de +ejecución basada en la expresión condicional verdadera +(}\textstyleSourceText{\foreignlanguage{spanish}{true}}\foreignlanguage{spanish}{) o falsa +(}\textstyleSourceText{\foreignlanguage{spanish}{false}}\foreignlanguage{spanish}{). En algunos lenguajes, existen +otras opciones para implementar el control condicional. Por ejemplo, los lenguajes como C y C++ proporcionan sentencias +}\textstyleSourceText{\foreignlanguage{spanish}{switch}}\foreignlanguage{spanish}{, pero para simplificar el diseño, +Berry no admite sentencias }\textstyleSourceText{\foreignlanguage{spanish}{switch}}\foreignlanguage{spanish}{.} + +\subsubsection[4.2.1 Declaración if]{\foreignlanguage{spanish}{4.2.1 }\foreignlanguage{spanish}{Declaración +}\textstyleSourceText{\foreignlanguage{spanish}{if}}} +\hypertarget{RefHeadingToc355953639824055}{}\foreignlanguage{spanish}{La instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ se utiliza para implementar la +estructura de rama, que selecciona la rama del programa de acuerdo con el verdadero o falso de una determinada +condición de juicio. La sentencia también puede incluir la rama +}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{ o la rama +}\textstyleSourceText{\foreignlanguage{spanish}{elif}}\foreignlanguage{spanish}{. La forma simple de declaración +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ sin ramas es} + +\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ ~~ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{end}} + +\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ es una expresión condicional. Cuando el valor de +*}\foreignlanguage{spanish}{\textit{condición}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{, se ejecutará +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ en la segunda línea; de lo contrario, se omitirá +el }\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ y se ejecutará la instrucción que sigue a +}\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{. En el caso de que se ejecute +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{, después de que se ejecute la última declaración +en el bloque, dejará la declaración }\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ y +comenzará a ejecutar la declaración que sigue a +}\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{Aquí hay un ejemplo para ilustrar el uso de la sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +if 8 \% 2 == 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('este número es par')} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Este código se usa para juzgar si el número '8' es par y, si lo es, generará 'este número es +par'. Aunque este ejemplo es muy simple, es suficiente para ilustrar el uso básico de las Sentencias +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{Si desea tener una rama correspondiente para la ejecución cuando la condición se cumple y +}\foreignlanguage{spanish}{no se cumple, use la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ con la rama +}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{. La forma de la Sentencia es:} + +\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ ~~ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{end}} + +\foreignlanguage{spanish}{A diferencia de la simple instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{, la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{if else}}\foreignlanguage{spanish}{ ejecutará +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ en la rama +}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{ cuando el valor de +}\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ sea +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{. No importa qué rama se ejecute bajo +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{, después de que se ejecute la última declaración +en el bloque, aparecerá la declaración }\textstyleSourceText{\foreignlanguage{spanish}{if +else}}\foreignlanguage{spanish}{, es decir, se ejecutará la declaración después de +}\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{. En otras palabras, no importa si el +valor de }\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{, se ejecutará un +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +Continúe usando el juicio de paridad como ejemplo, esta vez cambie la demanda para generar la información +correspondiente de acuerdo con la paridad del número de entrada. El código para lograr este requisito es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +if x \% 2 == 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('este número es par')} + +{\selectlanguage{spanish}\ttfamily +else} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('este número es impar')} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Antes de ejecutar este código, primero debemos asignar un valor entero a la variable +}\textstyleSourceText{\foreignlanguage{spanish}{x}}\foreignlanguage{spanish}{, que es el número cuya paridad queremos +comprobar. Si 'x' es un número par, el programa generará 'este número es par'; de lo contrario, generará 'este número +es impar'. A veces necesitamos anidar declaraciones +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{. Una forma es anidar una instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ debajo de la rama +}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{. Este es un requisito muy común porque +muchas condiciones deben juzgarse consecutivamente. Para este tipo de demanda, use la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{if else}}\foreignlanguage{spanish}{ para escribir:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +if expr} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ bloque} + +{\selectlanguage{spanish}\ttfamily +else} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ if expr} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ bloque} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Obviamente, esta forma de escribir aumentará el nivel de sangría del código, y es más +engorroso usar múltiples }\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{ al final. Como +mejora, Berry proporciona la rama }\textstyleSourceText{\foreignlanguage{spanish}{elif}}\foreignlanguage{spanish}{ para +optimizar la escritura anterior. Usar la rama +}\textstyleSourceText{\foreignlanguage{spanish}{elif}}\foreignlanguage{spanish}{ es equivalente al código anterior, en +la forma} + +\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{elif}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{end}} + +\foreignlanguage{spanish}{La rama debe usarse después de la rama +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ y antes de la rama, y la rama +}\textstyleSourceText{\foreignlanguage{spanish}{elif}}\foreignlanguage{spanish}{ se puede usar varias veces seguidas. +Si se cumple la }\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ correspondiente a la rama +}\textstyleSourceText{\foreignlanguage{spanish}{elif}}\foreignlanguage{spanish}{, se ejecutará el +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ debajo de la rama. La ramificación +}\textstyleSourceText{\foreignlanguage{spanish}{elif}}\foreignlanguage{spanish}{ es adecuada para situaciones que +requieren que se juzguen múltiples condiciones en secuencia.} + +\foreignlanguage{spanish}{Usamos un fragmento de código que juzga positivo, negativo y 0 para demostrar la rama +}\textstyleSourceText{\foreignlanguage{spanish}{elif}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +if x{\textgreater} 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('positivo')} + +{\selectlanguage{spanish}\ttfamily +elif x == 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('cero')} + +{\selectlanguage{spanish}\ttfamily +else} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('negativo')} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Aquí también, la variable +}\textstyleSourceText{\foreignlanguage{spanish}{x}}\foreignlanguage{spanish}{ debe asignarse primero. Este código es +muy simple y no será explicado.} + +\foreignlanguage{spanish}{Algunos lenguajes tienen un problema llamado +{\textquotedbl}}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{{\textquotedbl} +colgante, que se refiere a cuando una Sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ está anidada dentro de otra Sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{, ¿a dónde pertenece la rama +}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{? Es un problema con la sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{. Cuando usamos C/C++, debemos considerar +el problema de colgar }\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{. Para evitar la +ambigüedad en el problema de }\textstyleSourceText{\foreignlanguage{spanish}{if else}}\foreignlanguage{spanish}{, los +programadores de C/C++ a menudo usan llaves para convertir una rama en un bloque. En Berry, la rama de la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ debe ser un bloque, lo que también +determina que Berry no tiene el problema de sobresalir por +}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{.} + +\subsection[4.3 Declaración de iteración]{\selectlanguage{spanish} 4.3 Declaración de iteración} +\hypertarget{RefHeadingToc355973639824055}{}\foreignlanguage{spanish}{Las declaraciones iterativas también se denominan +declaraciones de bucle, que se utilizan para repetir ciertas operaciones hasta que se cumple la condición de +terminación. Berry proporciona las declaraciones +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{, dos declaraciones de iteración. Muchos +lenguajes también proporcionan estas dos declaraciones para la iteración. La declaración +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ de Berry es similar a la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ en C/C++, pero la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ de Berry solo se usa para recorrer los +elementos en el contenedor, similar a la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{foreach}}\foreignlanguage{spanish}{ proporcionada por algunos lenguajes +y la que se introdujo por el nuevo estilo en C++11 de +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{. No se admite la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ de estilo C.} + +\subsubsection[4.3.2 Sentencia while]{\foreignlanguage{spanish}{4.3.2 }\foreignlanguage{spanish}{Sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{while}}} +\hypertarget{RefHeadingToc355993639824055}{}\foreignlanguage{spanish}{La declaración +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ es una declaración iterativa básica. +La instrucción }\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ utiliza una condición +de juicio. Cuando la condición es verdadera, el cuerpo del ciclo se ejecuta repetidamente; de lo contrario, el ciclo +finaliza. El patrón de la declaración es} + +\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ ~~ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{end}} + +\foreignlanguage{spanish}{Cuando el programa ejecuta la sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{, comprobará si la expresión +}\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ es verdadera o falsa. Si es cierto, ejecuta el +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ del cuerpo del ciclo; de lo contrario, finaliza +el ciclo. Después de ejecutar la última declaración en +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{, el programa saltará al comienzo de la +declaración }\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ y comenzará la siguiente +ronda de detección. Si la expresión de }\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ es +falsa cuando se evalúa por primera vez, el }\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ del +cuerpo del bucle no se ejecutará en absoluto (al igual que la expresión de +}\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ de la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ es falsa). En términos generales, el +valor de la expresión }\foreignlanguage{spanish}{\textbf{condición}}\foreignlanguage{spanish}{ debería poder cambiar +durante el ciclo, en lugar de ser una constante o una variable modificada fuera del ciclo, lo que hará que el ciclo no +se ejecute o no termine. Un bucle que nunca termina se llama bucle sin fin. Por lo general, esperamos que el ciclo se +ejecute un número específico de veces y luego termine. Por ejemplo, cuando usamos el bucle +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ para acceder a todos los elementos de +la matriz, esperamos que el número de ejecuciones del bucle sea igual a la longitud de la matriz, por ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +i = 0} + +{\selectlanguage{spanish}\ttfamily +l = ['a','b','c']} + +{\selectlanguage{spanish}\ttfamily +while i {\textless} l.size()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print(l[i])} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ i = i + 1} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Este bucle obtiene los elementos del arreglo +}\textstyleSourceText{\foreignlanguage{spanish}{l}}\foreignlanguage{spanish}{ y los imprime. Usamos una variable +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ como contador de bucles e índice de +matriz. Dejamos que el valor de }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ alcance +la longitud de la matriz }\textstyleSourceText{\foreignlanguage{spanish}{l}}\foreignlanguage{spanish}{ para finalizar +el bucle. En la última línea del cuerpo del bucle, añadimos +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{ al valor de +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ para asegurar que se acceda al siguiente +elemento de la matriz en el siguiente bucle, y el bucle +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ finaliza cuando el número de bucles +alcanza la longitud de la matriz.} + +\subsubsection[4.3.2 Sentencia for]{\foreignlanguage{spanish}{4.3.2 }\foreignlanguage{spanish}{Sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{for}}} +\hypertarget{RefHeadingToc356013639824055}{}\foreignlanguage{spanish}{La instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ de Berry se usa para recorrer los +elementos en el contenedor, y su forma es} + +\textstyleSourceText{\foreignlanguage{spanish}{for +}}\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{:}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{expresión}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{end}} + +\foreignlanguage{spanish}{\textbf{expresión}}\foreignlanguage{spanish}{ El valor de la expresión debe ser un contenedor +iterable o una función, como la clase +}\textstyleSourceText{\foreignlanguage{spanish}{range}}\foreignlanguage{spanish}{. La declaración obtiene un iterador +del contenedor y obtiene un elemento en el contenedor cada vez que se llama al iterador.} + +\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ se denomina variable de iteración, que siempre se +define en la instrucción }\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{. Por lo tanto, +}\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ debe ser un nombre de variable y no una +expresión. El elemento contenedor obtenido del iterador en cada bucle se asignará a la variable de iteración. Este +proceso ocurre antes de la primera declaración en +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La declaración }\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ +verificará si hay elementos no visitados en el iterador para la iteración. Si los hay, comenzará la siguiente +iteración; de lo contrario, finalizará la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ y ejecutará la declaración que sigue a +}\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{. Actualmente, Berry solo proporciona +iteradores de solo lectura, lo que significa que los elementos del contenedor no se pueden modificar a través de las +variables de iteración en la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{El alcance de la variable de iteración +}\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ se limita al +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ del cuerpo del ciclo, y la variable no tendrá +ninguna relación con la variable con el mismo nombre fuera del alcance. Para ilustrar este punto, usemos un ejemplo +para ilustrar. En este ejemplo, usamos la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ para acceder a todos los elementos en +la instancia }\textstyleSourceText{\foreignlanguage{spanish}{range}}\foreignlanguage{spanish}{ e imprimirlos. Por +supuesto, también usamos este ejemplo para demostrar el alcance de las variables de bucle.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +i = {\textquotedbl}Hola, estoy bien{\textquotedbl}. \# Variable exterior} + +{\selectlanguage{spanish}\ttfamily +for i: 0 .. 2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print(i) \# \ variable de iteración} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +print(i)} + + +\bigskip + +\foreignlanguage{spanish}{En este ejemplo, en relación con la variable de iteración +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ definida en la línea 2, la variable +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ definida en la línea 1 es una variable +externa. Al ejecutar este ejemplo obtendrá el siguiente resultado:} + +\textstyleSourceText{\foreignlanguage{spanish}{0 1 2 Hola, estoy bien}} + +\foreignlanguage{spanish}{Se puede ver que la variable de iteración +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ y la variable externa +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ son dos variables diferentes. Solo tienen +el mismo nombre pero diferentes alcances.} + +\paragraph[Principio de enunciado for]{\foreignlanguage{spanish}{Principio de enunciado +}\textstyleSourceText{\foreignlanguage{spanish}{for}}} +\hypertarget{RefHeadingToc356033639824055}{}\foreignlanguage{spanish}{A diferencia de la sentencia iterativa tradicional +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{, la sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ utiliza iteradores para atravesar el +contenedor. Si necesita usar la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ para atravesar una clase personalizada, +debe comprender su mecanismo de implementación. Cuando se usa la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{, el intérprete oculta muchos detalles +de implementación. De hecho, para dicho código:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +for i: 0 .. 2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print(i)} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +{\selectlanguage{spanish} +Será traducido al siguiente código equivalente por el intérprete:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +var it = \_\_iterator\_\_(0 .. 2)} + +{\selectlanguage{spanish}\ttfamily +try} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ while true} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ var i = it()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ print(i)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +except 'stop\_iteration'} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \# \ no hacer nada} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Hasta cierto punto, la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ es solo un azúcar sintáctico, y es +esencialmente solo una forma simple de escribir una pieza de código complejo. En este código equivalente se usa una +variable intermedia }\textstyleSourceText{\foreignlanguage{spanish}{it}}\foreignlanguage{spanish}{. El valor de la +variable es un iterador y, en este ejemplo, es un iterador del contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{range}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{0..2}}\foreignlanguage{spanish}{. Al procesar la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{, el intérprete oculta la variable +intermedia del iterador, por lo que no se puede acceder a ella en el código.} + +\foreignlanguage{spanish}{El parámetro de la función +}\textstyleSourceText{\foreignlanguage{spanish}{\_\_iterator\_\_}}\foreignlanguage{spanish}{ es un contenedor y la +función devuelve un iterador de parámetros. Esta función obtiene el iterador llamando al método de parámetro. Por lo +tanto, si el valor de retorno del método +}\textstyleSourceText{\foreignlanguage{spanish}{iter}}\foreignlanguage{spanish}{ es un tipo de instancia +(}\textstyleSourceText{\foreignlanguage{spanish}{instance}}\foreignlanguage{spanish}{), esta instancia debe tener un +método }\textstyleSourceText{\foreignlanguage{spanish}{next}}\foreignlanguage{spanish}{ y un método +}\textstyleSourceText{\foreignlanguage{spanish}{hasnext}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{El parámetro de la función +}\textstyleSourceText{\foreignlanguage{spanish}{\_\_hasnext\_\_}}\foreignlanguage{spanish}{ es un iterador, que +comprueba si el iterador tiene el siguiente elemento llamando al método +}\textstyleSourceText{\foreignlanguage{spanish}{hasnext}}\foreignlanguage{spanish}{ del iterador +}\textstyleSourceText{\foreignlanguage{spanish}{hasnext}}\foreignlanguage{spanish}{ El valor de retorno del método es +de tipo }\textstyleSourceText{\foreignlanguage{spanish}{booleano}}\foreignlanguage{spanish}{. El parámetro de la +función }\textstyleSourceText{\foreignlanguage{spanish}{\_\_next\_\_}}\foreignlanguage{spanish}{ también es un +iterador, que obtiene el siguiente elemento en el iterador llamando al método +}\textstyleSourceText{\foreignlanguage{spanish}{next}}\foreignlanguage{spanish}{ del iterador.} + +\foreignlanguage{spanish}{Hasta ahora, las funciones +}\textstyleSourceText{\foreignlanguage{spanish}{\_\_iterator\_\_}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{\_\_hasnext\_\_}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{\_\_next\_\_}}\foreignlanguage{spanish}{ simplemente llaman a algunos +métodos del contenedor o iterador y luego devuelven el valor de retorno de estos métodos. Por lo tanto, la escritura +equivalente de la instrucción }\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ también +se puede simplificar de esta forma:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +do} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var it = (0 .. 2).iter()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ while (it.hasnext())} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ var i = it.next()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ print(i)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Este código es más fácil de leer. Se puede ver en el código que el alcance de la variable +iteradora }\textstyleSourceText{\foreignlanguage{spanish}{it}}\foreignlanguage{spanish}{ es la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ completa, pero no es visible fuera de +la declaración }\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{, mientras que el alcance +de la variable de iteración }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ está en el +cuerpo del bucle, por lo que cada iteración definirá nuevas variables de iteración.} + +\subsection[4.4 Declaración de salto]{\selectlanguage{spanish} 4.4 Declaración de salto} +\hypertarget{RefHeadingToc356053639824055}{}\foreignlanguage{spanish}{La declaración de salto proporcionada por Berry se +usa para realizar el salto del flujo del programa en el proceso de bucle. Las sentencias de salto se dividen en +sentencias de {\textquotedbl}ruptura{\textquotedbl} y sentencias de {\textquotedbl}continuación{\textquotedbl}. Estas +dos declaraciones deben usarse dentro de declaraciones iterativas y solo pueden usarse dentro de funciones para saltar. +Algunos lenguajes proporcionan sentencias +}\textstyleSourceText{\foreignlanguage{spanish}{goto}}\foreignlanguage{spanish}{ para realizar saltos arbitrarios +dentro de las funciones, que Berry no proporciona, pero los efectos de las sentencias +}\textstyleSourceText{\foreignlanguage{spanish}{goto}}\foreignlanguage{spanish}{ se pueden reemplazar por sentencias +condicionales y sentencias de iteración.} + +\subsection[4.4.1 Declaración break]{\foreignlanguage{spanish}{4.4.1 }\foreignlanguage{spanish}{Declaración +}\textstyleSourceText{\foreignlanguage{spanish}{break}}} +\hypertarget{RefHeadingToc356073639824055}{}\textstyleSourceText{\foreignlanguage{spanish}{break}}\foreignlanguage{spanish}{ +se usa para terminar la declaración de iteración y saltar. Después de la ejecución de la sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{break}}\foreignlanguage{spanish}{, el nivel más cercano de la sentencia +de iteración terminará inmediatamente y la ejecución continuará desde la posición de la primera sentencia después de la +sentencia de iteración. Para ilustrar el flujo de ejecución de la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{break}}\foreignlanguage{spanish}{, usamos un ejemplo para demostrarlo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +while true} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('antes del break')} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ break} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('después del break')} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +print('fuera del bucle')} + + +\bigskip + +\foreignlanguage{spanish}{En este código, la sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{break}}\foreignlanguage{spanish}{ está en un bucle +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{. Antes y después de la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{break}}\foreignlanguage{spanish}{ y después de la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{, hemos colocado una declaración de +impresión para probar el flujo de ejecución del programa. El resultado de este código es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +antes del break} + +{\selectlanguage{spanish}\ttfamily +fuera del bucle} + + +\bigskip + +\foreignlanguage{spanish}{Esto muestra que la sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{ finaliza el bucle en la posición de +la sentencia }\textstyleSourceText{\foreignlanguage{spanish}{break}}\foreignlanguage{spanish}{ en la tercera línea y el +programa continúa ejecutándose desde la sexta línea.} + +\subsubsection[4.4.2 Declaración continue]{\foreignlanguage{spanish}{4.4.2 }\foreignlanguage{spanish}{Declaración +}\textstyleSourceText{\foreignlanguage{spanish}{continue}}} +\hypertarget{RefHeadingToc356093639824055}{}\foreignlanguage{spanish}{Esta declaración también se usa dentro de una +declaración de iteración. Su función es }\foreignlanguage{spanish}{finalizar una iteración e iniciar inmediatamente la +siguiente ronda. Por lo tanto, después de la ejecución de la sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{continue}}\foreignlanguage{spanish}{, el código restante en la +sentencia de iteración de la capa más cercana ya no se ejecutará, pero comenzará una nueva ronda de iteración. Aquí +usamos una sentencia }\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ para demostrar la +función de la sentencia }\textstyleSourceText{\foreignlanguage{spanish}{continue}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +for i: 0 .. 5} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ if i {\textgreater}= 2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ continue} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print('i =', i)} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +print('fuera del bucle')} + + +\bigskip + +\foreignlanguage{spanish}{Aquí, la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ iterará 6 veces. Cuando la variable de +iteración }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ es mayor o igual que +}\textstyleSourceText{\foreignlanguage{spanish}{2}}\foreignlanguage{spanish}{, se ejecutará la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{continue}}\foreignlanguage{spanish}{ en la línea 3, y la declaración de +impresión en la línea 5 no se ejecutará a partir de entonces. En otras palabras, la línea 5 solo se ejecutará en las +dos primeras iteraciones (en este momento }\textstyleSourceText{\foreignlanguage{spanish}{i {\textless} +2}}\foreignlanguage{spanish}{). El resultado de ejecución de esta rutina es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +i = 0} + +{\selectlanguage{spanish}\ttfamily +i = 1} + +{\selectlanguage{spanish}\ttfamily +fuera del bucle} + + +\bigskip + +\foreignlanguage{spanish}{Se puede ver que el valor de la variable +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ solo se imprime dos veces, lo cual está +en línea con las expectativas. Los lectores pueden intentar imprimir el valor de la variable +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ antes de la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{continue}}\foreignlanguage{spanish}{. Encontrará que la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ itera 6 veces, lo que indica que la +declaración }\textstyleSourceText{\foreignlanguage{spanish}{continue}}\foreignlanguage{spanish}{ no finaliza la +iteración.} + +\subsection[4.5 Declaración import]{\foreignlanguage{spanish}{4.5 }\foreignlanguage{spanish}{Declaración +}\textstyleSourceText{\foreignlanguage{spanish}{import}}} +\hypertarget{RefHeadingToc356113639824055}{}\foreignlanguage{spanish}{Berry tiene algunos módulos predefinidos, como el +módulo }\textstyleSourceText{\foreignlanguage{spanish}{math}}\foreignlanguage{spanish}{ para cálculos matemáticos. +Estos módulos no se pueden usar directamente, sino que se deben importar con la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{import}}\foreignlanguage{spanish}{. Hay dos formas de importar un +módulo:} + +\textstyleSourceText{\foreignlanguage{spanish}{import}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{nombre}} + +\textstyleSourceText{\foreignlanguage{spanish}{import}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{nombre}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{as}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{variable}} + +\foreignlanguage{spanish}{\textbf{nombre}}\foreignlanguage{spanish}{ Para importar el nombre del módulo, al usar el +primer método de escritura para importar el módulo, el módulo importado se puede llamar directamente usando el nombre +del módulo. La segunda forma de escribir es importar un módulo llamado +}\foreignlanguage{spanish}{\textbf{nombre}}\foreignlanguage{spanish}{ y modificar el nombre del módulo al llamarlo a +}\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{. Por ejemplo, un módulo llamado +}\textstyleSourceText{\foreignlanguage{spanish}{math}}\foreignlanguage{spanish}{, usamos el primer método para importar +y usar:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +import math} + +{\selectlanguage{spanish}\ttfamily +math.sin(0)} + + +\bigskip + +\foreignlanguage{spanish}{Aquí usa directamente +}\textstyleSourceText{\foreignlanguage{spanish}{math}}\foreignlanguage{spanish}{ para llamar al módulo. Si el nombre de +un módulo es relativamente largo y no es conveniente escribirlo, puede usar la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{import as}}\foreignlanguage{spanish}{. Aquí, asuma un módulo llamado +}\textstyleSourceText{\foreignlanguage{spanish}{hardware}}\foreignlanguage{spanish}{. Queremos llamar a la función +}\textstyleSourceText{\foreignlanguage{spanish}{setled}}\foreignlanguage{spanish}{ del +}\foreignlanguage{spanish}{módulo, podemos importar el +}\textstyleSourceText{\foreignlanguage{spanish}{hardware}}\foreignlanguage{spanish}{ del módulo a la variable llamada +}\textstyleSourceText{\foreignlanguage{spanish}{hw}}\foreignlanguage{spanish}{ y usar:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +import hardware as hw} + +{\selectlanguage{spanish}\ttfamily +hw.setled(true)} + + +\bigskip + +\foreignlanguage{spanish}{Para encontrar módulos, todas las rutas en +}\textstyleSourceText{\foreignlanguage{spanish}{sys.path()}}\foreignlanguage{spanish}{ se exploran secuencialmente. Si +desea agregar una ruta específica antes de la importación (como leer desde la tarjeta SD), puede usar la siguiente +función de ayuda:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def push\_path(p)} + +{\selectlanguage{spanish}\ttfamily +\ \ import sys} + +{\selectlanguage{spanish}\ttfamily +\ \ var path = sys.path()} + +{\selectlanguage{spanish}\ttfamily +\ \ if path.find(p) == nil \ \# agregar solo si aún no está allí} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ path.push(p)} + +{\selectlanguage{spanish}\ttfamily +\ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + +\subsection[4.6 Manejo de excepciones]{\selectlanguage{spanish} 4.6 Manejo de excepciones} +\hypertarget{RefHeadingToc356133639824055}{}{\selectlanguage{spanish} +El mecanismo permite que el programa capture y maneje las excepciones que ocurren durante el tiempo de ejecución. Berry +admite un mecanismo de captura de excepciones que permite separar el proceso de captura y manejo de excepciones. Es +decir, parte del programa se usa para detectar y recopilar excepciones, y la otra parte del programa se usa para +manejar excepciones.} + +{\selectlanguage{spanish} +En primer lugar, el programa problemático necesita lanzar primero una excepción. Cuando estos programas están en un +bloque de manejo de excepciones, un programa específico atrapará y manejará la excepción.} + +\subsubsection[4.6.1 Generar una excepción]{\selectlanguage{spanish} 4.6.1 Generar una excepción} +\hypertarget{RefHeadingToc356153639824055}{}\foreignlanguage{spanish}{El uso de la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{raise}}\foreignlanguage{spanish}{ genera una excepción +}\textstyleSourceText{\foreignlanguage{spanish}{raise}}\foreignlanguage{spanish}{. La declaración pasará un valor para +indicar el tipo de excepción para que pueda ser identificada por un manejador de excepciones específico. A continuación +se explica cómo utilizar la sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{raise}}\foreignlanguage{spanish}{:} + +\textstyleSourceText{\foreignlanguage{spanish}{raise}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{excepción}} + +\textstyleSourceText{\foreignlanguage{spanish}{raise}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{excepción}}\textstyleSourceText{\foreignlanguage{spanish}{, +}}\foreignlanguage{spanish}{\textbf{mensaje}} + +{\selectlanguage{spanish} +El valor de la expresión \textbf{excepción} son los \textbf{valores atípicos} arrojados; la expresión de +\textbf{mensaje} opcional suele ser una cadena que describe la información de la excepción, y esta expresión se +denomina \textbf{parámetro anómalo}. Berry permite que cualquier valor se use como un valor anormal, por ejemplo, una +cadena se puede usar como un valor anormal:} + +{\selectlanguage{spanish}\ttfamily +raise 'mi\_error','un ejemplo de subida'} + +\foreignlanguage{spanish}{Después de que el programa se ejecute en la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{raise}}\foreignlanguage{spanish}{, no continuará ejecutando las +declaraciones que le siguen, sino que saltará al bloque de manejo de excepciones más cercano. Si el bloque de manejo de +excepciones más reciente está en otras funciones, las funciones a lo largo de la cadena de llamadas se cerrarán antes. +Si no hay un bloque de manejo de excepciones, se producirá una }\foreignlanguage{spanish}{\textbf{salida +anormal}}\foreignlanguage{spanish}{ y el intérprete imprimirá el mensaje de error de la excepción y la pila de llamadas +de la ubicación del error. Cuando la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{raise}}\foreignlanguage{spanish}{ está en el bloque de instrucciones +}\textstyleSourceText{\foreignlanguage{spanish}{try}}\foreignlanguage{spanish}{, la excepción será capturada por este +último. La }\foreignlanguage{spanish}{excepción capturada será manejada por el bloque +}\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{ asociado con el bloque +}\textstyleSourceText{\foreignlanguage{spanish}{try}}\foreignlanguage{spanish}{. Si la excepción lanzada puede ser +manejada por el bloque 'except', la ejecución de este bloque continuará desde la declaración después del último bloque +}\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{. Si ninguna de las sentencias +}\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{ pueden manejar la excepción, la +excepción se volverá a generar hasta que se pueda manejar o la excepción finalice.} + +\paragraph[Valores atípicos]{\selectlanguage{spanish} Valores atípicos} +\hypertarget{RefHeadingToc356173639824055}{}{\selectlanguage{spanish} +En Berry, puede usar cualquier valor como valor atípico, pero generalmente usamos cadenas cortas. Berry también puede +lanzar algunas excepciones internamente. Llamamos a estas excepciones \textbf{Excepción estándar}. Todos los valores de +excepción estándar son de tipo cadena.} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Valores atípicos} & +\centering{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Descripción del parámetro}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Valores atípicos} & +\centering{\selectlanguage{spanish}\bfseries Descripción} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Descripción del parámetro}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{5.1080003cm}m{5.1080003cm}m{5.1080003cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{assert\_failed}} & +\centering{\selectlanguage{spanish} Afirmación fallida} & +\centering\arraybslash{\selectlanguage{spanish} Información sobre excepciones específicas}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{index\_error}} & +\centering{\selectlanguage{spanish} (generalmente fuera de los límites)} & +\centering\arraybslash{\selectlanguage{spanish} Información sobre excepciones específicas}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{io\_error}} & +\centering{\selectlanguage{spanish} Mal funcionamiento de E/S} & +\centering\arraybslash{\selectlanguage{spanish} Información sobre excepciones específicas}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{key\_error}} & +\centering{\selectlanguage{spanish} Error clave} & +\centering\arraybslash{\selectlanguage{spanish} Información sobre excepciones específicas}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{runtime\_error}} & +\centering{\selectlanguage{spanish} Excepción de tiempo de ejecución de máquina virtual} & +\centering\arraybslash{\selectlanguage{spanish} Información sobre excepciones específicas}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{stop\_iteration}} & +\centering{\selectlanguage{spanish} Fin del iterador} & +\centering\arraybslash{\selectlanguage{spanish} no}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{syntax\_error}} & +\centering{\selectlanguage{spanish} Error de sintaxis} & +~ +\\ +\centering{\selectlanguage{spanish} por el compilador} & +~ + & +~ +\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{unrealized\_error}} & +\centering{\selectlanguage{spanish} Función no realizada} & +\centering\arraybslash{\selectlanguage{spanish} Información sobre excepciones específicas}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{tipe\_error}} & +\centering{\selectlanguage{spanish} Error de tipo} & +\centering\arraybslash{\selectlanguage{spanish} Información sobre excepciones específicas}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 8: Lista de excepciones estándar} + + +\bigskip + +\subsubsection[4.6.2 Capturar excepciones]{\selectlanguage{spanish} 4.6.2 Capturar excepciones} +\hypertarget{RefHeadingToc356193639824055}{}\foreignlanguage{spanish}{Utilice la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{ para detectar excepciones. Debe +estar emparejado con la sentencia }\textstyleSourceText{\foreignlanguage{spanish}{try}}\foreignlanguage{spanish}{, es +decir, un bloque de sentencia }\textstyleSourceText{\foreignlanguage{spanish}{try}}\foreignlanguage{spanish}{ debe ir +seguido de uno o más bloques de sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{. La forma básica de la Sentencia +}\textstyleSourceText{\foreignlanguage{spanish}{try-except}}\foreignlanguage{spanish}{ es} + +\foreignlanguage{spanish}{{\textasciigrave}{\textasciigrave}try}\textstyleSourceText{\foreignlanguage{spanish}{**bloque**}}\foreignlanguage{spanish}{except{\textasciigrave} +}\foreignlanguage{spanish}{\textbf{...}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ ~~{\textasciigrave}end{\textasciigrave}} + +\foreignlanguage{spanish}{La rama }\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{ +puede tener las siguientes formas} + +\textstyleSourceText{\foreignlanguage{spanish}{except ..}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{except +}}\foreignlanguage{spanish}{\textbf{excepciones}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{except +}}\foreignlanguage{spanish}{\textbf{excepciones}}\textstyleSourceText{\foreignlanguage{spanish}{as}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{except +}}\foreignlanguage{spanish}{\textbf{excepciones}}\textstyleSourceText{\foreignlanguage{spanish}{as}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{, }}\foreignlanguage{spanish}{** mensaje** +}\textstyleSourceText{\foreignlanguage{spanish}{except .. as +}}\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{except .. as +}}\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{, }}\foreignlanguage{spanish}{\textbf{mensaje}} + +\foreignlanguage{spanish}{La instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{ más básica no usa parámetros, esta +rama }\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{ capturará todas las +excepciones; }\foreignlanguage{spanish}{\textbf{Lista de excepciones de captura}}\foreignlanguage{spanish}{: +}\foreignlanguage{spanish}{\textbf{excepciones}}\foreignlanguage{spanish}{ es una lista de valores atípicos +}\foreignlanguage{spanish}{que pueden coincidir con la correspondiente rama +}\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{, que se utiliza entre varios valores +de la lista Separados por comas; }\foreignlanguage{spanish}{\textbf{variable}}\foreignlanguage{spanish}{ es +}\foreignlanguage{spanish}{\textbf{variable anormal}}\foreignlanguage{spanish}{, si la rama detecta una excepción, el +valor atípico se vinculará a la variable; }\foreignlanguage{spanish}{\textbf{mensaje}}\foreignlanguage{spanish}{ es +}\foreignlanguage{spanish}{\textbf{Variable de parámetro anómalo}}\foreignlanguage{spanish}{, si la rama detecta una +excepción, el valor del parámetro anómalo se vinculará a la variable.} + +\foreignlanguage{spanish}{Cuando se detecta una excepción en el bloque de instrucciones +}\textstyleSourceText{\foreignlanguage{spanish}{try}}\foreignlanguage{spanish}{, el intérprete verificará la rama +}\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{ una por una. Si el valor de la +excepción existe en la lista de captura de una rama, se llamará al bloque de código debajo de la rama para manejar la +excepción, y la declaración }\textstyleSourceText{\foreignlanguage{spanish}{try-except}}\foreignlanguage{spanish}{ +completa se cerrará después de que se ejecute el bloque de código. Si ninguna de las ramas +}\textstyleSourceText{\foreignlanguage{spanish}{except}}\foreignlanguage{spanish}{ coinciden, el controlador de +excepciones externo volverá a lanzar y capturar y manejar la excepción.} + +\clearpage\section[Capítulo 5: Funciones]{Capítulo 5: \foreignlanguage{spanish}{Funcion}\foreignlanguage{spanish}{es}} +\hypertarget{RefHeadingToc356213639824055}{} +\bigskip + +{\selectlanguage{spanish} +Una \textbf{función} es una {\textquotedbl}subrutina{\textquotedbl} que puede ser llamada por un código externo. Como +parte del programa, la función en sí también es una pieza de código. Una función puede tener 0 o más parámetros y +devolverá un resultado, que se denomina \textbf{valor de retorno} de la función.} + +{\selectlanguage{spanish} +En Berry, la función es un \textbf{valor de primera clase}. Por lo tanto, además de llamar a funciones, también puede +pasar funciones como valores, por ejemplo, vincular funciones a variables, usar funciones como valores devueltos, etc.} + +\subsection[5.1 Información básica]{\selectlanguage{spanish} 5.1 Información básica} +\hypertarget{RefHeadingToc356233639824055}{}\foreignlanguage{spanish}{El uso de funciones incluye dos partes: definición +de función y llamada. La declaración de definición de función usa la palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{def}}\foreignlanguage{spanish}{ como el comienzo. La definición de la +función es el proceso de empaquetar y nombrar el código del cuerpo de la función. Este proceso solo genera la +estructura de la función y no ejecuta la función. La función de ejecución debe usar un +}\foreignlanguage{spanish}{\textbf{operador de llamada}}\foreignlanguage{spanish}{, que es un par de paréntesis. El +operador de llamada actúa sobre una expresión cuyo resultado es un tipo de función. Los parámetros que se pasan a la +función se escriben entre paréntesis y los parámetros múltiples se separan con comas. El resultado de la expresión de +llamada es el valor de retorno de la función.} + +\subsubsection[5.1.1 Definición de funciones]{\selectlanguage{spanish} 5.1.1 Definición de funciones} +\hypertarget{RefHeadingToc356253639824055}{}\paragraph[Función con nombre]{\selectlanguage{spanish} Función con nombre} +\hypertarget{RefHeadingToc356273639824055}{}\foreignlanguage{spanish}{Una }\foreignlanguage{spanish}{\textbf{función con +nombre}}\foreignlanguage{spanish}{ es una función a la que se le da un nombre cuando se define. Su declaración de +definición consta de las siguientes partes: palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{def}}\foreignlanguage{spanish}{, nombre de funcion, lista que constan +de 0 a múltiples parámetros y cuerpo de función, múltiples parámetros en la lista de parámetros están separados por +comas, y todos los parámetros están escritos en un par de paréntesis. Llamamos al parámetro cuando la función se define +como }\foreignlanguage{spanish}{\textbf{Parámetros formales}}\foreignlanguage{spanish}{, y al parámetro cuando llamamos +a la función como }\foreignlanguage{spanish}{\textbf{Argumentos}}\foreignlanguage{spanish}{. La forma general de la +definición de la función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{}'def' name ´(´ argumentos ´)´} + +{\selectlanguage{spanish}\ttfamily +\ \ bloque} + +{\selectlanguage{spanish}\ttfamily +´end'} + + +\bigskip + +\foreignlanguage{spanish}{El nombre de función }\foreignlanguage{spanish}{\textbf{nombre}}\foreignlanguage{spanish}{ es +un identificador; }\foreignlanguage{spanish}{\textbf{argumentos}}\foreignlanguage{spanish}{ es la lista de parámetros +formales; }\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{ es el cuerpo de la función. Si el +cuerpo de la función es una declaración vacía, la función se denomina {\textquotedbl}función vacía{\textquotedbl}. La +declaración del valor de retorno de la función está contenida en el cuerpo de la función. Si no hay declaración de +devolución en }\foreignlanguage{spanish}{\textbf{bloque}}\foreignlanguage{spanish}{, la función devolverá +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ por defecto. El nombre de la función es +en realidad el nombre de la variable del objeto de la función vinculada. Si el nombre ya existe en el ámbito actual, +definir la función equivale a vincular el objeto de función a esta variable.} + +\foreignlanguage{spanish}{El siguiente ejemplo define una función llamada +}\textstyleSourceText{\foreignlanguage{spanish}{add}}\foreignlanguage{spanish}{. La función de este ejemplo es sumar +dos números y devolver el resultado.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def add(a, b)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return a + b} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{La función }\textstyleSourceText{\foreignlanguage{spanish}{add}}\foreignlanguage{spanish}{ +tiene dos parámetros }\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{b}}\foreignlanguage{spanish}{, y los dos sumandos se pasan a la función +a través de estos parámetros para el cálculo. La instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ devuelve el resultado del cálculo.} + +{\selectlanguage{spanish} +Una función como atributo de clase se llama método. Esta parte del contenido se explicará en el capítulo orientado a +objetos.} + +\paragraph[Función anónima]{\selectlanguage{spanish} Función anónima} +\hypertarget{RefHeadingToc356293639824055}{}{\selectlanguage{spanish} +A diferencia de las funciones con nombre, la \textbf{función anónima} no tiene nombre y su expresión de definición tiene +la forma:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +´def' ´(´ argumentos ´)´} + +{\selectlanguage{spanish}\ttfamily +\ \ bloque} + +{\selectlanguage{spanish}\ttfamily +´end'} + + +\bigskip + +{\selectlanguage{spanish} +Se puede ver que, en comparación con las funciones con nombre, no hay un \textbf{nombre} de función en su definición.. +La definición de una función anónima es esencialmente una expresión, que se denomina \textbf{Función literal}. Para +usar funciones anónimas podemos vincular el valor literal de la función a una variable:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +add = def (a, b)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return a + b} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{La función de este código es exactamente la misma que la función +}\textstyleSourceText{\foreignlanguage{spanish}{add}}\foreignlanguage{spanish}{ en la sección anterior. Se puede usar +una función anónima para pasar convenientemente el valor de la función como un valor literal. Al igual que otros tipos +de literales, los literales de función también son la unidad de expresión más pequeña. Por lo tanto, lo que hay entre +las palabras clave }\textstyleSourceText{\foreignlanguage{spanish}{def}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{ es un todo indivisible.} + +\subsubsection[5.1.2 Llamada a Función]{\selectlanguage{spanish} 5.1.2 Llamada a Función} +\hypertarget{RefHeadingToc356313639824055}{}\foreignlanguage{spanish}{Tome la función +}\textstyleSourceText{\foreignlanguage{spanish}{add}}\foreignlanguage{spanish}{ como ejemplo. Para llamar a esta +función, debe proporcionar dos valores y puede obtener la suma de los dos números llamando a la función:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +res = add(5, 3)} + +{\selectlanguage{spanish}\ttfamily +print(res) \# 8} + + +\bigskip + +\foreignlanguage{spanish}{Llamamos a la función llamada (la función +}\textstyleSourceText{\foreignlanguage{spanish}{add}}\foreignlanguage{spanish}{ en el ejemplo) como +}\foreignlanguage{spanish}{\textbf{Función llamada}}\foreignlanguage{spanish}{, y la función que llama a la función +llamada (la función }\textstyleSourceText{\foreignlanguage{spanish}{principal}}\foreignlanguage{spanish}{ en el +ejemplo) como }\foreignlanguage{spanish}{\textbf{Función clave}}\foreignlanguage{spanish}{. El proceso de llamada de +función es el siguiente: Primero, el intérprete (implícitamente) inicializará la lista de parámetros formales de la +función llamada con la lista de argumentos y, al mismo tiempo, suspenderá la función de llamada y guardará su estado, +luego creará un entorno para la función llamada y ejecutará la función llamada.} + +\foreignlanguage{spanish}{La función finalizará su ejecución cuando encuentre la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ y pase el valor de +}\foreignlanguage{spanish}{retorno a la función que llama. El intérprete destruirá el entorno de la función llamada +después de que regrese la función llamada, luego restaurará el entorno de la función que llama y continuará ejecutando +la función que llama. El valor de retorno de la función también es el resultado de la expresión de la llamada a la +función. El siguiente ejemplo define una función +}\textstyleSourceText{\foreignlanguage{spanish}{cuadrado}}\foreignlanguage{spanish}{ y vincula esta función a una +variable }\textstyleSourceText{\foreignlanguage{spanish}{f}}\foreignlanguage{spanish}{, y luego llama a la función +}\textstyleSourceText{\foreignlanguage{spanish}{cuadrado}}\foreignlanguage{spanish}{ a través de la variable +}\textstyleSourceText{\foreignlanguage{spanish}{f}}\foreignlanguage{spanish}{. Este uso es similar a los punteros de +función en lenguaje C.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def cuadrado(n)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return n * n} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +f = cuadrado} + +{\selectlanguage{spanish}\ttfamily +print(f(5)) \# 25} + + +\bigskip + +{\selectlanguage{spanish} +Cabe señalar que el objeto de la función solo está vinculado a estas variables (consulte la sección Capitulo-3: Operador +de asignación} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +f = cuadrado} + +{\selectlanguage{spanish}\ttfamily +cuadrado = nil} + +{\selectlanguage{spanish}\ttfamily +print(f(5)) \# 25} + + +\bigskip + +\foreignlanguage{spanish}{Se puede ver que la función todavía se puede llamar normalmente después de reasignar +}\textstyleSourceText{\foreignlanguage{spanish}{cuadrado}}\foreignlanguage{spanish}{. Solo después de que el objeto de +función ya no esté vinculado a ninguna variable, se perderá y el sistema reciclará los recursos ocupados por este tipo +de objeto de función.} + +\paragraph[Desviar la llamada]{\selectlanguage{spanish} Desviar la llamada} +\hypertarget{RefHeadingToc356333639824055}{}{\selectlanguage{spanish} +La llamada de la función debe estar en el ámbito de la variable de función, por lo que normalmente no se puede llamar +antes de que se defina la función. Para resolver este problema, puede utilizar este método para comprometer:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +var func1} + +{\selectlanguage{spanish}\ttfamily +def func2(x)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return func1(x)} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +def func1(x)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return x * x} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +print(func2(4)) \# 16} + + +\bigskip + +\foreignlanguage{spanish}{En este ejemplo, +}\textstyleSourceText{\foreignlanguage{spanish}{func2}}\foreignlanguage{spanish}{ llama a +}\textstyleSourceText{\foreignlanguage{spanish}{func1}}\foreignlanguage{spanish}{, pero la función +}\textstyleSourceText{\foreignlanguage{spanish}{func1}}\foreignlanguage{spanish}{ se define después de +}\textstyleSourceText{\foreignlanguage{spanish}{func2}}\foreignlanguage{spanish}{. Después de ejecutar este código, el +programa generará el resultado correcto }\textstyleSourceText{\foreignlanguage{spanish}{16}}\foreignlanguage{spanish}{. +Esta rutina utiliza el mecanismo de que no se llamará a la función cuando se defina. Defina la variable +}\textstyleSourceText{\foreignlanguage{spanish}{func1}}\foreignlanguage{spanish}{ antes de definir +}\textstyleSourceText{\foreignlanguage{spanish}{func2}}\foreignlanguage{spanish}{ para asegurarse de que el símbolo +}\textstyleSourceText{\foreignlanguage{spanish}{func1}}\foreignlanguage{spanish}{ no se encontrará durante la +compilación. Luego definimos la función +}\textstyleSourceText{\foreignlanguage{spanish}{func1}}\foreignlanguage{spanish}{ después de +}\textstyleSourceText{\foreignlanguage{spanish}{func2}}\foreignlanguage{spanish}{ para que la función se use para +sobrescribir el valor de la variable }\textstyleSourceText{\foreignlanguage{spanish}{func1}}\foreignlanguage{spanish}{. +Cuando se llama a la función }\textstyleSourceText{\foreignlanguage{spanish}{func2}}\foreignlanguage{spanish}{ en la +última línea }\textstyleSourceText{\foreignlanguage{spanish}{print(func2(4))}}\foreignlanguage{spanish}{, la variable +}\textstyleSourceText{\foreignlanguage{spanish}{func1}}\foreignlanguage{spanish}{ ya es la función que necesitamos, por +lo que se mostrará el resultado correcto.} + +\paragraph[Llamada recursiva]{\selectlanguage{spanish} Llamada recursiva} +\hypertarget{RefHeadingToc356353639824055}{}{\selectlanguage{spanish} +Con \textbf{función recursiva} se refiere a funciones que se llaman a sí mismas directa o indirectamente. La +recursividad se refiere a una estrategia que divide el problema en subproblemas similares y luego los resuelve. Tomando +el factorial como ejemplo, la definición recursiva de factorial es 0! = 1, \textit{n}! = \textit{n} ${\cdot}$ +(\textit{n}$-$1)!. Entonces podemos escribir la función recursiva para calcular el factorial según la definición:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def fact(n)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ if n == 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return n * fact(n-1)} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Tome el factorial de 5 como ejemplo, el proceso de calcular manualmente el factorial de 5 es: +¡5! = 5 {\texttimes} 4 {\texttimes} 3 {\texttimes} 2 {\texttimes} 1 = 120. El resultado de llamar a la función +}\textstyleSourceText{\foreignlanguage{spanish}{fact}}\foreignlanguage{spanish}{ también es 120:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +print(fact(5)) \# 120} + + +\bigskip + +\foreignlanguage{spanish}{Para garantizar que la profundidad de la llamada recursiva sea limitada (un nivel de +recursividad demasiado profundo agotará el espacio de la pila), la función recursiva debe tener una condición de +finalización. En }\textstyleSourceText{\foreignlanguage{spanish}{fact}}\foreignlanguage{spanish}{ la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{if}}\foreignlanguage{spanish}{ en la segunda línea de la definición de +la función se usa para detectar la condición final, y el proceso recursivo finaliza cuando +}\textstyleSourceText{\foreignlanguage{spanish}{n}}\foreignlanguage{spanish}{ se calcula como +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. La fórmula factorial anterior no se +aplica a parámetros no enteros. Ejecutar una expresión como +}\textstyleSourceText{\foreignlanguage{spanish}{fact(5.1)}}\foreignlanguage{spanish}{ provocará un error de +desbordamiento de pila debido a la imposibilidad de finalizar la recursividad.} + +\foreignlanguage{spanish}{Existe otra situación, la }\textstyleSourceText{\foreignlanguage{spanish}{Recurrencia +indirecta}}\foreignlanguage{spanish}{, es decir, la función no es llamada por sí misma sino por otra función (directa o +indirectamente) llamada por ella. La recursividad indirecta generalmente requiere el uso de técnicas de llamada de +función hacia adelante. Tome las funciones +}\textstyleSourceText{\foreignlanguage{spanish}{es\_impar}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{es\_par}}\foreignlanguage{spanish}{ para calcular números pares e +impares como ejemplos:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +var es\_impar} + +{\selectlanguage{spanish}\ttfamily +def es\_par(n)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ if n == 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return true} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return es\_impar(n-1)} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +def es\_impar(n)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ if n == 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return false} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return es\_par(n-1)} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Estas dos funciones se llaman entre sí. Para garantizar que este nombre esté en el alcance +cuando se llama a la función }\textstyleSourceText{\foreignlanguage{spanish}{es\_impar}}\foreignlanguage{spanish}{ en +la línea 6, la variable }\textstyleSourceText{\foreignlanguage{spanish}{es\_impar}}\foreignlanguage{spanish}{ se define +en la línea 1.} + +\paragraph[Llamada de función anónima]{\selectlanguage{spanish} Llamada de función anónima} +\hypertarget{RefHeadingToc356373639824055}{}{\selectlanguage{spanish} +Si una función anónima solo se llamará una vez, la forma más fácil es llamarla cuando esté definida, por ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +res = def (a, b) return a + b end (1, 2) \# 3} + + +\bigskip + +{\selectlanguage{spanish} +En esta rutina, usamos la expresión de llamada directamente después del literal de función para llamar a la función. +Este uso es muy adecuado para funciones que solo se llamarán en un lugar.} + +{\selectlanguage{spanish} +También puede vincular una función anónima a una variable y llamarla:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +add = def (a, b) return a + b end} + +{\selectlanguage{spanish}\ttfamily +res = add(1, 2) \# 3} + + +\bigskip + +{\selectlanguage{spanish} +Este uso es similar a la llamada de una función con nombre, esencialmente llamando a la variable vinculada al valor de +la función. Cabe señalar que es más difícil realizar llamadas recursivas a funciones anónimas, a menos que utilice +técnicas de llamada de reenvío.} + +\subsubsection[5.1.3 Parámetros formales y reales]{\selectlanguage{spanish} 5.1.3 Parámetros formales y reales} +\hypertarget{RefHeadingToc356393639824055}{}\foreignlanguage{spanish}{La función utiliza parámetros reales para +inicializar los parámetros formales cuando se llama. En circunstancias normales, el parámetro real y el parámetro de +forma son iguales y las posiciones se corresponden entre sí, pero Berry también permite que el parámetro real sea +diferente del parámetro formal: si el parámetro real es mayor que el parámetro formal, el parámetro real adicional al +parámetro será descartado. De otra forma los parámetros formales restantes se inicializarán a +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{El proceso de paso de parámetros es similar a la operación de asignación. Para los tipos +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{boolean}}\foreignlanguage{spanish}{ y numéricos, el paso de parámetros +es por valor, mientras que otros tipos son por referencia. Para el tipo de referencia de paso de escritura, como una +instancia, modificarlos en la función llamada también modificará el objeto en la función de llamada. El siguiente +ejemplo demuestra esta función:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +var l = [], i = 0} + +{\selectlanguage{spanish}\ttfamily +def func(a, b)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ a.push(1)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ b ='cadena'} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +func(l, i)} + +{\selectlanguage{spanish}\ttfamily +print(l, i) \# [1] 0} + + +\bigskip + +\foreignlanguage{spanish}{Se puede ver que el valor de la variable +}\textstyleSourceText{\foreignlanguage{spanish}{l}}\foreignlanguage{spanish}{ ha cambiado después de llamar a la +función }\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{, pero el valor de la variable +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ no ha cambiado.} + +\subsubsection[Función con número variable de argumentos (vararg)]{\selectlanguage{spanish} Función con número variable +de argumentos (vararg)} +\hypertarget{RefHeadingToc356413639824055}{}\foreignlanguage{spanish}{Puede definir una función para tomar cualquier +número arbitrario de argumentos e iterarlos. Por ejemplo, +}\textstyleSourceText{\foreignlanguage{spanish}{print()}}\foreignlanguage{spanish}{ toma cualquier cantidad de +argumentos e imprime cada uno de ellos separados por espacios. Debe definir el último argumento como una captura de +todos los }\foreignlanguage{spanish}{argumentos usando +}\textstyleSourceText{\foreignlanguage{spanish}{*}}\foreignlanguage{spanish}{ antes de su nombre.} + +\foreignlanguage{spanish}{Todos los argumentos que siguen a los argumentos formales se agrupan en tiempo de ejecución en +una instancia de }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{. Si no se capturan +argumentos, la lista está vacía.} + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def f(a, b, *c) return size(c) end} + +{\selectlanguage{spanish}\ttfamily +f(1,2) \# devuelve 0, c is []} + +{\selectlanguage{spanish}\ttfamily +f(1,2,3) \# devuelve 1, c is [3]} + +{\selectlanguage{spanish}\ttfamily +f(1,2,3,4) \# devuelve 2, c is [3,4]} + +\subsubsection[Llamar a una función con un número dinámico de argumentos]{\selectlanguage{spanish} Llamar a una función +con un número dinámico de argumentos} +\hypertarget{RefHeadingToc356433639824055}{}\foreignlanguage{spanish}{La sintaxis de Berry solo permite llamar con un +número fijo de argumentos. Utilice la función }\textstyleSourceText{\foreignlanguage{spanish}{call(f, +[args])}}\foreignlanguage{spanish}{ para pasar cualquier número de argumentos arbitrario.} + +\foreignlanguage{spanish}{Puede agregar estáticamente cualquier número de argumentos a +}\textstyleSourceText{\foreignlanguage{spanish}{call()}}\foreignlanguage{spanish}{. Si el último argumento es una +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{, se expande automáticamente a +argumentos discretos.} + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def f(a,b) return nil end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +call(f,1) \ \ \ \ \ \ \ \# llama a f(1)} + +{\selectlanguage{spanish}\ttfamily +call(f,1,2) \ \ \ \ \ \# llama a f(1,2)} + +{\selectlanguage{spanish}\ttfamily +call(f,1,2,3) \ \ \ \# llama a f(1,2,3), el último argumento es ignorado por f} + +{\selectlanguage{spanish}\ttfamily +call(f,1,[2,3]) \ \# llama a f(1,2,3), el último argumento es ignorado por f} + +{\selectlanguage{spanish}\ttfamily +call(f,[1,2]) \ \ \ \# llama a f(1,2)} + +{\selectlanguage{spanish}\ttfamily +call(f,[]) \ \ \ \ \ \ \# llama a f()} + + +\bigskip + +\foreignlanguage{spanish}{Puede combinar +}\textstyleSourceText{\foreignlanguage{spanish}{call}}\foreignlanguage{spanish}{ y vararg. Por ejemplo, creemos una +función que actúe como }\textstyleSourceText{\foreignlanguage{spanish}{print()}}\foreignlanguage{spanish}{ pero +convierta todos los argumentos a mayúsculas.} + +{\selectlanguage{spanish} +Ejemplo completo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def print\_upper(*a) \# toma un número arbitrario de argumentos, args es una lista} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ import string} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ for i:0..size(a)-1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ if type(a[i]) == 'string'} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ a[i] = string.toupper(a[i])} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ call(print, a) \# \ llama a print con todos los argumentos} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +print\_upper({\textquotedbl}a{\textquotedbl},1,{\textquotedbl}Foo{\textquotedbl},{\textquotedbl}Bar{\textquotedbl}) \ \# +imprime: A 1 FOO BAR} + +\subsubsection[5.1.4 Funciones y variables locales]{\selectlanguage{spanish} 5.1.4 Funciones y variables locales} +\hypertarget{RefHeadingToc356453639824055}{}{\selectlanguage{spanish} +El cuerpo de la función en sí es un ámbito, por lo que las variables definidas en la función son todas variables +locales. A diferencia de los bloques directamente anidados, cada vez que se llama a una función, se asigna espacio para +las variables locales. El espacio para las variables locales se asigna en la pila y la información de asignación se +determina en el momento de la compilación, por lo que este proceso es muy rápido. Cuando se anidan varios niveles de +alcance en una función, el intérprete asigna espacio de pila para la cadena de anidamiento de alcance con la mayoría de +las variables locales, en lugar del número total de variables locales en la función.} + +\subsubsection[5.1.5 Declaración return]{\foreignlanguage{spanish}{5.1.5 }\foreignlanguage{spanish}{Declaración +}\textstyleSourceText{\foreignlanguage{spanish}{return}}} +\hypertarget{RefHeadingToc356473639824055}{}\foreignlanguage{spanish}{La declaración +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ se utiliza para devolver el +resultado de una función, es decir, el valor de retorno de la función. Todas las funciones en Berry tienen un valor de +retorno, pero no puede usar ninguna declaración +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ en el cuerpo de la función. En este +momento, el intérprete generará una declaración +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ predeterminada para garantizar que +la función regrese }\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{. Hay dos formas +de escribir Sentencias:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +´return'} + +{\selectlanguage{spanish}\ttfamily +´return' expresión} + + +\bigskip + +\foreignlanguage{spanish}{La primera forma de escribir es escribir solo la palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ y no la expresión que se devolverá. +En este caso, se devuelve el valor }\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ +predeterminado. La segunda forma de escribir es seguir la expresión +}\foreignlanguage{spanish}{\textbf{expresión}}\foreignlanguage{spanish}{ después de la palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{, y el valor de la expresión se usará +como valor de retorno de la función. Cuando el programa ejecuta la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{, la función que se está ejecutando +actualmente finalizará la ejecución y volverá al código que llamó a la función para continuar ejecutándose.} + +\foreignlanguage{spanish}{Cuando se usa una palabra clave separada +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ como declaración de retorno de una +función, es fácil causar ambigüedad. En ese caso se recomienda agregar un punto y coma después de +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ para evitar errores:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return;} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ x = 1} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{En este ejemplo, la declaración }\textstyleSourceText{\foreignlanguage{spanish}{x = +1}}\foreignlanguage{spanish}{ después de la declaración +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ no se ejecutará, por lo que es +redundante. Si se evita este tipo de código redundante, la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ suele ir seguida de palabras clave +como }\textstyleSourceText{\foreignlanguage{spanish}{end}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{else}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{elif}}\foreignlanguage{spanish}{. En este caso, incluso si se usa una +declaración }\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ por separado, no hay +necesidad de preocuparse por la ambigüedad.} + +\subsection[5.2 Cierre (closure)]{\selectlanguage{spanish} 5.2 Cierre (closure)} +\hypertarget{RefHeadingToc356493639824055}{}\subsubsection[5.2.1 Conceptos básicos]{\selectlanguage{spanish} 5.2.1 +Conceptos básicos} +\hypertarget{RefHeadingToc356513639824055}{}{\selectlanguage{spanish} +Como se mencionó anteriormente, las funciones son el primer tipo de valor en Berry. Puede definir funciones en cualquier +lugar y también puede pasar funciones como parámetros o devolver valores. Cuando se define otra función en una función, +la función anidada puede acceder a las variables locales de cualquier función externa. Llamamos a las +{\textquotedbl}variables locales de la función externa{\textquotedbl} utilizadas en la función la función como +\textbf{Variables libres}. Las variables libres generalizadas también incluyen variables globales, pero no existe tal +regla en Berry. El \textbf{Cierre} es una técnica que vincula funciones a \textbf{entornos}. El entorno es un mapeo que +asocia cada variable libre de una función con un valor. En términos de implementación, los cierres asocian el prototipo +de función con sus propias variables. Los prototipos de funciones se generan en tiempo de compilación y el entorno es +un concepto de tiempo de ejecución, por lo que los cierres también se generan dinámicamente en tiempo de ejecución. +Cada cierre vincula el prototipo de función al entorno cuando se genera, como se ve en el siguiente ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func(i) \# La función externa} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def foo() \# La función interna (closure)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ print(i)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ foo()} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{La función interna +}\textstyleSourceText{\foreignlanguage{spanish}{foo}}\foreignlanguage{spanish}{ es un cierre y tiene una variable libre +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{, que es un parámetro de la función +externa }\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{. Cuando se genera el cierre +}\textstyleSourceText{\foreignlanguage{spanish}{foo}}\foreignlanguage{spanish}{, su prototipo de función se vincula al +entorno que contiene la variable libre }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{. +Cuando la variable }\textstyleSourceText{\foreignlanguage{spanish}{foo}}\foreignlanguage{spanish}{ sale del alcance, el +cierre se destruirá. Por lo general, la función interna será el valor de retorno de la función externa, por ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func(i) \# La función externa} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return def () \# Devuelve un cierre (función anónima)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ print(i)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ i = i + 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{El cierre devuelto aquí es una función anónima. Cuando la función externa devuelve el cierre, +las variables locales de la función externa se destruirán y el cierre no podrá acceder directamente a las variables en +la función externa original. El sistema copiará el valor de la variable libre al entorno cuando se destruya la variable +libre. El ciclo de vida de estas variables libres es el mismo que el del cierre, y solo el cierre puede acceder a +ellas. La función o el cierre devuelto no se ejecutará automáticamente, por lo que debemos llamar al cierre devuelto +por la función }\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +f = func(0)} + +{\selectlanguage{spanish}\ttfamily +f()} + + +\bigskip + +\foreignlanguage{spanish}{Este código generará +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. Si continuamos llamando al cierre +}\textstyleSourceText{\foreignlanguage{spanish}{f}}\foreignlanguage{spanish}{, obtendremos la salida +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{2}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{3}}\foreignlanguage{spanish}{... Esto puede no entenderse bien: la +variable [2.198 ] se destruye después de que la función +}\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{ regresa , y como la variable libre del +cierre }\textstyleSourceText{\foreignlanguage{spanish}{f}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ se almacenará en el entorno de cierre, +por lo que cada vez que se llame a }\textstyleSourceText{\foreignlanguage{spanish}{f}}\foreignlanguage{spanish}{, el +valor de }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ se sumará a 1 (definición de la +función }\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{ línea 4).} + +\paragraph[Uso de cierres]{\selectlanguage{spanish} Uso de cierres} +\hypertarget{RefHeadingToc356533639824055}{}{\selectlanguage{spanish} +Los cierres tienen muchos usos. Aquí hay algunos usos comunes:} + +\subparagraph[Evaluación perezosa]{\selectlanguage{spanish} Evaluación perezosa} +\hypertarget{RefHeadingToc356553639824055}{}{\selectlanguage{spanish} +El cierre no hace nada hasta que se llama.} + +\subparagraph[Función de comunicación privada]{\selectlanguage{spanish} Función de comunicación privada} +\hypertarget{RefHeadingToc356573639824055}{}{\selectlanguage{spanish} +Puede permitir que algunos cierres compartan variables libres, que solo son visibles para estos cierres, y se comuniquen +entre funciones cambiando los valores de estas variables libres. Esto puede evitar el uso de variables externas.} + +\subparagraph[Generar múltiples funciones]{\selectlanguage{spanish} Generar múltiples funciones} +\hypertarget{RefHeadingToc356593639824055}{}{\selectlanguage{spanish} +A veces es posible que necesitemos usar múltiples funciones, estas funciones pueden tener solo diferentes valores de +algunas variables. Podemos implementar una función y luego usar estas diferentes variables como parámetros de función. +Una mejor manera es devolver el cierre a través de una función de fábrica y usar estas variables posiblemente +diferentes como variables libres del cierre, de modo que no siempre tenga que escribir esos parámetros al llamar a la +función, y cualquier número de funciones similares puede ser generado.} + +\subparagraph[Simular miembros privados]{\selectlanguage{spanish} Simular miembros privados} +\hypertarget{RefHeadingToc356613639824055}{}{\selectlanguage{spanish} +Algunos lenguajes admiten el uso de miembros privados en objetos, pero la clase de Berry no lo admite. Podemos usar las +variables libres de los cierres para simular miembros privados. Este uso no es la intención original de diseñar +cierres, pero hoy en día, este {\textquotedbl}mal uso{\textquotedbl} de los cierres es muy común.} + +\subparagraph[Resultado de caché]{\selectlanguage{spanish} Resultado de caché} +\hypertarget{RefHeadingToc356633639824055}{}{\selectlanguage{spanish} +Si hay una función que requiere mucho tiempo para ejecutarse, llevará mucho tiempo llamarla cada vez. Podemos almacenar +en caché el resultado de esta función, buscarlo en el caché antes de llamar a la función y devolver el valor almacenado +en caché si lo encuentra; de lo contrario, se llama a la función y se actualiza el valor almacenado en caché. Podemos +usar los cierres para guardar el valor almacenado en caché para que no quede expuesto al alcance externo, y el +resultado almacenado en caché se conservará (hasta que se destruya el cierre).} + +\subsubsection[5.2.2 Vinculación de variables libres]{\selectlanguage{spanish} 5.2.2 Vinculación de variables libres} +\hypertarget{RefHeadingToc356653639824055}{}{\selectlanguage{spanish} +Si varios cierres vinculan la misma variable libre, todos los cierres siempre compartirán esta variable libre. Por +ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func(i) \# La función externa} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return [\# Devuelve la lista de cierre} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ def () \# El cierre \#1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ print({\textquotedbl}cierre 1 log:{\textquotedbl}, i)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ i = i + 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ end,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ def () \# El cierre \#2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ print({\textquotedbl}cierre 2 log:{\textquotedbl}, i)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ i = i + 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ]} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{La función }\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{, +en este ejemplo, devuelve dos cierres a través de una lista, y estos dos cierres comparten la variable libres +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{. Si llamamos a estos cierres:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +f = func(0)} + +{\selectlanguage{spanish}\ttfamily +f[0]() \# cierre 1 log: 0} + +{\selectlanguage{spanish}\ttfamily +f[1]() \# cierre 2 log: 1} + + +\bigskip + +\foreignlanguage{spanish}{Como puede ver, actualizamos la variable libre +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ cuando llamamos al cierre +}\textstyleSourceText{\foreignlanguage{spanish}{f[0]}}\foreignlanguage{spanish}{, y este cambio afectó el resultado de +llamar al cierre }\textstyleSourceText{\foreignlanguage{spanish}{f[1]}}\foreignlanguage{spanish}{. Esto se debe a que +si varios cierres utilizan una variable libre, solo hay una copia de la variable libre y todos los cierres tienen una +referencia a la entidad de variable libre. Por lo tanto, cualquier modificación a la variable libre es visible para +todos los cierres que usan dicha variable.} + +{\selectlanguage{spanish} +De manera similar, antes de que se destruyan las variables locales de la función externa, modificar el valor de la +variable libre también afectará el cierre:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ i = 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def foo()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ print(i)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ i = 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return foo} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{En este ejemplo cambiamos el valor de la variable +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ (que es la variable libre del cierre +}\textstyleSourceText{\foreignlanguage{spanish}{foo}}\foreignlanguage{spanish}{) de +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{ a +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{ antes de que regrese la función externa +}\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{, luego llamamos al cierre, y después +el valor de la variable libre }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ cuando el +paquete }\textstyleSourceText{\foreignlanguage{spanish}{foo}}\foreignlanguage{spanish}{ también es +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +func()() \# 1} + +\subsubsection[5.2.3 Crear cierre en bucle]{\selectlanguage{spanish} 5.2.3 Crear cierre en bucle} +\hypertarget{RefHeadingToc356673639824055}{}\foreignlanguage{spanish}{Al construir un cierre en el cuerpo del ciclo, es +posible que no desee que las variables libres del cierre cambien con las variables del ciclo. Primero veamos un ejemplo +de cómo crear un cierre en un bucle }\textstyleSourceText{\foreignlanguage{spanish}{while}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ l = [] i = 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ while i {\textless}= 2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ l.push(def () print(i) end)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ i = i + 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return l} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{En este ejemplo, construimos un cierre en un ciclo y colocamos este cierre en una +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{. Obviamente, cuando finalice el +ciclo, el valor de la variable }\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ será +}\textstyleSourceText{\foreignlanguage{spanish}{3}}\foreignlanguage{spanish}{, y todos los cierres de la lista +}\textstyleSourceText{\foreignlanguage{spanish}{l}}\foreignlanguage{spanish}{ también son referencias usando esta +variable. Si ejecutamos el cierre devuelto por +}\textstyleSourceText{\foreignlanguage{spanish}{func}}\foreignlanguage{spanish}{ obtendremos el mismo resultado:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +res = func()} + +{\selectlanguage{spanish}\ttfamily +res[0]() \# 3} + +{\selectlanguage{spanish}\ttfamily +res[1]() \# 3} + +{\selectlanguage{spanish}\ttfamily +res[2]() \# 3} + + +\bigskip + +{\selectlanguage{spanish} +Si queremos que cada cierre se refiera a diferentes variables libres, podemos definir otra capa de funciones y luego +vincular las variables del ciclo actual con los parámetros de la función:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ l = [] i = 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ while i {\textless}= 2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ l.push(def (n)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ return def () print(n) end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ end (i))} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ i = i + 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return l} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +{\selectlanguage{spanish} +Para ayudar a entender este código aparentemente incomprensible, nos enfocaremos en el código de las líneas 4 a 6:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def (n)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return def ()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ print(n)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end (i)} + + +\bigskip + +\foreignlanguage{spanish}{Aquí realmente se define una función anónima y se llama inmediatamente. La función de esta +función anónima temporal es vincular el valor de la variable de bucle +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ a su parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{n}}\foreignlanguage{spanish}{, y la variable +}\textstyleSourceText{\foreignlanguage{spanish}{n}}\foreignlanguage{spanish}{ también es lo que necesitamos para cerrar +las variables libres del paquete, de modo que las las variables vinculadas al cierre construido durante cada ciclo son +diferentes. Ahora obtendremos la salida deseada:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +res = func()} + +{\selectlanguage{spanish}\ttfamily +res[0]() \# 0} + +{\selectlanguage{spanish}\ttfamily +res[1]() \# 1} + +{\selectlanguage{spanish}\ttfamily +res[2]() \# 2} + + +\bigskip + +{\selectlanguage{spanish} +Hay algunas formas de resolver el problema de las variables de bucle como variables libres. Una forma un poco más simple +es definir una variable temporal en el cuerpo del bucle:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ l = [] i = 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ while i {\textless}= 2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ temp = i} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ l.push(def () print(temp) end)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ i = i + 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return l} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Aquí }\textstyleSourceText{\foreignlanguage{spanish}{temp}}\foreignlanguage{spanish}{ es una +variable temporal. El alcance de esta variable está en el cuerpo del ciclo, por lo que se redefinirá cada vez que se +realice un ciclo. También podemos usar la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{ para resolver el problema:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def func()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ l = []} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ for i: 0 .. 2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ l.push(def () print(i) end)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return l} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Esta puede ser la forma más sencilla +de}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{. La variable de iteración de la +instrucción se creará en cada ciclo. El principio es similar al método anterior.} + +\subsection[5.3 Expresión lambda]{\selectlanguage{spanish} 5.3 Expresión lambda} +\hypertarget{RefHeadingToc356693639824055}{}{\selectlanguage{spanish} +La \textbf{Expresión lambda} es una función anónima especial. La expresión lambda se compone de una lista de parámetros +y un cuerpo de función, pero la forma es diferente de la función general:} + +{\selectlanguage{spanish}\ttfamily +´/´ args ´-{\textgreater}´ expr ´end'} + +{\selectlanguage{spanish} +\textbf{args} es la lista de parámetros, la cantidad de parámetros puede ser cero o más, y los parámetros múltiples +están separados por comas o espacios (no se pueden mezclar al mismo tiempo); \textbf{expr} es la expresión de retorno, +la expresión lambda devolverá el valor de la expresión. Las expresiones lambda son adecuadas para implementar funciones +muy simples. Por ejemplo, la expresión lambda para juzgar el tamaño de dos números es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/ a b -{\textgreater} a {\textless} b} + + +\bigskip + +{\selectlanguage{spanish} +Esto es más fácil que escribir una función con la misma funcionalidad. En algunos algoritmos generales de clasificación, +este tipo de función de comparación de tamaño puede necesitar un uso extensivo. El uso de expresiones lambda puede +simplificar el código y mejorar la legibilidad.} + +{\selectlanguage{spanish} +Al igual que las funciones generales, las expresiones lambda pueden formar cierres. Las expresiones lambda se llaman de +la misma manera que las funciones ordinarias. Si usa el método de llamada inmediata similar a las funciones anónimas:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +lambda = / a b -{\textgreater} a {\textless} b} + +{\selectlanguage{spanish}\ttfamily +result = lambda(1, 2) \# \ llamada normal} + +{\selectlanguage{spanish}\ttfamily +result = (/ a b -{\textgreater} a {\textless} b)(1, 2) \# \ llamada directa} + + +\bigskip + +{\selectlanguage{spanish} +Dado que el operador de llamada de función tiene una prioridad más alta, se debe agregar un par de paréntesis a la +expresión lambda cuando se realiza una llamada directa, para que se llame como un todo.} + +\clearpage\section{Capítulo 6: Funciones orientadas a objetos} +\hypertarget{RefHeadingToc356713639824055}{} +\bigskip + +\foreignlanguage{spanish}{Por consideraciones de optimización, Berry no consideró los tipos simples como objetos. Estos +tipos simples incluyen }\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{, numéricos, +booleanos y cadena. Pero Berry proporciona clases para implementar el mecanismo de objetos. Entre los tipos de datos +básicos de Berry, }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{range}}\foreignlanguage{spanish}{ son objetos de clase. Un objeto es +una colección que contiene datos y métodos, donde los datos se componen de algunas variables y los métodos son +funciones. El tipo de un objeto se denomina clase y la entidad de un objeto se denomina instancia.} + +\subsection[6.1 Clase e instancia]{\selectlanguage{spanish} 6.1 Clase e instancia} +\hypertarget{RefHeadingToc356733639824055}{}\subsubsection[6.1.1 Declaración de clase]{\selectlanguage{spanish} 6.1.1 +Declaración de clase} +\hypertarget{RefHeadingToc356753639824055}{}\foreignlanguage{spanish}{Para usar una clase, primero debe declararla. La +declaración de una clase comienza con la palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{class}}\foreignlanguage{spanish}{. Las variables miembro y los métodos +de la clase deben especificarse en la declaración. Este es un ejemplo de declaración de una clase:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class persona} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ static var mayor = 18} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var nombre, edad} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def init(nombre, edad)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.nombre = name} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.edad = edad} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def tostring()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return 'nombre: '+ str(self.nombre) + ', edad:' + str(self.edad)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def es\_adulto()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return self.edad {\textgreater}= self.mayor} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Las variables miembro de clase se declaran con la palabra clave +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{, mientras que los métodos miembro se +declaran con la palabra clave }\textstyleSourceText{\foreignlanguage{spanish}{def}}\foreignlanguage{spanish}{. +Actualmente, Berry no admite la inicialización de variables miembro en el momento de la definición, por lo que el +constructor debe realizar la inicialización de las variables miembro. Las propiedades de la clase no se pueden +modificar después de completar la declaración, por lo que la clase es un objeto de solo lectura.} + +\foreignlanguage{spanish}{Este diseño es para garantizar que la clase se pueda construir estáticamente en el lenguaje C +cuando se implemente el intérprete y se pueda usar la propiedad +}\textstyleSourceText{\foreignlanguage{spanish}{const}}\foreignlanguage{spanish}{ modificada para ahorrar RAM} + +{\selectlanguage{spanish} +La clase de Berry no admite restricciones de acceso y todas las propiedades de la clase son visibles desde el exterior. +En las clases nativas, puede usar algunos trucos para hacer que las propiedades sean invisibles para el código Berry +(por lo general, hacer que el nombre del miembro comience con un punto {\textquotedbl}.{\textquotedbl}). Puede usar +algunas convenciones para restringir el acceso a los miembros de la clase, como la convención de que los atributos que +comienzan con un guión bajo son atributos privados. Esta convención no tiene ningún uso a nivel gramatical, pero +favorece la estructura lógica del código.} + +\subsubsection[6.1.2 Instanciar]{\selectlanguage{spanish} 6.1.2 Instanciar} +\hypertarget{RefHeadingToc356773639824055}{}{\selectlanguage{spanish} +La clase en sí es solo una descripción abstracta. Tomando los autos como ejemplo, conozco el concepto de autos, y cuando +realmente queremos usar autos, necesitamos autos reales. El uso de las clases es similar. No solo usaremos esta +descripción abstracta, sino que necesitaremos producir un objeto concreto basado en esta descripción. Este proceso se +llama \textbf{Instanciación de la clase}, abreviado como instanciación, y el objeto concreto producido por la +instanciación se llama \textbf{Instancia}. La clase en sí no tiene datos, y la creación de instancias produce una +instancia basada en la información descrita por la clase y proporciona datos específicos a la instancia.} + +\subsubsection[6.1.3 Método y parámetros self]{\foreignlanguage{spanish}{6.1.3 }\foreignlanguage{spanish}{Método y +parámetros }\textstyleSourceText{\foreignlanguage{spanish}{self}}} +\hypertarget{RefHeadingToc356793639824055}{}\foreignlanguage{spanish}{Los métodos de clase son esencialmente funciones. +A diferencia de las funciones ordinarias, los métodos pasan implícitamente un parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{, y siempre es el primer parámetro, que +almacena una referencia a la instancia actual. Debido a la existencia de parámetros +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{, el número de parámetros del método +será uno más que el número de parámetros definidos en la declaración. Aquí usamos un ejemplo simple para demostrar:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class Test} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def metodo()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return self} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +objecto = Test()} + +{\selectlanguage{spanish}\ttfamily +print(objecto)} + +{\selectlanguage{spanish}\ttfamily +print(objecto.metodo())} + + +\bigskip + +\foreignlanguage{spanish}{Este ejemplo define una clase +}\textstyleSourceText{\foreignlanguage{spanish}{Test}}\foreignlanguage{spanish}{, que tiene un método +}\textstyleSourceText{\foreignlanguage{spanish}{metodo}}\foreignlanguage{spanish}{, que devuelve su parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{. Las dos últimas líneas de la rutina +imprimen el valor de la instancia 'objeto' de la clase +}\textstyleSourceText{\foreignlanguage{spanish}{Test}}\foreignlanguage{spanish}{ y el valor de retorno del método +'metodo' respectivamente. El resultado de ejecución de este ejemplo es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textless}instance: Test(){\textgreater}} + +{\selectlanguage{spanish}\ttfamily +{\textless}instance: Test(){\textgreater}} + + +\bigskip + +\foreignlanguage{spanish}{Se puede ver que el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{ del método y el nombre de la instancia +de uso (}\textstyleSourceText{\foreignlanguage{spanish}{objecto}}\foreignlanguage{spanish}{ en el ejemplo) representan +el mismo objeto y ambos son referencias de instancia. Use +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{ para acceder a los miembros o +atributos de la instancia en el método.} + +\subsubsection[Métodos sintéticos]{\selectlanguage{spanish} Métodos sintéticos} +\hypertarget{RefHeadingToc356813639824055}{}{\selectlanguage{spanish} +Puede declarar métodos y miembros dinámicos sintéticos usando \textbf{Miembros virtuales} como se describe en el +Capítulo 8.2.} + +\subsubsection[Variables de clase static]{\foreignlanguage{spanish}{Variables de clase +}\textstyleSourceText{\foreignlanguage{spanish}{static}}} +\hypertarget{RefHeadingToc356833639824055}{}\foreignlanguage{spanish}{Las variables o funciones se pueden declarar +}\textstyleSourceText{\foreignlanguage{spanish}{static}}\foreignlanguage{spanish}{. Las variables estáticas tienen el +mismo }\foreignlanguage{spanish}{valor para todas las instancias de la misma clase. Se declaran como +}\textstyleSourceText{\foreignlanguage{spanish}{static a = 1}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{static var a = 1}}\foreignlanguage{spanish}{. Las variables estáticas +se inicializan justo después de la creación de la clase.} + +\subsubsection[Métodos de clase static]{\foreignlanguage{spanish}{Métodos de clase +}\textstyleSourceText{\foreignlanguage{spanish}{static}}} +\hypertarget{RefHeadingToc356853639824055}{}\foreignlanguage{spanish}{Los métodos se pueden declarar +}\textstyleSourceText{\foreignlanguage{spanish}{static}}\foreignlanguage{spanish}{, lo que significa que actúan como +una función regular y no toman }\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{ como +primer argumento. Dentro de los métodos estáticos, no se declara ninguna variable {\textquotedbl}auto{\textquotedbl} +implícita. Los métodos estáticos se pueden llamar a través de la clase o a través de una instancia.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} class static\_demo} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ static def incremento\_static(i)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ return i + 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ def incremento\_instancia(i)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ return i + 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ end} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a = static\_demo()} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} static\_demo.incremento\_static(1) \ \ \ \# llamada via clase} + +{\selectlanguage{spanish}\ttfamily +2} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.incremento\_static(1) \ \ \ \ \ \ \ \ \ \ \ \ \ \# llamada via instancia} + +{\selectlanguage{spanish}\ttfamily +{\textgreater}} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} static\_demo.incremento\_instancia(1)} + +{\selectlanguage{spanish}\ttfamily +type\_error: unsupported operand type(s) for +: 'nil' and 'int'} + +{\selectlanguage{spanish}\ttfamily +stack traceback:} + +{\selectlanguage{spanish}\ttfamily +\ \ \ stdin:6: in function {\textasciigrave}increment\_instancia{\textasciigrave}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ stdin:1: in function {\textasciigrave}main{\textasciigrave}} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.increment\_instancia(1)} + +{\selectlanguage{spanish}\ttfamily +2} + +\subsubsection[6.1.4 Constructor y Destructor]{\selectlanguage{spanish} 6.1.4 Constructor y Destructor} +\hypertarget{RefHeadingToc356873639824055}{}\paragraph[Constructor]{\selectlanguage{spanish} Constructor} +\hypertarget{RefHeadingToc356893639824055}{}\foreignlanguage{spanish}{El constructor de la clase es el método +}\textstyleSourceText{\foreignlanguage{spanish}{init}}\foreignlanguage{spanish}{. Se llama al constructor cuando se +crea una instancia de la clase. Por lo tanto, el constructor generalmente se usa para la inicialización de miembros, +por ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class Test} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var a} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.a ='esto es una prueba'} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{El constructor de este ejemplo inicializa el miembro +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ de la clase +}\textstyleSourceText{\foreignlanguage{spanish}{Test}}\foreignlanguage{spanish}{ con la cadena +}\textstyleSourceText{\foreignlanguage{spanish}{{}'esto es una prueba'}}\foreignlanguage{spanish}{. Si instanciamos la +clase, podemos obtener el valor del miembro +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class Test} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var a} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.a ='esta es una prueba'} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + +\paragraph[Destructor]{\selectlanguage{spanish} Destructor} +\hypertarget{RefHeadingToc356913639824055}{}\foreignlanguage{spanish}{El destructor de la clase es el método +}\textstyleSourceText{\foreignlanguage{spanish}{deinit}}\foreignlanguage{spanish}{. Se llama al destructor cuando se +destruye la instancia. El destructor se usa generalmente para completar algún trabajo de limpieza. Debido a que el +mecanismo de recolección de basura libera automáticamente la memoria de los objetos inútiles, no hay necesidad de +liberar la memoria en el destructor (y tampoco hay forma de hacerlo en el destructor). En la mayoría de los casos, no +hay necesidad de usar un destructor, a menos que cierta clase requiera cierto procesamiento cuando se destruye. Un +ejemplo típico es que un objeto de archivo debe cerrar el archivo cuando se destruye.} + +\subsection[6.2 Herencia de clases]{\selectlanguage{spanish} 6.2 Herencia de clases} +\hypertarget{RefHeadingToc356933639824055}{}\foreignlanguage{spanish}{Berry solo admite herencia simple, es decir, una +clase solo puede tener una clase base, y la clase base usa el operador +}\textstyleSourceText{\foreignlanguage{spanish}{:}}\foreignlanguage{spanish}{ para declarar:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class Test: Base} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ...} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Aquí la clase }\textstyleSourceText{\foreignlanguage{spanish}{Test}}\foreignlanguage{spanish}{ +hereda de la clase }\textstyleSourceText{\foreignlanguage{spanish}{Base}}\foreignlanguage{spanish}{. La subclase +heredará todos los métodos y propiedades de la clase base y puede anularlos en la subclase. Este mecanismo se llama +}\foreignlanguage{spanish}{\textbf{Sobrecarga}}\foreignlanguage{spanish}{. En circunstancias normales, solo +sobrecargaremos métodos, no propiedades.} + +{\selectlanguage{spanish} +El mecanismo de herencia de la clase Berry es relativamente simple. Las subclases contendrán referencias a la clase base +y los objetos de instancia son similares. Al instanciar una clase con una clase base, en realidad se generan múltiples +objetos. Estos objetos se encadenarán de acuerdo con la relación de herencia y, finalmente, obtendremos el objeto de +instancia al final de la cadena de herencia.} + +\subsection[6.3 Sobrecarga de método]{\selectlanguage{spanish} 6.3 Sobrecarga de método} +\hypertarget{RefHeadingToc356953639824055}{}{\selectlanguage{spanish} +La \textbf{Sobrecarga} significa que la subclase y la clase base usan el mismo método de nombre, y el método de la +subclase anulará el mecanismo del método de la clase base. Para ser precisos, las variables miembro también se pueden +sobrecargar, pero esta sobrecarga no tiene sentido. La sobrecarga de métodos se divide en sobrecarga de métodos +ordinarios y sobrecarga de operadores.} + +\subsubsection[6.3.1 Sobrecarga de método común]{\selectlanguage{spanish} 6.3.1 Sobrecarga de método común} +\hypertarget{RefHeadingToc356973639824055}{}\subsubsection[Sobrecarga del operador]{\selectlanguage{spanish} Sobrecarga +del operador} +\hypertarget{RefHeadingToc356993639824055}{}{\selectlanguage{spanish} +Puede usar la sobrecarga de operadores de la clase para hacer que la instancia admita la operación del operador +integrado. Por ejemplo, para una clase sobrecargada con el operador de suma, podemos usar el operador de suma para +realizar operaciones en la instancia. Un operador sobrecargado es un método con un nombre especial, y la forma de +función sobrecargada de un operador binario es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +´def' operador ´(´ otro ´)´} + +{\selectlanguage{spanish}\ttfamily +\ \ bloque} + +{\selectlanguage{spanish}\ttfamily +´end'} + + +\bigskip + +\foreignlanguage{spanish}{\textbf{operador}}\foreignlanguage{spanish}{ es un operador binario sobrecargado. El operando +izquierdo del operador binario es el objeto +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{ y el operando derecho es el valor del +parámetro }\foreignlanguage{spanish}{\textbf{otro}}\foreignlanguage{spanish}{. La forma de función sobrecargada del +operador unario es} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +´def' operador ´()´} + +{\selectlanguage{spanish}\ttfamily +\ \ bloque} + +{\selectlanguage{spanish}\ttfamily +´end'} + + +\bigskip + +\foreignlanguage{spanish}{\textbf{operador}}\foreignlanguage{spanish}{ es un operador unario sobrecargado. Para +distinguirlo del operador de resta, el signo menos unario se escribe como +}\textstyleSourceText{\foreignlanguage{spanish}{{}-*}}\foreignlanguage{spanish}{ cuando está sobrecargado. Las +funciones sobrecargadas del operador deben tener un valor de retorno, porque el valor de retorno +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ predeterminado no suele ser el +resultado esperado. Tomemos una clase entera como ejemplo para ilustrar el uso de la sobrecarga de operadores. Primero +defina la clase }\textstyleSourceText{\foreignlanguage{spanish}{integer}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class integer} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var value} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def init(v)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.value = v} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def +(other)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return integer(self.value + other.value)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def *(other)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return integer(self.value * other.value)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def -*()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return integer(-self.value)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def tostring(other)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return str(self.value)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{La clase }\textstyleSourceText{\foreignlanguage{spanish}{integer}}\foreignlanguage{spanish}{ +sobrecarga los operadores suma, multiplicación y simbólicos, y el método +}\textstyleSourceText{\foreignlanguage{spanish}{tostring}}\foreignlanguage{spanish}{ hace que la instancia use la +función }\textstyleSourceText{\foreignlanguage{spanish}{print}}\foreignlanguage{spanish}{ para generar el resultado. +Podemos usar una simple línea de código para probar la función de sobrecarga de operadores de la clase:} + +{\selectlanguage{spanish}\ttfamily +integer(1) + integer(2) * -integer(3) \# -5} + +\foreignlanguage{spanish}{El resultado de esta línea de código es una instancia de +}\textstyleSourceText{\foreignlanguage{spanish}{integer}}\foreignlanguage{spanish}{. El valor del miembro +}\textstyleSourceText{\foreignlanguage{spanish}{value}}\foreignlanguage{spanish}{ de esta instancia es +}\textstyleSourceText{\foreignlanguage{spanish}{{}-5}}\foreignlanguage{spanish}{, que es el mismo resultado de las +mismas cuatro operaciones aritméticas con números enteros.} + +\foreignlanguage{spanish}{Los operadores lógicos no se pueden sobrecargar directamente. Si necesita una instancia para +admitir operaciones lógicas, debe implementar el método +}\textstyleSourceText{\foreignlanguage{spanish}{tobool}}\foreignlanguage{spanish}{. El método no tiene parámetros y el +valor devuelto debe ser de tipo booleano. La operación lógica de la instancia en realidad se realiza convirtiendo la +instancia en un valor booleano, por lo que la operación lógica de la instancia está completamente en línea con la +naturaleza de la operación lógica general. El operador de subíndice no se sobrecarga directamente, pero se implementa +}\foreignlanguage{spanish}{mediante los métodos +}\textstyleSourceText{\foreignlanguage{spanish}{item}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{setitem}}\foreignlanguage{spanish}{. El método +}\textstyleSourceText{\foreignlanguage{spanish}{item}}\foreignlanguage{spanish}{ se utiliza para la lectura de +subíndices, su primer parámetro es el valor del subíndice y el valor de retorno es el resultado de la operación del +subíndice; }\textstyleSourceText{\foreignlanguage{spanish}{setitem}}\foreignlanguage{spanish}{ se utiliza para la +escritura de subíndices, y su primer parámetro es el valor del subíndice, el segundo parámetro es el valor que se va a +escribir; este método no utiliza el valor de retorno.} + +{\selectlanguage{spanish} +Al operador sobrecargado se le puede asignar cualquier significado, incluso sin satisfacer las propiedades habituales de +los operadores. Dada la versatilidad del código y la dificultad de comprensión, no se recomienda que los usuarios den a +los operadores sobrecargados una función alejada del significado general.} + +\paragraph[Sobrecarga del operador de asignación compuesto]{\selectlanguage{spanish} Sobrecarga del operador de +asignación compuesto} +\hypertarget{RefHeadingToc357013639824055}{}\foreignlanguage{spanish}{El operador de asignación compuesto no se puede +sobrecargar directamente, pero podemos lograr el propósito de {\textquotedbl}sobrecargar{\textquotedbl} el operador de +asignación compuesto sobrecargando el operador binario correspondiente al operador de asignación compuesto. Por +ejemplo, después de sobrecargar el operador +{\textquotedbl}}\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{{\textquotedbl}, puede usar +el operador +{\textquotedbl}}\textstyleSourceText{\foreignlanguage{spanish}{+=}}\foreignlanguage{spanish}{{\textquotedbl} para +instancias de clases relacionadas. Vale la pena señalar que el uso de operaciones de asignación compuestas en la +instancia hará que las variables de la instancia vinculada pierdan su referencia a la instancia.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class integer} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var valor} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def init(x)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.valor = x} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def +(other)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return integer(self.valor + other.valor)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +a = integer(4) \# a: {\textless}instance: 0x55edff400a78{\textgreater}} + +{\selectlanguage{spanish}\ttfamily +a += integer(5) \# a: {\textless}instance: 0x55edff4011b8{\textgreater}} + +{\selectlanguage{spanish}\ttfamily +print(a.valor) \# 9} + + +\bigskip + +\foreignlanguage{spanish}{Después de que se ejecuta la línea 11 de código, la instancia enlazada en la variable +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ realmente ha cambiado. Esta línea de +código es equivalente a }\textstyleSourceText{\foreignlanguage{spanish}{a = integer(4) + +integer(5)}}\foreignlanguage{spanish}{. Si el operador binario de la sobrecarga de clase no modifica el estado de la +instancia, entonces el operador de asignación compuesto correspondiente no modificará ninguna instancia (puede generar +nuevas instancias).} + +\subsection[6.4 Instancia]{\selectlanguage{spanish} 6.4 Instancia} +\hypertarget{RefHeadingToc357033639824055}{}{\selectlanguage{spanish} +Una \textbf{Instancia} es un objeto generado después de la instanciación de la clase. Una clase se puede instanciar +varias veces para generar diferentes instancias. Las instancias de Berry están referenciadas por la clase a la que +pertenecen y los campos de datos correspondientes. Todas las instancias de una clase se referirán a esta clase, pero +los campos de datos de estas instancias son independientes entre sí.} + +\subsubsection[6.4.1 Acceso al objeto de clase base]{\selectlanguage{spanish} 6.4.1 Acceso al objeto de clase base} +\hypertarget{RefHeadingToc357053639824055}{}\foreignlanguage{spanish}{La función integrada +}\textstyleSourceText{\foreignlanguage{spanish}{super}}\foreignlanguage{spanish}{ se utiliza para acceder a objetos de +clase superior. Se puede utilizar en clases o instancias.} + +\foreignlanguage{spanish}{La magia ocurre cuando llamas a un método de la superclase para que se comporte como +intuitivamente crees que lo haría. Por ejemplo, el patrón común para +}\textstyleSourceText{\foreignlanguage{spanish}{init()}}\foreignlanguage{spanish}{ es el siguiente:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def init({\textless}args{\textgreater})} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \# hacer cosas antes de super init} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ super(self).init({\textless}args{\textgreater})} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \# hacer cosas después de super init} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +\foreignlanguage{spanish}{Tenga en cuenta que las clases siempre contienen métodos +}\textstyleSourceText{\foreignlanguage{spanish}{init()}}\foreignlanguage{spanish}{ implícitos que no hacen nada, por lo +que siempre puede llamar a init desde la superclase incluso si no se declaró ningún método +}\textstyleSourceText{\foreignlanguage{spanish}{init()}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +Ejemplo completo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class A} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var val} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def init(val)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \# super(self).init(val) \ \ \ \# esto sería válido pero inútil} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.val = val} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def tostring()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return {\textquotedbl}val={\textquotedbl} + str(self.val)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class B: A} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var magia \ \ \ \# verdadero si el valor es 42} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def init(val)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ super(self).init(val) \ \ \ \ \# llamar a superinit} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.magia = (val == 42)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def tostring()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ if self.magia} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ return {\textquotedbl}magia!{\textquotedbl}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ else} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ return super(self).tostring()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#\#\#\#\#\#\# Ejemplo de uso} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} b1 = B(1)} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} b1} + +{\selectlanguage{spanish}\ttfamily +val=1} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} b42 = B(42)} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} b42} + +{\selectlanguage{spanish}\ttfamily +magia!} + + +\bigskip + +\foreignlanguage{spanish}{\textbf{Características avanzadas}}\foreignlanguage{spanish}{: Al llamar a +}\textstyleSourceText{\foreignlanguage{spanish}{super(self).{\textless}method{\textgreater} +({\textless}args{\textgreater} )}}\foreignlanguage{spanish}{ ocurre algo de magia. Cuando se llama al supermétodo, los +argumentos }\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{ se refieren a la clase +específica más baja. Sin embargo, el }\textstyleSourceText{\foreignlanguage{spanish}{{\textless}method{\textgreater} +}}\foreignlanguage{spanish}{no se busca desde la clase de +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{ (que siempre es la más baja), sino +desde la superclase de la clase que contiene el método que se está ejecutando }\foreignlanguage{spanish}{actualmente.} + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} class A} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ print({\textquotedbl}In A::init, self es de tipo{\textquotedbl}, classname(self))} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ end} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} class B:A} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ print({\textquotedbl}In B::init, self es de tipo{\textquotedbl}, classname(self))} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ super(self).init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ end} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} class C:B} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ print({\textquotedbl}En C::init, self es de tipo{\textquotedbl}, classname(self))} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ super(self).init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ end} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} c = C()} + +{\selectlanguage{spanish}\ttfamily +En C::init, self es de tipo C} + +{\selectlanguage{spanish}\ttfamily +In B::init, self es de tipo C} + +{\selectlanguage{spanish}\ttfamily +In A::init, self es de tipo C} + +{\selectlanguage{spanish}\ttfamily +{\textgreater}} + + +\bigskip + +{\selectlanguage{spanish} +Explicación:} + +\liststyleLiv +\begin{itemize} +\item \foreignlanguage{spanish}{llamando a +}\textstyleSourceText{\foreignlanguage{spanish}{C:init()}}\foreignlanguage{spanish}{ en +}\textstyleSourceText{\foreignlanguage{spanish}{instancia{\textless}C{\textgreater} }}\foreignlanguage{spanish}{{}- en +}\textstyleSourceText{\foreignlanguage{spanish}{C:init()}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{instancia{\textless}C{\textgreater} }}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{super(self).init()}}\foreignlanguage{spanish}{ se refiere a la +superclase de }\textstyleSourceText{\foreignlanguage{spanish}{C}}\foreignlanguage{spanish}{ (método actual), es decir, +}\textstyleSourceText{\foreignlanguage{spanish}{B}}\foreignlanguage{spanish}{, por lo que +}\textstyleSourceText{\foreignlanguage{spanish}{B:init()}}\foreignlanguage{spanish}{ se llama con +}\textstyleSourceText{\foreignlanguage{spanish}{instance{\textless}C{\textgreater} +}}\foreignlanguage{spanish}{argumento - en +}\textstyleSourceText{\foreignlanguage{spanish}{B:init()}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{instancia{\textless}C{\textgreater} }}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{super(self).init()}}\foreignlanguage{spanish}{ se refiere a la +superclase de }\textstyleSourceText{\foreignlanguage{spanish}{B}}\foreignlanguage{spanish}{ (método actual), es decir, +}\textstyleSourceText{\foreignlanguage{spanish}{A}}\foreignlanguage{spanish}{, por lo que +}\textstyleSourceText{\foreignlanguage{spanish}{A:init()}}\foreignlanguage{spanish}{ se llama con +}\textstyleSourceText{\foreignlanguage{spanish}{instance{\textless}C{\textgreater} +}}\foreignlanguage{spanish}{argumento - en +}\textstyleSourceText{\foreignlanguage{spanish}{A:init()}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{self}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{instancia{\textless}C{\textgreater} }}\foreignlanguage{spanish}{, +imprimir y devolver} +\end{itemize} +\foreignlanguage{spanish}{Nota: por compatibilidad con versiones anteriores, super puede tomar un segundo argumento +}\textstyleSourceText{\foreignlanguage{spanish}{super(instancia, clase)}}\foreignlanguage{spanish}{ para especificar la +clase donde resolver el método. Esta función no debe usarse más, ya que es propensa a errores.} + +\clearpage\section[Capítulo 7: Bibliotecas y Módulos]{Capítulo 7: \foreignlanguage{spanish}{Bibliotecas y Módulos}} +\hypertarget{RefHeadingToc357073639824055}{} +\bigskip + +\subsection[7.1 Biblioteca básica]{\selectlanguage{spanish} 7.1 Biblioteca básica} +\hypertarget{RefHeadingToc357093639824055}{}{\selectlanguage{spanish} +Hay algunas funciones y clases que se pueden usar directamente en la biblioteca estándar. Proporcionan servicios básicos +para los programas de Berry, por lo que también se denominan bibliotecas básicas. Las funciones y clases de la +biblioteca básica están visibles en el ámbito global (perteneciente al ámbito integrado), por lo que se pueden utilizar +en cualquier lugar. No defina variables con el mismo nombre que las funciones o clases en la biblioteca base. Si lo +hace, será imposible hacer referencia a las funciones y clases en la biblioteca base.} + +\subsubsection[7.1.1 Función integrada]{\selectlanguage{spanish} 7.1.1 Función integrada} +\hypertarget{RefHeadingToc357113639824055}{}\paragraph[Función print]{\foreignlanguage{spanish}{Función +}\textstyleSourceText{\foreignlanguage{spanish}{print}}} +\hypertarget{RefHeadingToc357133639824055}{}{\selectlanguage{spanish}\bfseries +Ejemplo} + +{\selectlanguage{spanish}\ttfamily +print(...)} + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función imprime los parámetros de entrada en el dispositivo de salida estándar. La +función puede aceptar cualquier tipo y cualquier número de parámetros. Todos los tipos imprimirán su valor +directamente, y para una instancia, esta función verificará si la instancia tiene un método +}\textstyleSourceText{\foreignlanguage{spanish}{tostring()}}\foreignlanguage{spanish}{, y si lo hay, imprimirá el valor +de retorno de la instancia llamando al método +}\textstyleSourceText{\foreignlanguage{spanish}{tostring()}}\foreignlanguage{spanish}{, de lo contrario, imprimirá la +dirección de la instancia.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +print('Hola mundo!') \# Hola mundo!} + +{\selectlanguage{spanish}\ttfamily +print([1, 2, '3']) \# [1, 2, '3']} + +{\selectlanguage{spanish}\ttfamily +print(print) \# {\textless}function: 0x561092293780{\textgreater}} + +\paragraph[Función input]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{input}}} +\hypertarget{RefHeadingToc357153639824055}{}{\selectlanguage{spanish}\bfseries +Ejemplo} + +{\selectlanguage{spanish}\ttfamily +input()} + +{\selectlanguage{spanish}\ttfamily +input(prompt)} + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{La función }\textstyleSourceText{\foreignlanguage{spanish}{input}}\foreignlanguage{spanish}{ +se usa para ingresar una línea de cadena de caracteres desde el dispositivo de entrada estándar. Esta función puede +usar el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{prompt}}\foreignlanguage{spanish}{ como un indicador +de entrada, y el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{prompt}}\foreignlanguage{spanish}{ debe ser +de tipo cadena. Después de llamar a la función +}\textstyleSourceText{\foreignlanguage{spanish}{input}}\foreignlanguage{spanish}{, los caracteres se leerán desde el +búfer del teclado hasta que se encuentre un carácter de nueva línea.} + +{\selectlanguage{spanish}\ttfamily +input('por favor ingrese una cadena:') \# por favor ingrese una cadena:} + +\foreignlanguage{spanish}{La función }\textstyleSourceText{\foreignlanguage{spanish}{input}}\foreignlanguage{spanish}{ +no regresa hasta que se presiona la tecla {\textquotedbl}Enter{\textquotedbl}, por lo que el programa queda +{\textquotedbl}atascado{\textquotedbl} y no es un error.} + +\paragraph[Función type]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{type}}} +\hypertarget{RefHeadingToc357173639824055}{}{\selectlanguage{spanish}\bfseries +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +type(valor)} + + +\bigskip + +\liststyleLv +\begin{itemize} +\item {\selectlanguage{spanish} +\textit{valor}: parámetro de entrada (se espera obtener su tipo).} +\item {\selectlanguage{spanish} +\textit{valor devuelto}: una cadena que describe el tipo de parámetro.} +\end{itemize} + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +{\selectlanguage{spanish} +Esta función recibe un parámetro de cualquier tipo y devuelve el tipo del parámetro. El valor devuelto es una cadena que +describe el tipo del parámetro. La siguiente tabla muestra los valores de retorno correspondientes a los principales +tipos de parámetros:} + + +\bigskip + +\begin{center} +\tablefirsthead{{\selectlanguage{spanish}\bfseries Tipo de parámetro} & +{\selectlanguage{spanish}\bfseries Valor devuelto} & +{\selectlanguage{spanish}\bfseries Tipo de parámetro} & +{\selectlanguage{spanish}\bfseries Valor devuelto}\\} +\tablehead{{\selectlanguage{spanish}\bfseries Tipo de parámetro} & +{\selectlanguage{spanish}\bfseries Valor devuelto} & +{\selectlanguage{spanish}\bfseries Tipo de parámetro} & +{\selectlanguage{spanish}\bfseries Valor devuelto}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{3.779cm}m{3.779cm}m{3.779cm}m{3.781cm}} +{\selectlanguage{spanish} Nil} & +\textstyleSourceText{\foreignlanguage{spanish}{{}'nil'}} & +{\selectlanguage{spanish} Integer} & +\textstyleSourceText{\foreignlanguage{spanish}{{}'int'}}\\ +{\selectlanguage{spanish} Real} & +\textstyleSourceText{\foreignlanguage{spanish}{{}'real'}} & +{\selectlanguage{spanish} Boolean} & +\textstyleSourceText{\foreignlanguage{spanish}{{}'bool'}}\\ +{\selectlanguage{spanish} Function} & +\textstyleSourceText{\foreignlanguage{spanish}{{}'function'}} & +{\selectlanguage{spanish} Class} & +\textstyleSourceText{\foreignlanguage{spanish}{{}'class'}}\\ +{\selectlanguage{spanish} String} & +\textstyleSourceText{\foreignlanguage{spanish}{{}'string'}} & +{\selectlanguage{spanish} Instance} & +\textstyleSourceText{\foreignlanguage{spanish}{{}'instance'}}\\ +{\selectlanguage{spanish} puntero nativo} & +\textstyleSourceText{\foreignlanguage{spanish}{{}'ptr'}} & +~ + & +~ +\\ +\end{supertabular} +\end{center} + +\bigskip + +{\selectlanguage{spanish}\ttfamily +type(0) \# 'int'} + +{\selectlanguage{spanish}\ttfamily +type(0.5) \# 'real'} + +{\selectlanguage{spanish}\ttfamily +type('hello') \# 'string'} + +{\selectlanguage{spanish}\ttfamily +type(print) \# 'función'} + +\paragraph[Función classname]{\foreignlanguage{spanish}{Función +}\textstyleSourceText{\foreignlanguage{spanish}{classname}}} +\hypertarget{RefHeadingToc357193639824055}{}{\selectlanguage{spanish}\bfseries +Ejemplo} + +{\selectlanguage{spanish}\ttfamily +classname(objeto)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el nombre de clase (cadena) del parámetro. Por lo tanto, el parámetro +debe ser una clase o instancia, y otros tipos de parámetros devolverán +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +classname(list) \# 'list'} + +{\selectlanguage{spanish}\ttfamily +classname(list()) \# 'list'} + +{\selectlanguage{spanish}\ttfamily +classname(\{\}) \# 'map'} + +{\selectlanguage{spanish}\ttfamily +classname(0) \# nil} + +\paragraph[Función classof]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{classof}}} +\hypertarget{RefHeadingToc357213639824055}{}{\selectlanguage{spanish}\bfseries +Ejemplo} + +{\selectlanguage{spanish}\ttfamily +classof(objeto)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Devuelve la clase de un objeto de instancia. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{objeto}}\foreignlanguage{spanish}{ debe ser una instancia. Si la +}\foreignlanguage{spanish}{función se llama con éxito, devolverá la clase a la que pertenece la instancia; de lo +contrario, devolverá }\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +classof(list) \# nil} + +{\selectlanguage{spanish}\ttfamily +classof(list()) \# {\textless}class: list{\textgreater}} + +{\selectlanguage{spanish}\ttfamily +classof(\{\}) \# {\textless}class: map{\textgreater}} + +{\selectlanguage{spanish}\ttfamily +classof(0) \# nil} + +\paragraph[Función str]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{str}}} +\hypertarget{RefHeadingToc357233639824055}{}{\selectlanguage{spanish}\bfseries +Ejemplo} + +{\selectlanguage{spanish}\ttfamily +str(valor)} + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función convierte los parámetros en cadenas y los devuelve. Las funciones +}\textstyleSourceText{\foreignlanguage{spanish}{str}}\foreignlanguage{spanish}{ pueden aceptar cualquier tipo de +parámetros y convertirlos. Cuando el tipo de parámetro es una instancia, verificará si la instancia tiene un método +}\textstyleSourceText{\foreignlanguage{spanish}{tostring()}}\foreignlanguage{spanish}{, si lo hay, se usará el valor de +retorno del método; de lo contrario, la dirección de la instancia se convertirá en una cadena.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +str(0) \# '0'} + +{\selectlanguage{spanish}\ttfamily +str(nil) \# 'nil'} + +{\selectlanguage{spanish}\ttfamily +str(list) \# 'list'} + +{\selectlanguage{spanish}\ttfamily +str([0, 1, 2]) \# '[0, 1, 2]'} + +\subparagraph[Función number]{\foreignlanguage{spanish}{Función +}\textstyleSourceText{\foreignlanguage{spanish}{number}}} +\hypertarget{RefHeadingToc357253639824055}{}{\selectlanguage{spanish}\ttfamily +number(valor)} + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función convierte la cadena o el número de entrada en un tipo numérico y lo devuelve. Si +el parámetro de entrada es un número entero o real, devuelve directamente. Si es una cadena de caracteres, intenta +convertir la cadena de caracteres en un valor numérico en formato decimal. El número entero o real se juzgará +automáticamente durante la conversión. Otros tipos devuelven +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +number(5) \# 5} + +{\selectlanguage{spanish}\ttfamily +number('45.6') \# 45.6} + +{\selectlanguage{spanish}\ttfamily +number('50') \# 50} + +{\selectlanguage{spanish}\ttfamily +number(list) \# nil} + +\subparagraph[Función int]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{int}}} +\hypertarget{RefHeadingToc357273639824055}{}{\selectlanguage{spanish}\ttfamily +int(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función convierte la cadena o el número de entrada en un número entero y lo devuelve. Si +el parámetro de entrada es un número entero, regresa directamente, si es un número real, descarta la parte decimal. Si +es una cadena, intenta convertir la cadena en un número entero en decimal. Otros tipos devuelven +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{. Cuando el tipo de parámetro es una +instancia, }\foreignlanguage{spanish}{verificará si la instancia tiene un método +}\textstyleSourceText{\foreignlanguage{spanish}{toint()}}\foreignlanguage{spanish}{, si lo hay, se utilizará el valor +de retorno del método.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int(5) \# 5} + +{\selectlanguage{spanish}\ttfamily +int(45.6) \# 45} + +{\selectlanguage{spanish}\ttfamily +int('50') \# 50} + +{\selectlanguage{spanish}\ttfamily +int('0x10) \# 16 - literal hexadecimal es válido} + +{\selectlanguage{spanish}\ttfamily +int(list) \# nil} + +\subparagraph[Función real]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{real}}} +\hypertarget{RefHeadingToc357293639824055}{}{\selectlanguage{spanish}\ttfamily +real(valor)} + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función convierte la cadena o el número de entrada en un número real y lo devuelve. Si el +parámetro de entrada es un número real, devolverá directamente, si es un número entero, se convertirá en un número +real. Si es una cadena, intenta convertir la cadena en un número real en decimal. Otros tipos devuelven +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +real(5) \# 5, type(real(5)) $\rightarrow $'real'} + +{\selectlanguage{spanish}\ttfamily +real(45.6) \# 45.6} + +{\selectlanguage{spanish}\ttfamily +real('50.5') \# 50.5} + +{\selectlanguage{spanish}\ttfamily +real(list) \# nil} + +\subparagraph[Función bool]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{bool}}} +\hypertarget{RefHeadingToc357313639824055}{}{\selectlanguage{spanish}\ttfamily +bool(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +{\selectlanguage{spanish} +Esta función convierte la cadena o el número de entrada en un valor booleano y lo devuelve.} + +{\selectlanguage{spanish} +La conversión sigue las siguientes reglas:} + +\liststyleLvi +\begin{itemize} +\item \textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{: convertido a +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Entero}}\foreignlanguage{spanish}{: cuando el valor es +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{, de lo contrario, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Número real}}\foreignlanguage{spanish}{: cuando el valor es +}\textstyleSourceText{\foreignlanguage{spanish}{0.0}}\foreignlanguage{spanish}{, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{, de lo contrario, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Cadena}}\foreignlanguage{spanish}{: cuando el valor es +{\textquotedbl}{\textquotedbl} (cadena vacía) se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{ de lo contrario, se convierte en +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Comobj}}\foreignlanguage{spanish}{ y +}\foreignlanguage{spanish}{\textbf{Comptr}}\foreignlanguage{spanish}{: cuando el puntero interno es +}\textstyleSourceText{\foreignlanguage{spanish}{NULL}}\foreignlanguage{spanish}{ es convertido a +}\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{, de lo contrario se convierte a +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{\textbf{Instancia}}\foreignlanguage{spanish}{: si la instancia contiene un método +}\textstyleSourceText{\foreignlanguage{spanish}{tobool()}}\foreignlanguage{spanish}{, se utilizará el valor de retorno +del método, de lo contrario, se convertirá en +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{Todos los demás tipos: convierte a +}\textstyleSourceText{\foreignlanguage{spanish}{verdadero}}\foreignlanguage{spanish}{.} + + +\bigskip +\end{itemize} +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +bool() \# false} + +{\selectlanguage{spanish}\ttfamily +bool(nil) \# false} + +{\selectlanguage{spanish}\ttfamily +bool(false) \# false} + +{\selectlanguage{spanish}\ttfamily +bool(true) \# true} + +{\selectlanguage{spanish}\ttfamily +bool(0) \# false} + +{\selectlanguage{spanish}\ttfamily +bool(1) \# true} + +{\selectlanguage{spanish}\ttfamily +bool({\textquotedbl}{\textquotedbl}) \# false} + +{\selectlanguage{spanish}\ttfamily +bool({\textquotedbl}a{\textquotedbl}) \# true} + +{\selectlanguage{spanish}\ttfamily +bool(3.5) \# true} + +{\selectlanguage{spanish}\ttfamily +bool(list) \# true} + +{\selectlanguage{spanish}\ttfamily +bool([]) \# true} + +{\selectlanguage{spanish}\ttfamily +bool(\{\}) \# true} + +{\selectlanguage{spanish}\ttfamily +\# avanzado} + +{\selectlanguage{spanish}\ttfamily +import introspect} + +{\selectlanguage{spanish}\ttfamily +bool(introspect.toptr(0)) \# false} + +{\selectlanguage{spanish}\ttfamily +bool(introspect.toptr(0x1000)) \# true} + +\subparagraph[Función size]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{size}}} +\hypertarget{RefHeadingToc357333639824055}{}{\selectlanguage{spanish}\ttfamily +size(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el tamaño de la cadena de entrada. Si el parámetro de entrada no es una +cadena, se devuelve 0. La longitud de la cadena se calcula en bytes. Esta función también funciona para instancias de +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ y devuelve el número de elementos.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +size(10) \# 0} + +{\selectlanguage{spanish}\ttfamily +size('s') \# 1} + +{\selectlanguage{spanish}\ttfamily +size('string') \# 6} + +{\selectlanguage{spanish}\ttfamily +size([1,2]) \# 2} + +{\selectlanguage{spanish}\ttfamily +size(\{{\textquotedbl}a{\textquotedbl}:1\}) \# 1} + +\subparagraph[Función super]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{super}}} +\hypertarget{RefHeadingToc357353639824055}{}{\selectlanguage{spanish}\ttfamily +super(objeto)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el objeto principal de la instancia. Cuando crea una instancia de una +clase derivada, también creará una instancia de su clase base. Se requiere la función +}\textstyleSourceText{\foreignlanguage{spanish}{super}}\foreignlanguage{spanish}{ para acceder a la instancia de la +clase base (es decir, el objeto principal).} + +\foreignlanguage{spanish}{Consulte el capítulo 6 sobre el comportamiento mágico de +}\textstyleSourceText{\foreignlanguage{spanish}{super(objeto)}}\foreignlanguage{spanish}{ al llamar a un supermétodo.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class mi\_lista: lista end} + +{\selectlanguage{spanish}\ttfamily +l = mi\_lista() \# classname(l) -{}-{\textgreater}'mi\_lista'} + +{\selectlanguage{spanish}\ttfamily +sl = super(l) \# classname(sl) -{}-{\textgreater}'lista'} + +\subparagraph[Función assert]{\foreignlanguage{spanish}{Función +}\textstyleSourceText{\foreignlanguage{spanish}{assert}}} +\hypertarget{RefHeadingToc357373639824055}{}{\selectlanguage{spanish}\ttfamily +assert(expresión)} + +{\selectlanguage{spanish}\ttfamily +assert(expresión, mensaje)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función se utiliza para implementar la función de aserción. La función +}\textstyleSourceText{\foreignlanguage{spanish}{assert}}\foreignlanguage{spanish}{ acepta un parámetro. Cuando el valor +del parámetro es }\textstyleSourceText{\foreignlanguage{spanish}{false}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{, la función activará un error de +aserción; de lo contrario, la función no tendrá ningún efecto. Cabe señalar que incluso si el parámetro es un valor +equivalente a }\textstyleSourceText{\foreignlanguage{spanish}{false}}\foreignlanguage{spanish}{ en operaciones lógicas +(por ejemplo, }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{), no generará un error de +aserción. El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{mensaje}}\foreignlanguage{spanish}{ es opcional +y debe ser una cadena. Si se utiliza este parámetro, la información de texto proporcionada en +}\textstyleSourceText{\foreignlanguage{spanish}{message}}\foreignlanguage{spanish}{ se mostrará cuando se produzca un +error de aserción; de lo contrario, se mostrará el mensaje predeterminado +{\textquotedbl}}\textstyleSourceText{\foreignlanguage{spanish}{Assert Fail}}\foreignlanguage{spanish}{{\textquotedbl}.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +assert(false) \# aserción fallida!} + +{\selectlanguage{spanish}\ttfamily +assert(nil) \# aserción fallida!} + +{\selectlanguage{spanish}\ttfamily +assert() \# aserción fallida!} + +{\selectlanguage{spanish}\ttfamily +assert(0) \# aserción fallida!} + +{\selectlanguage{spanish}\ttfamily +assert(false,'mensaje de aserción del usuario.') \# mensaje de aserción.} + +{\selectlanguage{spanish}\ttfamily +assert(true) \# pasa} + +\subparagraph[Función compile]{\foreignlanguage{spanish}{Función +}\textstyleSourceText{\foreignlanguage{spanish}{compile}}} +\hypertarget{RefHeadingToc357393639824055}{}{\selectlanguage{spanish}\ttfamily +compile(cadena)} + +{\selectlanguage{spanish}\ttfamily +compile(cadena, 'string')} + +{\selectlanguage{spanish}\ttfamily +compile(nombre\_archivo, 'file')} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función compila el código fuente de Berry en una función. El código fuente puede ser una +cadena o un archivo de texto. El primer parámetro de la función +}\textstyleSourceText{\foreignlanguage{spanish}{compile}}\foreignlanguage{spanish}{ es una cadena, y el segundo +parámetro es una }\textstyleSourceText{\foreignlanguage{spanish}{{}'cadena'}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{{}'archivo'}}\foreignlanguage{spanish}{. Cuando el segundo parámetro es +}\textstyleSourceText{\foreignlanguage{spanish}{{}'cadena'}}\foreignlanguage{spanish}{ o no hay un segundo parámetro, +la función }\textstyleSourceText{\foreignlanguage{spanish}{compile}}\foreignlanguage{spanish}{ compilará el primer +parámetro como código fuente. Cuando el segundo parámetro es +}\textstyleSourceText{\foreignlanguage{spanish}{{}'file'}}\foreignlanguage{spanish}{, la función +}\textstyleSourceText{\foreignlanguage{spanish}{compile}}\foreignlanguage{spanish}{ compilará el archivo +correspondiente al primer parámetro. Si la compilación es exitosa, +}\textstyleSourceText{\foreignlanguage{spanish}{compile}}\foreignlanguage{spanish}{ devolverá la función compilada; de +lo contrario, devolverá }\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +compile('print({\textbackslash}'Hola mundo!{\textbackslash}')')() \# Hola mundo!} + +{\selectlanguage{spanish}\ttfamily +compile('test.be','file')} + +\subsubsection[7.1.2 Clase list]{\foreignlanguage{spanish}{7.1.2 }\foreignlanguage{spanish}{Clase +}\textstyleSourceText{\foreignlanguage{spanish}{list}}} +\hypertarget{RefHeadingToc357413639824055}{}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ +es un tipo incorporado, y define un contenedor de almacenamiento secuencial que admite la lectura y escritura de +subíndices. Es similar a las matrices en otros lenguajes de programación. La obtención de una instancia de la clase +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ se puede construir usando un par de +corchetes: }\textstyleSourceText{\foreignlanguage{spanish}{[]}}\foreignlanguage{spanish}{ generará una instancia vacía +de }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{, y +}\textstyleSourceText{\foreignlanguage{spanish}{[expr, expr, ...]}}\foreignlanguage{spanish}{ generará +}\foreignlanguage{spanish}{una }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ ejemplo +con varios elementos. También se puede instanciar llamando a la clase +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{: ejecutar +}\textstyleSourceText{\foreignlanguage{spanish}{list()}}\foreignlanguage{spanish}{ obtendrá una instancia vacía de +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{, y +}\textstyleSourceText{\foreignlanguage{spanish}{list(expr, expr, ...)}}\foreignlanguage{spanish}{ devolverá una +instancia con varios elementos.} + +\paragraph[Método list (Constructor)]{\foreignlanguage{spanish}{Método +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ (Constructor)}} +\hypertarget{RefHeadingToc357433639824055}{}\foreignlanguage{spanish}{Inicializa el contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{. Este método puede aceptar de 0 a +múltiples parámetros. La instancia }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ +generada cuando se pasan múltiples parámetros tendrá estos parámetros como elementos, y el orden de disposición de los +elementos es coherente con el orden de disposición de los parámetros.} + +\paragraph[Método tostring]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{tostring}}} +\hypertarget{RefHeadingToc357453639824055}{}\foreignlanguage{spanish}{Serializa la instancia de +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ en una cadena y la devuelve. Por +ejemplo, el resultado de ejecutar }\textstyleSourceText{\foreignlanguage{spanish}{[1, [], +1.5].tostring()}}\foreignlanguage{spanish}{ es }\textstyleSourceText{\foreignlanguage{spanish}{{}'[1, [], 1.5]'{}'. Si +el contenedor }}\foreignlanguage{spanish}{list{\textasciigrave} se refiere a sí mismo, la posición correspondiente +utilizará puntos suspensivos en lugar del valor específico:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +l = [1, 2]} + +{\selectlanguage{spanish}\ttfamily +l[0] = l} + +{\selectlanguage{spanish}\ttfamily +print(l) \# [[...], 2]} + +\paragraph[Método concat]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{concat}}} +\hypertarget{RefHeadingToc357473639824055}{}{\selectlanguage{spanish} +Convierte cada elemento de la lista en cadenas y la concatena usando la cadena proporcionada.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +l = [1, 2, 3]} + +{\selectlanguage{spanish}\ttfamily +l.concat() \ \# '123'} + +{\selectlanguage{spanish}\ttfamily +l.concat({\textquotedbl}, {\textquotedbl}) \ \# '1, 2, 3'} + +\paragraph[Método push]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{push}}} +\hypertarget{RefHeadingToc357493639824055}{}\foreignlanguage{spanish}{Agrega un elemento al final del contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{push(valor)}}\foreignlanguage{spanish}{, el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{valor}}\foreignlanguage{spanish}{ es el valor que se agregará, y el +valor agregado se almacena al final del contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{. La operación de agregar aumenta el +número de elementos en el contenedor }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ +en 1. Puede agregar cualquier tipo de valor a la instancia de +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{.} + +\paragraph[Método insert]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{insert}}} +\hypertarget{RefHeadingToc357513639824055}{}\foreignlanguage{spanish}{Inserta un elemento en la posición especificada +del contenedor }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{. El prototipo de este +método es }\textstyleSourceText{\foreignlanguage{spanish}{insert(indice, valor)}}\foreignlanguage{spanish}{, el +parámetro }\textstyleSourceText{\foreignlanguage{spanish}{indice}}\foreignlanguage{spanish}{ es la posición a insertar, +y }\textstyleSourceText{\foreignlanguage{spanish}{valor}}\foreignlanguage{spanish}{ es el valor a insertar. Después de +insertar un elemento en la posición }\textstyleSourceText{\foreignlanguage{spanish}{indice}}\foreignlanguage{spanish}{, +todos los elementos que originalmente comenzaron desde esta posición se moverán hacia atrás un elemento. La operación +de inserción aumenta el número de elementos en el contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ en 1. Puede insertar cualquier tipo de +valor en el contenedor }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{Supongamos que el valor de una instancia de +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{l}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{[0, 1, 2]}}\foreignlanguage{spanish}{, e insertamos una cadena +}\textstyleSourceText{\foreignlanguage{spanish}{{}'cadena'}}\foreignlanguage{spanish}{ en la posición 1, y necesitamos +llamar a }\textstyleSourceText{\foreignlanguage{spanish}{l.insert(1, 'cadena')}}\foreignlanguage{spanish}{. Finalmente, +el nuevo valor de }\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{[0, 'cadena', 1, 2]}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{Si el número de elementos en un contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ es +}\foreignlanguage{spanish}{\textit{S}}\foreignlanguage{spanish}{, el rango de valores de la posición de inserción es +\{}\foreignlanguage{spanish}{\textit{i}}\foreignlanguage{spanish}{ ${\in}$ $\mathbb{Z}$ : $-$ +}\foreignlanguage{spanish}{\textit{S}}\foreignlanguage{spanish}{ ${\leq}$ +}\foreignlanguage{spanish}{\textit{i}}\foreignlanguage{spanish}{ {\textless} +}\foreignlanguage{spanish}{\textit{S}}\foreignlanguage{spanish}{\}. Cuando la posición de inserción es positiva, indexa +hacia atrás desde el principio del contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{; de lo contrario, indexa hacia +adelante desde el final del contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{.} + +\paragraph[Método remove]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{remove}}} +\hypertarget{RefHeadingToc357533639824055}{}\foreignlanguage{spanish}{Quita un elemento del contenedor. El prototipo de +este método es }\textstyleSourceText{\foreignlanguage{spanish}{remove(indice)}}\foreignlanguage{spanish}{, y el +parámetro }\textstyleSourceText{\foreignlanguage{spanish}{indice}}\foreignlanguage{spanish}{ es la posición del +elemento a eliminar. Después de eliminar el elemento, el elemento detrás del elemento eliminado avanzará un elemento y +la cantidad de elementos en el contenedor se reducirá en 1. Al igual que el método +}\textstyleSourceText{\foreignlanguage{spanish}{insert}}\foreignlanguage{spanish}{, el método +}\textstyleSourceText{\foreignlanguage{spanish}{remove}}\foreignlanguage{spanish}{ también puede usar índices positivos +o negativos.} + +\paragraph[Método item]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{item}}} +\hypertarget{RefHeadingToc357553639824055}{}\foreignlanguage{spanish}{Obtiene un elemento en el contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{item(indice)}}\foreignlanguage{spanish}{, el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{indice}}\foreignlanguage{spanish}{ es el índice del elemento a obtener, +y el valor de retorno del método es el elemento en la posición del índice. +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ El contenedor admite múltiples métodos +de indexación:} + +\liststyleLvii +\begin{itemize} +\item \foreignlanguage{spanish}{Índice entero: El valor del índice puede ser un número entero positivo o un entero +negativo. Si el índice es negativo, es relativo al final de la lista; es decir, +}\textstyleSourceText{\foreignlanguage{spanish}{{}-1}}\foreignlanguage{spanish}{ indica el último elemento de la lista. +El valor de retorno de }\textstyleSourceText{\foreignlanguage{spanish}{item}}\foreignlanguage{spanish}{ es el elemento +en la posición del índice. Si la posición del índice excede el número de elementos en el contenedor o está antes del +elemento 0, el método }\textstyleSourceText{\foreignlanguage{spanish}{item}}\foreignlanguage{spanish}{ devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{Índice }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{: +Utilizando una lista de enteros como índice, +}\textstyleSourceText{\foreignlanguage{spanish}{item}}\foreignlanguage{spanish}{ devuelve una +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{, y cada elemento en el valor devuelto +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{ es un elemento correspondiente a cada +índice entero en el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{. los el +valor de la expresión }\textstyleSourceText{\foreignlanguage{spanish}{[3, 2, 1].item([0, +2])}}\foreignlanguage{spanish}{ es }\textstyleSourceText{\foreignlanguage{spanish}{[3, 1]}}\foreignlanguage{spanish}{. +Si una tipo de elemento en el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{ no es un número entero, entonces el +el valor en esa posición en el valor de retorno +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} +\item \foreignlanguage{spanish}{Índice +}\textstyleSourceText{\foreignlanguage{spanish}{range}}\foreignlanguage{spanish}{: Usando un rango de enteros como +índice, }\textstyleSourceText{\foreignlanguage{spanish}{item}}\foreignlanguage{spanish}{ devuelve una +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{. El valor devuelto almacena los +elementos indexados de la }\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{ desde el +límite inferior hasta el límite superior del parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{range}}\foreignlanguage{spanish}{. Si el índice excede el rango de +índice de la 'lista' indexada, el retorno value +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ usará +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ para llenar la posición más allá del +índice.} +\end{itemize} +\paragraph[Método setitem]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{setitem}}} +\hypertarget{RefHeadingToc357573639824055}{}\foreignlanguage{spanish}{Establece el valor de la posición especificada en +el contenedor. El prototipo de este método es }\textstyleSourceText{\foreignlanguage{spanish}{setitem(indice, +valor)}}\foreignlanguage{spanish}{, }\textstyleSourceText{\foreignlanguage{spanish}{indice}}\foreignlanguage{spanish}{ +es la posición del elemento a escribir y +}\textstyleSourceText{\foreignlanguage{spanish}{valor}}\foreignlanguage{spanish}{ es el valor a escribir. +}\textstyleSourceText{\foreignlanguage{spanish}{indice}}\foreignlanguage{spanish}{ es el valor de índice entero de la +posición de escritura. Las posiciones de índice fuera del rango de índice del contenedor harán que +}\textstyleSourceText{\foreignlanguage{spanish}{setitem}}\foreignlanguage{spanish}{ no se ejecute.} + +\paragraph[Método size]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{size}}} +\hypertarget{RefHeadingToc357593639824055}{}\foreignlanguage{spanish}{Devuelve el número de elementos en el contenedor, +que es la longitud del contenedor. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{size()}}\foreignlanguage{spanish}{.} + +\paragraph[Método resize]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{resize}}} +\hypertarget{RefHeadingToc357613639824055}{}\foreignlanguage{spanish}{Restablece la +}\textstyleSourceText{\foreignlanguage{spanish}{lista}}\foreignlanguage{spanish}{ a la longitud del contenedor. El +prototipo de este método es }\textstyleSourceText{\foreignlanguage{spanish}{resize(count)}}\foreignlanguage{spanish}{, +y el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{count}}\foreignlanguage{spanish}{ es la nueva longitud +del contenedor. Al usar }\textstyleSourceText{\foreignlanguage{spanish}{resize}}\foreignlanguage{spanish}{ para +aumentar la longitud del contenedor, el nuevo elemento se inicializará en +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{. El uso de +}\textstyleSourceText{\foreignlanguage{spanish}{resize}}\foreignlanguage{spanish}{ para reducir la longitud del +contenedor descartará algunos elementos al final del contenedor. P.ej:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +l = [1, 2, 3]} + +{\selectlanguage{spanish}\ttfamily +l.resize(5) \# Expansion, l == [1, 2, 3, nil, nil]} + +{\selectlanguage{spanish}\ttfamily +l.resize(2) \# Reduce, l == [1, 2]} + +\paragraph[Método iter]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{iter}}} +\hypertarget{RefHeadingToc357633639824055}{}\foreignlanguage{spanish}{Devuelve un iterador para recorrer el contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ actual.} + +\paragraph[Método find]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{find}}} +\hypertarget{RefHeadingToc357653639824055}{}\foreignlanguage{spanish}{Similar a +}\textstyleSourceText{\foreignlanguage{spanish}{item}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{list[idx]}}\foreignlanguage{spanish}{. La única diferencia es que si el +índice está fuera de rango, }\textstyleSourceText{\foreignlanguage{spanish}{find}}\foreignlanguage{spanish}{ devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ en su lugar o genera una excepción.} + +\paragraph[Método reverse]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{reverse}}} +\hypertarget{RefHeadingToc357673639824055}{}{\selectlanguage{spanish} +Cambia la lista en el lugar e invierte el orden de los elementos. También devuelve la lista resultante.} + +\subsubsection[7.1.3 Clase map]{\foreignlanguage{spanish}{7.1.3 }\foreignlanguage{spanish}{Clase +}\textstyleSourceText{\foreignlanguage{spanish}{map}}} +\hypertarget{RefHeadingToc357693639824055}{}\foreignlanguage{spanish}{La clase +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ es un tipo de clase incorporado que se +utiliza para proporcionar un contenedor desordenado de pares clave-valor. Dentro del intérprete de Berry, +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ usa la tabla Hash para su +implementación. Puede utilizar pares de llaves para construir un contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{. El uso de un par de llaves vacías +}\textstyleSourceText{\foreignlanguage{spanish}{\{\}}}\foreignlanguage{spanish}{ generará una instancia de +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ vacía. Si necesita construir una +instancia de }\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ que no esté vacía, use dos +puntos para separar la clave y el valor, y use un punto y coma para separar varios pares clave-valor. Por ejemplo, +}\textstyleSourceText{\foreignlanguage{spanish}{\{0: 1, 2: 3\}}}\foreignlanguage{spanish}{ tiene dos pares clave-valor +(0,1) y (2,3). También puede obtener una instancia de +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ vacía llamando a la clase +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{.} + +\paragraph[Método map (Constructor)]{\foreignlanguage{spanish}{Método +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ (Constructor)}} +\hypertarget{RefHeadingToc357713639824055}{}\foreignlanguage{spanish}{Inicializa el contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{, este método no acepta parámetros. +Ejecutar }\textstyleSourceText{\foreignlanguage{spanish}{map()}}\foreignlanguage{spanish}{ obtendrá una instancia de +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ vacía.} + +\paragraph[Método tostring]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{tostring}}} +\hypertarget{RefHeadingToc357733639824055}{}\foreignlanguage{spanish}{Serializa +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ como una cadena y regresa. La cadena +serializada es similar a la escritura literal. Por ejemplo, el resultado de ejecutar +}\textstyleSourceText{\foreignlanguage{spanish}{{}'str': 1, 0: 2}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}'str': 1, 0: +2{\textquotedbl}}}\foreignlanguage{spanish}{. Si el contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ se refiere a sí mismo, la posición +correspondiente utilizará puntos suspensivos en lugar del valor específico:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +m = \{'map': nil,'texto':'hola'\}} + +{\selectlanguage{spanish}\ttfamily +m['map'] = m} + +{\selectlanguage{spanish}\ttfamily +print(m) \# \{'texto':'hola','map': \{...\}\}} + +\paragraph[Método insert]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{insert}}} +\hypertarget{RefHeadingToc357753639824055}{}\foreignlanguage{spanish}{Inserta un par clave-valor en el contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{insert(llave, valor)}}\foreignlanguage{spanish}{, el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{llave}}\foreignlanguage{spanish}{ es la clave a insertar, y +}\textstyleSourceText{\foreignlanguage{spanish}{valor}}\foreignlanguage{spanish}{ es el valor a insertar. Si el +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ clave que se va a insertar existe en el +contenedor, se actualizará el par clave-valor original.} + +\paragraph[Método remove]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{remove}}} +\hypertarget{RefHeadingToc357773639824055}{}\foreignlanguage{spanish}{Elimina un par clave-valor del contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{remove(llave)}}\foreignlanguage{spanish}{, y el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{llave}}\foreignlanguage{spanish}{ es la clave del par clave-valor que +se eliminará.} + +\paragraph[Método item]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{item}}} +\hypertarget{RefHeadingToc357793639824055}{}\foreignlanguage{spanish}{Obtiene un valor en el contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{item(llave)}}\foreignlanguage{spanish}{, el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{llave}}\foreignlanguage{spanish}{ es la clave del valor a obtener, y el +valor de retorno del método es el valor correspondiente a la clave.} + +\paragraph[Método setitem]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{setitem}}} +\hypertarget{RefHeadingToc357813639824055}{}\foreignlanguage{spanish}{Establece el valor correspondiente a la clave +especificada en el contenedor. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{setitem(clave, valor)}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{clave}}\foreignlanguage{spanish}{ es la clave del par clave-valor a +escribir, y }\textstyleSourceText{\foreignlanguage{spanish}{valor}}\foreignlanguage{spanish}{ es el valor a escribir. +Si no hay un par clave-valor con la clave +}\textstyleSourceText{\foreignlanguage{spanish}{clave}}\foreignlanguage{spanish}{ en el contenedor, el método +}\textstyleSourceText{\foreignlanguage{spanish}{setitem}}\foreignlanguage{spanish}{ fallará.} + +\paragraph[Método size]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{size}}} +\hypertarget{RefHeadingToc357833639824055}{}\foreignlanguage{spanish}{Devuelve el número de pares clave-valor del +contenedor }\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{, que es la longitud del +contenedor. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{size()}}\foreignlanguage{spanish}{.} + +\paragraph[Método contains]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{contains}}} +\hypertarget{RefHeadingToc357853639824055}{}\foreignlanguage{spanish}{Devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{true}}\foreignlanguage{spanish}{ booleano si se encuentra un par +clave-valor coincidente en el contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{; de lo contrario, +}\textstyleSourceText{\foreignlanguage{spanish}{false}}\foreignlanguage{spanish}{. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{contains(llave)}}\foreignlanguage{spanish}{.} + +\paragraph[Método find]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{find}}} +\hypertarget{RefHeadingToc357873639824055}{}\foreignlanguage{spanish}{Devuelve el valor correspondiente a la clave +especificada en el contenedor. El prototipo de este método es +}\textstyleSourceText{\foreignlanguage{spanish}{find(llave)}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{find(llave, valor\_defecto)}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{llave}}\foreignlanguage{spanish}{ es la clave del par clave-valor al +que se accederá, y }\textstyleSourceText{\foreignlanguage{spanish}{valor\_defecto}}\foreignlanguage{spanish}{ es el +valor predeterminado devuelto si la clave no se encuentra. Si no se especifica ningún valor predeterminado, se devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ en su lugar.} + +\subsubsection[7.1.4 Clase range]{\foreignlanguage{spanish}{7.1.4 }\foreignlanguage{spanish}{Clase +}\textstyleSourceText{\foreignlanguage{spanish}{range}}} +\hypertarget{RefHeadingToc357893639824055}{}\foreignlanguage{spanish}{La clase se usa para representar un intervalo +cerrado entero. Utilice el operador binario +}\textstyleSourceText{\foreignlanguage{spanish}{..}}\foreignlanguage{spanish}{ para construir una instancia de +}\textstyleSourceText{\foreignlanguage{spanish}{range}}\foreignlanguage{spanish}{. Los operandos izquierdo y derecho +del operador deben ser números enteros. Por ejemplo, +}\textstyleSourceText{\foreignlanguage{spanish}{0..10}}\foreignlanguage{spanish}{ significa el intervalo entero [0,10] +${\cap}$ $\mathbb{Z}$.} + +\foreignlanguage{spanish}{Si no especifica el rango alto, se establece en +}\textstyleSourceText{\foreignlanguage{spanish}{MAXINT}}\foreignlanguage{spanish}{. Ejemplo: +}\textstyleSourceText{\foreignlanguage{spanish}{imprimir(0..) \# (0..9223372036854775807)}} + +{\selectlanguage{spanish} +Por lo general, hay dos formas de recorrer una lista:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +l = [1,2,3,4]} + +{\selectlanguage{spanish}\ttfamily +for e:l print(e) end \# 1/2/3/4} + +{\selectlanguage{spanish}\ttfamily +for i:0..size(l)-1 print(l[i]) end \# 1/2/3/4} + +\subsubsection[Clase bytes]{\foreignlanguage{spanish}{Clase }\textstyleSourceText{\foreignlanguage{spanish}{bytes}}} +\hypertarget{RefHeadingToc357913639824055}{}\foreignlanguage{spanish}{Los objetos +}\textstyleSourceText{\foreignlanguage{spanish}{bytes}}\foreignlanguage{spanish}{ se representan como matrices de bytes +hexadecimales. El constructor }\textstyleSourceText{\foreignlanguage{spanish}{bytes}}\foreignlanguage{spanish}{ toma +una cadena de Hex y construye el búfer en memoria.} + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes()} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes('{}')} + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}1155AA{\textquotedbl}) \ \# secuencia de bytes 0x11 0x55 0xAA} + +{\selectlanguage{spanish}\ttfamily +size(b) \ \# 3 = 3 bytes} + +{\selectlanguage{spanish}\ttfamily +b[0] \ \ \ \ \# 17 (0x11)} + +{\selectlanguage{spanish}\ttfamily +b[0] = 16 \ \# \ asigna el primer byte} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes('1055AA')} + +\paragraph[Método bytes (Constructor)]{\foreignlanguage{spanish}{Método +}\textstyleSourceText{\foreignlanguage{spanish}{bytes}}\foreignlanguage{spanish}{ (Constructor)}} +\hypertarget{RefHeadingToc357933639824055}{}{\selectlanguage{spanish} +Inicializar una matriz de bytes. Hay varias opciones.} + +{\selectlanguage{spanish}\bfseries +Opción 1: valor vacío} + +\textstyleSourceText{\foreignlanguage{spanish}{bytes()}}\foreignlanguage{spanish}{ crea una nueva matriz de bytes vacía. +}\textstyleSourceText{\foreignlanguage{spanish}{tamaño(bytes()) == 0}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +No hay límite en el tamaño de una matriz de bytes, excepto la memoria disponible. Se asigna un búfer interno y se +reasigna en caso de que el anterior fuera demasiado pequeño. El búfer inicial es de 36 bytes, pero puede preasignar un +búfer más grande (o más pequeño) si sabe de antemano el tamaño necesario.} + +{\selectlanguage{spanish} +De manera similar, el búfer se reduce automáticamente si se usa menos del tamaño necesario.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes(4096) \ \ \# 4096 bytes preasignados} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Opción 2: valor inicial} + +{\selectlanguage{spanish} +Si el primer argumento es una {\textquotedbl}cadena{\textquotedbl}, se analiza como una lista de valores hexadecimales. +Puede agregar un segundo argumento opcional para preasignar un búfer más grande.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}BEEF0000{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes('beef0000')} + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}112233{\textquotedbl}, 128) \ \ \# \ preasignar 128 bytes internamente} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes('112233')} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Opción 3: tamaño fijo} + +{\selectlanguage{spanish} +Si el tamaño proporcionado es negativo, el tamaño de la matriz es fijo y no se puede reducir ni aumentar.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes(-8)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes('0000000000000000')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}AA{\textquotedbl}, -4)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes('AA000000')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}1122334455{\textquotedbl}, -4)} + +{\selectlanguage{spanish}\ttfamily +atributo\_error: tamaño del objeto en bytes es fijo y no se puede cambiar el tamaño} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Opción 4: asignación de memoria} + +{\selectlanguage{spanish}\bfseries +Precaución, use con mucho cuidado} + +\foreignlanguage{spanish}{En este modo, la matriz de bytes se asigna a una región específica de la memoria. Debe +proporcionar la dirección base como }\textstyleSourceText{\foreignlanguage{spanish}{comptr}}\foreignlanguage{spanish}{ +y el tamaño. El tamaño siempre se fija, ya sea positivo o negativo. Esta función es +}\foreignlanguage{spanish}{\textbf{peligrosa}}\foreignlanguage{spanish}{ ya que puede acceder a cualquier ubicación de +la memoria, lo que provoca un bloqueo si la ubicación está protegida o no es válida. Usar con cuidado.} + +\foreignlanguage{spanish}{En este caso, +}\textstyleSourceText{\foreignlanguage{spanish}{b.ismapped()}}\foreignlanguage{spanish}{ devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{true}}\foreignlanguage{spanish}{ indicando un búfer de memoria mapeado. +En todos los demás casos, }\textstyleSourceText{\foreignlanguage{spanish}{b.ismapped()}}\foreignlanguage{spanish}{ +devuelve }\textstyleSourceText{\foreignlanguage{spanish}{falso}}\foreignlanguage{spanish}{. Esto se usa típicamente +para saber si Berry asignó el búfer o no, y si los subelementos deben desasignarse explícitamente.} + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +import introspect} + +{\selectlanguage{spanish}\ttfamily +def f() return 0 end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +addr = introspect.toptr(f)} + +{\selectlanguage{spanish}\ttfamily +print(addr) \ \ \# {\textless}ptr: 0x3ffeaf88{\textgreater}} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes(addr, 8)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes('F8EAFE3F24000000')} + +{\selectlanguage{spanish}\ttfamily +\# \ este ejemplo muestra los primeros 8 bytes del objeto de función en la memoria} + +\paragraph[Método size]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{size}}} +\hypertarget{RefHeadingToc357953639824055}{}{\selectlanguage{spanish} +Devuelve el número de bytes en la matriz de bytes} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}1122334455{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b.size() \ \ \# 5} + +{\selectlanguage{spanish}\ttfamily +size(b) \ \ \ \# 5} + +\paragraph[Método tostring]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{tostring}}} +\hypertarget{RefHeadingToc357973639824055}{}\foreignlanguage{spanish}{Muestra una forma legible por humanos la matriz de +bytes en hexadecimal. Por defecto, muestra solo los primeros 32 caracteres. Puede solicitar más caracteres agregando un +argumento int con la cantidad máxima de bytes que desea convertir. +}\textstyleSourceText{\foreignlanguage{spanish}{tostring}}\foreignlanguage{spanish}{ se usa internamente cuando se +imprime un objeto. }\textstyleSourceText{\foreignlanguage{spanish}{print(b)}}\foreignlanguage{spanish}{ es equivalente +a }\textstyleSourceText{\foreignlanguage{spanish}{print(b.tostring())}}\foreignlanguage{spanish}{. Es diferente de +}\textstyleSourceText{\foreignlanguage{spanish}{asstring}}\foreignlanguage{spanish}{, que convierte una matriz de bytes +en el objeto de cadena de bajo nivel equivalente sin ninguna codificación.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}1122334455{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b.tostring() \ \ \# 'bytes({\textbackslash}'1122334455{\textbackslash}')'} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes()} + +{\selectlanguage{spanish}\ttfamily +b.resize(64) \ \ \# redimenciona a 64 bytes} + +{\selectlanguage{spanish}\ttfamily +b.tostring() \ \ \# +'bytes({\textbackslash}'0000000000000000000000000000000000000000000000000000000000000000...{\textbackslash}')'} + +{\selectlanguage{spanish}\ttfamily +b.tostring(500) \# +'bytes({\textbackslash}'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{\textbackslash}')'} + +\paragraph[Método tohex]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{tohex}}} +\hypertarget{RefHeadingToc357993639824055}{}\foreignlanguage{spanish}{Convierte la matriz de bytes en una cadena +hexadecimal, similar a la devuelta por +}\textstyleSourceText{\foreignlanguage{spanish}{tostring()}}\foreignlanguage{spanish}{ pero sin decoradores.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}1122334455{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b.tohex() \ \ \# '1122334455'} + +\paragraph[Método fromhex]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{fromhex}}} +\hypertarget{RefHeadingToc358013639824055}{}{\selectlanguage{spanish} +Actualiza el contenido de la matriz de bytes a partir de una nueva cadena hexadecimal. Esto permite cargar una nueva +cadena hexadecimal sin asignar un nuevo objeto de bytes.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}1122334455{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b.fromhex({\textquotedbl}AABBCC{\textquotedbl}) \ \# bytes('AABBCC')} + +\paragraph[Método clear]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{clear}}} +\hypertarget{RefHeadingToc358033639824055}{}{\selectlanguage{spanish} +Vuelve a poner la matriz de bytes en vacío} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}1122{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b.clear()} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes()} + +\paragraph[Método resize]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{resize}}} +\hypertarget{RefHeadingToc358053639824055}{}{\selectlanguage{spanish} +Reduce o expande la matriz de bytes para que coincida con el tamaño especificado. Si se expande, se agregan bytes NULL +(0x00) al final del búfer.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}11223344{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b.resize(6)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes('112233440000')} + +{\selectlanguage{spanish}\ttfamily +b.resize(2)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \# bytes('1122')} + +\paragraph[Métodos de concatenación + y ..]{\foreignlanguage{spanish}{Métodos de concatenación +}\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{..}}} +\hypertarget{RefHeadingToc358073639824055}{}\foreignlanguage{spanish}{Puede usar +}\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{ para concatenar dos listas de +}\textstyleSourceText{\foreignlanguage{spanish}{bytes}}\foreignlanguage{spanish}{, creando un nuevo objeto +}\textstyleSourceText{\foreignlanguage{spanish}{bytes}}\foreignlanguage{spanish}{. +}\textstyleSourceText{\foreignlanguage{spanish}{..}}\foreignlanguage{spanish}{ cambia la lista en su lugar y se puede +usar para agregar un objeto }\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{ (1 byte) o +}\textstyleSourceText{\foreignlanguage{spanish}{bytes.}} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}1122{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +c = bytes({\textquotedbl}3344{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +d = b + c \ \ \ \ \ \ \ \ \ \ \# b y c no cambian} + +{\selectlanguage{spanish}\ttfamily +print(d) \ \ \ \ \ \ \ \ \ \ \ \# bytes('11223344')} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \# bytes('1122')} + +{\selectlanguage{spanish}\ttfamily +print(c) \ \ \ \ \ \ \ \ \ \ \ \# bytes('3344')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +e = b..c \ \ \ \ \ \ \ \ \ \ \ \# ahora b ha cambiado} + +{\selectlanguage{spanish}\ttfamily +print(e) \ \ \ \ \ \ \ \ \ \ \ \# bytes('11223344')} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \# bytes('11223344')} + +{\selectlanguage{spanish}\ttfamily +print(c) \ \ \ \ \ \ \ \ \ \ \ \# bytes('3344')} + +\paragraph[Método de acceso a bytes [{]}]{\foreignlanguage{spanish}{Método de acceso a bytes +}\textstyleSourceText{\foreignlanguage{spanish}{[]}}} +\hypertarget{RefHeadingToc358093639824055}{}{\selectlanguage{spanish} +Puede acceder a bytes individuales como enteros, para leer y escribir. Los valores que no están en el rango de 0 a 255 +se cortan silenciosamente.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}010203{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +print(b[0]) \ \ \ \ \ \ \ \ \# 1} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# \ índices negativos cuentan desde el final} + +{\selectlanguage{spanish}\ttfamily +print(b[-1]) \ \ \ \ \ \ \ \# 3} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# \ fuera de los límites genera una excepción} + +{\selectlanguage{spanish}\ttfamily +print(b[5]) \ \ \ \ \ \ \ \ \# index\_error: índice de bytes fuera de rango} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b[0] = -1} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \# bytes('FF0203')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b[1] = 256} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \# bytes('FF0003')} + +\paragraph[Método de acceso de rango [{]}]{\foreignlanguage{spanish}{Método de acceso de rango +}\textstyleSourceText{\foreignlanguage{spanish}{[]}}} +\hypertarget{RefHeadingToc358113639824055}{}\foreignlanguage{spanish}{Puede usar el descriptor de acceso +}\textstyleSourceText{\foreignlanguage{spanish}{[]}}\foreignlanguage{spanish}{ con un rango para obtener una sublista +de }\textstyleSourceText{\foreignlanguage{spanish}{bytes}}\foreignlanguage{spanish}{. Si un índice es negativo, se toma +del final de la matriz.} + +\foreignlanguage{spanish}{Esta construcción no se puede usar como un +}\foreignlanguage{spanish}{\textit{lvalue}}\foreignlanguage{spanish}{, es decir, no se puede empalmar como:} + +\textstyleSourceText{\foreignlanguage{spanish}{b[1..2] = bytes({\textquotedbl}0011{\textquotedbl}) \# no +permitido}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}001122334455{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +print(b[1..2]) \ \ \ \ \ \# bytes('1122')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# elimina los primeros 2 bytes} + +{\selectlanguage{spanish}\ttfamily +print(b[2..-1]) \ \ \ \ \# bytes('22334455')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# eliminar los últimos 2 bytes} + +{\selectlanguage{spanish}\ttfamily +print(b[0..-3]) \ \ \ \ \# bytes('00112233')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# \ se permite el sobreimpulso} + +{\selectlanguage{spanish}\ttfamily +print(b[4..10]) \ \ \ \ \# bytes('4455')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# \ índices invertidos devuelven una matriz vacía} + +{\selectlanguage{spanish}\ttfamily +print(b[5..4]) \ \ \ \ \ \# bytes('{}')} + + +\bigskip + +\foreignlanguage{spanish}{Los métodos estándar +}\textstyleSourceText{\foreignlanguage{spanish}{item}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{setitem}}\foreignlanguage{spanish}{ se implementan y se asignan de +forma transparente al operador }\textstyleSourceText{\foreignlanguage{spanish}{[]}}\foreignlanguage{spanish}{.} + +\paragraph[Método copy]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{copy}}} +\hypertarget{RefHeadingToc358133639824055}{}\foreignlanguage{spanish}{Crea una nueva copia nueva del objeto +}\textstyleSourceText{\foreignlanguage{spanish}{bytes}}\foreignlanguage{spanish}{. Se asigna un nuevo búfer de memoria +y se duplican los datos.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}1122{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \# bytes('1122')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +c = b.copy()} + +{\selectlanguage{spanish}\ttfamily +print(c) \ \ \ \ \ \ \ \ \ \# bytes('1122')} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b.clear()} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \# bytes('{}')} + +{\selectlanguage{spanish}\ttfamily +print(c) \ \ \ \ \ \ \ \ \ \# bytes('1122')bytes('1122')} + +\paragraph[Métodos get, geti]{\foreignlanguage{spanish}{Métodos }\textstyleSourceText{\foreignlanguage{spanish}{get, +geti}}} +\hypertarget{RefHeadingToc358153639824055}{}\foreignlanguage{spanish}{Lea un valor de 1/2/4 bytes de cualquier +desplazamiento en la matriz de bytes. El modo estándar es little endian, si se especifica un tamaño negativo habilita +big endian. }\textstyleSourceText{\foreignlanguage{spanish}{get}}\foreignlanguage{spanish}{ devuelve valores sin signo, +mientras que }\textstyleSourceText{\foreignlanguage{spanish}{geti}}\foreignlanguage{spanish}{ devuelve valores con +signo.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b.get({\textless}offset{\textgreater}, {\textless}size{\textgreater}) -{\textgreater} \ objeto de bytes} + + +\bigskip + +\foreignlanguage{spanish}{Si el desplazamiento está fuera de rango, se devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{ (no se genera ninguna excepción).} + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}010203040506{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +print(b.get(2,2)) \ \ \ \ \ \ \ \ \# 1027 - 0x0403 read 2 bytes little endian} + +{\selectlanguage{spanish}\ttfamily +print(b.get(2,-2)) \ \ \ \ \ \ \ \# \ 772 - 0x0304 read 2 bytes big endian} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +print(b.get(2,4)) \ \ \ \ \ \ \ \ \# 100992003 - 0x06050403 - little endian} + +{\selectlanguage{spanish}\ttfamily +print(b.get(2,-4)) \ \ \ \ \ \ \ \# \ 50595078 - 0x03040506 - big endian} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}FEFF{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +print(b.get(0, 2)) \ \ \ \ \ \ \ \# 65534 - 0xFFFE} + +{\selectlanguage{spanish}\ttfamily +print(b.geti(0, 2)) \ \ \ \ \ \ \# -2 - 0xFFFE} + +\paragraph[Métodos set, seti]{\foreignlanguage{spanish}{Métodos }\textstyleSourceText{\foreignlanguage{spanish}{set, +seti}}} +\hypertarget{RefHeadingToc358173639824055}{}\foreignlanguage{spanish}{Similar a +}\textstyleSourceText{\foreignlanguage{spanish}{get}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{geti}}\foreignlanguage{spanish}{, permite establecer un valor de 1/2/4 +bytes en cualquier desplazamiento. }\textstyleSourceText{\foreignlanguage{spanish}{seti}}\foreignlanguage{spanish}{ usa +números enteros con signo, }\textstyleSourceText{\foreignlanguage{spanish}{set}}\foreignlanguage{spanish}{ no tiene +signo (en realidad, no hace la diferencia).} + +{\selectlanguage{spanish} +Si el desplazamiento está fuera de rango, no se realiza ningún cambio (no se genera ninguna excepción).} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +bytes.set({\textless}offset{\textgreater}, {\textless}valor{\textgreater}, {\textless}tamaño{\textgreater})} + +\paragraph[Método add]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{add}}} +\hypertarget{RefHeadingToc358193639824055}{}{\selectlanguage{spanish} +Este método agrega valor de 1/2/4 bytes (little endian o big endian) al final del búfer. Si el tamaño es negativo, el +valor se trata como big endian.} + +{\selectlanguage{spanish}\ttfamily +b.add({\textless}valor{\textgreater}, {\textless}tamaño{\textgreater})} + + +\bigskip + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}0011{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b.add(0x22, 1)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \ \# bytes('001122')} + +{\selectlanguage{spanish}\ttfamily +b.add(0x2233, 2)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \ \# bytes('0011223322')} + +{\selectlanguage{spanish}\ttfamily +b.add(0x22334455, 4)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \ \# bytes('001122332255443322')} + +{\selectlanguage{spanish}\ttfamily +b.add(0x00)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \ \# bytes('00112233225544332200')} + +{\selectlanguage{spanish}\ttfamily +b.clear()} + +{\selectlanguage{spanish}\ttfamily +b.add(0x0102, -2)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \ \# bytes('0102')} + +{\selectlanguage{spanish}\ttfamily +b.add(0x01020304, -4)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \ \# bytes('010201020304')} + +\paragraph[Método asstring]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{asstring}}} +\hypertarget{RefHeadingToc358213639824055}{}{\selectlanguage{spanish} +Convierte un búfer de bytes en una cadena. El búfer se convierte tal cual sin ninguna consideración de codificación. Si +el búfer contiene caracteres NULL, la cadena se truncará.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b=bytes({\textquotedbl}3344{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +print(b.asstring()) \ \ \# '3D'} + +\paragraph[Método fromstring]{\foreignlanguage{spanish}{Método +}\textstyleSourceText{\foreignlanguage{spanish}{fromstring}}} +\hypertarget{RefHeadingToc358233639824055}{}{\selectlanguage{spanish} +Convierte un búfer de bytes en una cadena. El búfer se convierte tal cual sin ninguna consideración de codificación. Si +el búfer contiene caracteres NULL, la cadena se truncará.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b=bytes().fromstring({\textquotedbl}Hola{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \ \ \# bytes('48656C6C6F')} + +\paragraph[Métodos de manipulación de bits setbits, getbits]{\foreignlanguage{spanish}{Métodos de manipulación de bits +}\textstyleSourceText{\foreignlanguage{spanish}{setbits, getbits}}} +\hypertarget{RefHeadingToc358253639824055}{}{\selectlanguage{spanish} +Puede leer y escribir a nivel de subbytes, especificando de qué bit a qué bit. El desplazamiento está en bits, no en +bytes. Agregue el número de bytes * 8.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b.setbits({\textless}offset\_bits{\textgreater}, {\textless}len\_bits{\textgreater}, {\textless}value{\textgreater})} + +{\selectlanguage{spanish}\ttfamily +b.getbits({\textless}offset\_bits{\textgreater}, {\textless}len\_bits{\textgreater})} + +\paragraph[Codificación en base64, método tob64]{\foreignlanguage{spanish}{Codificación en base64, método +}\textstyleSourceText{\foreignlanguage{spanish}{tob64}}} +\hypertarget{RefHeadingToc358273639824055}{}{\selectlanguage{spanish} +Convierte una matriz de bytes en una cadena base64.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes('deadbeef0011')} + +{\selectlanguage{spanish}\ttfamily +s = b.tob64()} + +{\selectlanguage{spanish}\ttfamily +print(s) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \# 3q2+7wAR} + +\paragraph[Decodificación en base64, método fromb64]{\foreignlanguage{spanish}{Decodificación en base64, método +}\textstyleSourceText{\foreignlanguage{spanish}{fromb64}}} +\hypertarget{RefHeadingToc358293639824055}{}{\selectlanguage{spanish} +Convierte una cadena base64 en una matriz de bytes.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +s = '3q2+7wAR'} + +{\selectlanguage{spanish}\ttfamily +b = bytes().fromb64(s)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \# bytes('DEADBEEF0011')} + +\paragraph[Métodos getfloat y setfloat]{\foreignlanguage{spanish}{Métodos +}\textstyleSourceText{\foreignlanguage{spanish}{getfloat}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{setfloat}}} +\hypertarget{RefHeadingToc358313639824055}{}\foreignlanguage{spanish}{Similar a +}\textstyleSourceText{\foreignlanguage{spanish}{get/set}}\foreignlanguage{spanish}{, permite leer o escribir un valor +en coma flotante de 32 bits.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b.getfloat({\textless}offset{\textgreater})} + +{\selectlanguage{spanish}\ttfamily +b.getfloat({\textless}offset{\textgreater}, {\textless}number{\textgreater})} + +{\selectlanguage{spanish}\ttfamily +b = bytes({\textquotedbl}00000000{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b.getfloat(0) \ \ \ \ \# 0} + +{\selectlanguage{spanish}\ttfamily +b.setfloat(0, -1.5)} + +{\selectlanguage{spanish}\ttfamily +print(b) \ \# bytes('0000C0BF')} + +{\selectlanguage{spanish}\ttfamily +b.getfloat(0) \ \# -1.5} + +\paragraph[Método \_buffer]{\foreignlanguage{spanish}{Método }\textstyleSourceText{\foreignlanguage{spanish}{\_buffer}}} +\hypertarget{RefHeadingToc358333639824055}{}{\selectlanguage{spanish} +\textbf{Característica avanzada}: devuelve la dirección del búfer en la memoria, para usar con código C.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +b = bytes('1122')} + +{\selectlanguage{spanish}\ttfamily +b.\_buffer() \ \# {\textless}ptr: 0x600000c283c0{\textgreater}} + +\paragraph[Método \_change\_buffer]{\foreignlanguage{spanish}{Método +}\textstyleSourceText{\foreignlanguage{spanish}{\_change\_buffer}}} +\hypertarget{RefHeadingToc358353639824055}{}\foreignlanguage{spanish}{\textbf{Característica +avanzada}}\foreignlanguage{spanish}{: funciona solo para búferes mapeados (es decir, +}\textstyleSourceText{\foreignlanguage{spanish}{b.ismapped() == true}}\foreignlanguage{spanish}{), permite reasignar el +búfer a una nueva dirección de memoria. Esto permite reutilizar el objeto bytes() sin reasignar una nueva instancia.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# \ este ejemplo usa la asignación de punteros, use con mucho cuidado} + +{\selectlanguage{spanish}\ttfamily +b1 = bytes({\textquotedbl}11223344{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b2 = bytes({\textquotedbl}AABBCCDD{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +b1.\_buffer() \ \# {\textless}ptr: 0x600000c2c390{\textgreater}} + +{\selectlanguage{spanish}\ttfamily +b2.\_buffer() \ \# {\textless}ptr: 0x600000c24270{\textgreater}} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# ahora creamos c como un búfer asignado de 4 bytes a la dirección de b1} + +{\selectlanguage{spanish}\ttfamily +c = bytes(b1.\_buffer(), 4)} + +{\selectlanguage{spanish}\ttfamily +print(c) \ \# bytes('11223344') -{}- asignado a b1} + +{\selectlanguage{spanish}\ttfamily +c.\_buffer() \ \ \# {\textless}ptr: 0x600000c2c390{\textgreater}} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# \ cambiemos un byte para probarlo} + +{\selectlanguage{spanish}\ttfamily +c[0] = 254} + +{\selectlanguage{spanish}\ttfamily +print(c) \ \# bytes('FE223344')} + +{\selectlanguage{spanish}\ttfamily +print(b1) \# bytes('FE223344') -{}- b1 ha cambiado} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# \ reasignar c al mapa b2} + +{\selectlanguage{spanish}\ttfamily +c.\_change\_buffer(b2.\_buffer())} + +{\selectlanguage{spanish}\ttfamily +print(c) \ \# bytes('AABBCCDD')} + +{\selectlanguage{spanish}\ttfamily +c.\_buffer() \ \# {\textless}ptr: 0x600000c24270{\textgreater}} + +\subsection[7.2 Módulos de expansión]{\selectlanguage{spanish} 7.2 Módulos de expansión} +\hypertarget{RefHeadingToc358373639824055}{}\subsubsection[7.2.1 Módulo JSON]{\selectlanguage{spanish} 7.2.1 Módulo +JSON} +\hypertarget{RefHeadingToc358393639824055}{}{\selectlanguage{spanish} +JSON es un formato ligero de intercambio de datos. Es un subconjunto de JavaScript. Utiliza un formato de texto que es +completamente independiente del lenguaje de programación para representar datos. Berry proporciona un módulo JSON para +proporcionar soporte para datos JSON. El módulo JSON solo contiene dos funciones, {\textquotedbl}cargar{\textquotedbl} +y {\textquotedbl}volcar{\textquotedbl}, que se utilizan para analizar cadenas JSON y multiplicar objetos Berry y +serializar un objeto Berry en texto JSON.} + +\paragraph[Función load]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{load}}} +\hypertarget{RefHeadingToc358413639824055}{}{\selectlanguage{spanish}\ttfamily +load(text)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función se usa para convertir el texto JSON de entrada en un objeto Berry y devolverlo. +Las reglas de conversión se muestran en la Tabla 9 . Si hay un error de sintaxis en el texto JSON, la función devolverá +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Tipo JSON} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Tipo Berry}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Tipo JSON} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Tipo Berry}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{7.76cm}m{7.76cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{nulo}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{nil}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{número}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{entero}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{real}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{cadena}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{cadena}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{matriz}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{lista}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{objeto}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{mapa}}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 9: Reglas de conversión de tipo JSON a tipo Berry} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Ejemplo} + +{\selectlanguage{spanish}\ttfamily +import json} + +{\selectlanguage{spanish}\ttfamily +json.load('0') \# 0} + +{\selectlanguage{spanish}\ttfamily +json.load('[\{{\textquotedbl}nombre{\textquotedbl}: {\textquotedbl}liu{\textquotedbl}, +{\textquotedbl}edad{\textquotedbl}: 13\}, 10.0]') \# [\{'nombre':'liu','edad': 13\}, 10]} + +\paragraph[Función dump]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{dump}}} +\hypertarget{RefHeadingToc358433639824055}{}{\selectlanguage{spanish}\ttfamily +dump(objectp, ['formato'])} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +{\selectlanguage{spanish} +Esta función se usa para serializar el objeto Berry en texto JSON. Las reglas de conversión para la serialización se +muestran en la Tabla 10 .} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Tipo berry} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Tipo JSON}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Tipo berry} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Tipo JSON}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{7.76cm}m{7.76cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{cero}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{nulo}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{entero}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{número}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{verdadero}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{número}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{lista}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{matriz}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{mapa}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{objeto}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{mapa}}\foreignlanguage{spanish}{ Clave de} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{cadena}}\\ +\centering{\selectlanguage{spanish} otro} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{cadena}}\\ +\end{supertabular} +\end{center} +{\selectlanguage{spanish}\itshape +Tabla 10: Reglas de conversión de tipo Berry a tipo JSON} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +import json} + +{\selectlanguage{spanish}\ttfamily +json.dump('string') \#'{\textquotedbl}string{\textquotedbl}'} + +{\selectlanguage{spanish}\ttfamily +json.dump('string') \#'{\textquotedbl}string{\textquotedbl}'} + +{\selectlanguage{spanish}\ttfamily +json.dump(\{0:'item 0','list': [0, 1, 2]\}) \#'\{{\textquotedbl}0{\textquotedbl}:{\textquotedbl}item +0{\textquotedbl},{\textquotedbl}list{\textquotedbl}:[0,1,2]\}'} + +{\selectlanguage{spanish}\ttfamily +json.dump(\{0:'item 0','list': [0, 1, 2],'func': print\},'format')} + +{\selectlanguage{spanish}\ttfamily +\#-} + +{\selectlanguage{spanish}\ttfamily +\{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ {\textquotedbl}0{\textquotedbl}: {\textquotedbl}item 0{\textquotedbl},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ {\textquotedbl}list{\textquotedbl}: [} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ 0,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ 1,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ 2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ],} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ {\textquotedbl}func{\textquotedbl}: {\textquotedbl}{\textless}function: 00410310{\textgreater}{\textquotedbl}} + +{\selectlanguage{spanish}\ttfamily +\}} + +{\selectlanguage{spanish}\ttfamily +{}-\#} + +\subsubsection[7.2.2 Módulo matemático]{\selectlanguage{spanish} 7.2.2 Módulo matemático} +\hypertarget{RefHeadingToc358453639824055}{}\foreignlanguage{spanish}{Este módulo se utiliza para proporcionar soporte +para funciones matemáticas, como las funciones trigonométricas y las funciones de raíz cuadrada de uso común. Para usar +el módulo matemático, primero use la instrucción }\textstyleSourceText{\foreignlanguage{spanish}{import +math}}\foreignlanguage{spanish}{. Todos los ejemplos de esta sección asumen que el módulo se ha importado +correctamente.} + +\paragraph[Constante pi]{\foreignlanguage{spanish}{Constante }\textstyleSourceText{\foreignlanguage{spanish}{pi}}} +\hypertarget{RefHeadingToc358473639824055}{}{\selectlanguage{spanish} +El valor de Pi \textit{$\pi $} es un tipo de número real, aproximadamente igual a 3.141592654.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + +{\selectlanguage{spanish}\ttfamily +math.pi \# 3.14159} + +\paragraph[Función abs]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{abs}}} +\hypertarget{RefHeadingToc358493639824055}{}{\selectlanguage{spanish}\ttfamily +abs(valor)} + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor absoluto del parámetro, que puede ser un número entero o un +número real. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primer parámetro. El tipo de retorno de la función +}\textstyleSourceText{\foreignlanguage{spanish}{abs}}\foreignlanguage{spanish}{ es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + +{\selectlanguage{spanish}\ttfamily +math.abs(-1) \# 1} + +{\selectlanguage{spanish}\ttfamily +math.abs(1.5) \# 1.5} + +\paragraph[Función ceil]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{ceil}}} +\hypertarget{RefHeadingToc358513639824055}{}{\selectlanguage{spanish}\ttfamily +ceil(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor redondeado hacia arriba del parámetro, es decir, el valor +entero más pequeño mayor o igual que el parámetro. El parámetro puede ser un número entero o un número real. Si no hay +parámetros, la función devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay +varios parámetros, solo se procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.ceil(-1.2) \# -1} + +{\selectlanguage{spanish}\ttfamily +math.ceil(1.5) \# 2} + +\paragraph[Función floor]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{floor}}} +\hypertarget{RefHeadingToc358533639824055}{}{\selectlanguage{spanish}\ttfamily +floor(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor redondeado hacia abajo del parámetro, que no es mayor que el +valor entero máximo del parámetro. El parámetro puede ser un número entero o un número real. Si no hay parámetros, la +función devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios +parámetros, solo se procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.floor(-1.2) \# -2} + +{\selectlanguage{spanish}\ttfamily +math.floor(1.5) \# 1} + +\paragraph[Función sin]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{sin}}} +\hypertarget{RefHeadingToc358553639824055}{}{\selectlanguage{spanish}\ttfamily +sin(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de la función seno del parámetro. El parámetro puede ser un +número entero o un número real, y la unidad son los radianes. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primer parámetro. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.sin(1) \# 0.841471} + +{\selectlanguage{spanish}\ttfamily +math.sin(math.pi * 0.5) \# 1} + +\paragraph[Función cos]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{cos}}} +\hypertarget{RefHeadingToc358573639824055}{}{\selectlanguage{spanish}\ttfamily +cos(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de la función coseno del parámetro. El parámetro puede ser un +número entero o un número real en radianes. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.cos(1) \# 0.540302} + +{\selectlanguage{spanish}\ttfamily +math.cos(math.pi) \# -1} + +\paragraph[Función tan]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{tan}}} +\hypertarget{RefHeadingToc358593639824055}{}{\selectlanguage{spanish}\ttfamily +tan(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de la función tangente del parámetro. El parámetro puede ser un +número entero o un número real, en radianes. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.tan(1) \# 1.55741} + +{\selectlanguage{spanish}\ttfamily +math.tan(math.pi / 4) \# 1} + +\paragraph[Función asin]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{asin}}} +\hypertarget{RefHeadingToc358613639824055}{}{\selectlanguage{spanish}\ttfamily +asin(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de la función arco seno del parámetro. El parámetro puede ser +un número entero o un número real. El rango de valores es [$-$1,1]. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primero. El tipo de retorno de la función es un número real y la unidad es radianes.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.asin(1) \# 1.5708} + +{\selectlanguage{spanish}\ttfamily +math.asin(0.5) * 180 / math.pi \# 30} + +\paragraph[Función acos]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{acos}}} +\hypertarget{RefHeadingToc358633639824055}{}{\selectlanguage{spanish}\ttfamily +acos(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de la función de arco coseno del parámetro. El parámetro puede +ser un número entero o un número real. El rango de valores es [$-$1,1]. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primero. El tipo de retorno de la función es un número real y la unidad es radianes.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.acos(1) \# 0} + +{\selectlanguage{spanish}\ttfamily +math.acos(0) \# 1.5708} + +\paragraph[Función atán]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{atán}}} +\hypertarget{RefHeadingToc358653639824055}{}{\selectlanguage{spanish}\ttfamily +atan(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de la función arco tangente del parámetro. El parámetro puede +ser un número entero o un número real. El rango de valores es [$-{\infty}$,+${\infty}$]. Si no hay parámetros, la +función devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios +parámetros, solo se procesa el primero. El tipo de retorno de la función es un número real y la unidad es radianes.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.atan(1) * 180 / math.pi \# 45} + +\paragraph[Función sinh]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{sinh}}} +\hypertarget{RefHeadingToc358673639824055}{}{\selectlanguage{spanish}\ttfamily +sinh(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de función de seno hiperbólico del parámetro. Si no hay +parámetros, la función devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay +varios parámetros, solo se procesa el primer parámetro. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.sinh(1) \# 1.1752} + +\paragraph[Función cosh]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{cosh}}} +\hypertarget{RefHeadingToc358693639824055}{}{\selectlanguage{spanish}\ttfamily +cosh(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de la función coseno hiperbólico del parámetro. Si no hay +parámetros, la función devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay +varios parámetros, solo se procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.cosh(1) \# 1.54308} + +\paragraph[Función tanh]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{tanh}}} +\hypertarget{RefHeadingToc358713639824055}{}{\selectlanguage{spanish}\ttfamily +tanh(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de la función tangente hiperbólica del parámetro. Si no hay +parámetros, la función devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay +varios parámetros, solo se procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + +{\selectlanguage{spanish}\ttfamily +math.tanh(1) \# 0.761594} + +\paragraph[Función sqrt]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{sqrt}}} +\hypertarget{RefHeadingToc358733639824055}{}{\selectlanguage{spanish}\ttfamily +sqrt(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve la raíz cuadrada del argumento. El parámetro de esta función no puede +ser negativo. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.sqrt(2) \# 1.41421} + +\paragraph[Función exp]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{exp}}} +\hypertarget{RefHeadingToc358753639824055}{}{\selectlanguage{spanish}\ttfamily +exp(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el valor de la función exponencial del parámetro en función de la +constante natural }\foreignlanguage{spanish}{\textit{e}}\foreignlanguage{spanish}{. Si no hay parámetros, la función +devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo +se procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.exp(1) \# 2.71828} + +\paragraph[Función log]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{log}}} +\hypertarget{RefHeadingToc358773639824055}{}{\selectlanguage{spanish}\ttfamily +log(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el logaritmo natural del argumento. El parámetro debe ser un número +positivo. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +log(valor)} + +\paragraph[Función log10]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{log10}}} +\hypertarget{RefHeadingToc358793639824055}{}{\selectlanguage{spanish}\ttfamily +log10(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función devuelve el logaritmo del parámetro en base 10. El parámetro debe ser un número +positivo. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primero. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.log10(10) \# 1} + +\paragraph[Función deg]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{deg}}} +\hypertarget{RefHeadingToc358813639824055}{}{\selectlanguage{spanish}\ttfamily +deg(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función se utiliza para convertir radianes en ángulos. La unidad del parámetro es +radianes. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primero. El tipo de retorno de la función es un número real y la unidad es un ángulo.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.deg(math.pi) \# 180} + +\paragraph[Función rad]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{rad}}} +\hypertarget{RefHeadingToc358833639824055}{}{\selectlanguage{spanish}\ttfamily +rad(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{Esta función se utiliza para convertir ángulos a radianes. La unidad del parámetro es el +ángulo. Si no hay parámetros, la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay varios parámetros, solo se +procesa el primero. El tipo de retorno de la función es un número real y la unidad es radianes.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.rad(180) \# 3.14159} + +\paragraph[Función pow]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{pow}}} +\hypertarget{RefHeadingToc358853639824055}{}{\selectlanguage{spanish}\ttfamily +pow(x, y)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{El valor de retorno de esta función es el resultado de la expresión +}\foreignlanguage{spanish}{\textit{x}}\foreignlanguage{spanish}{ +}\foreignlanguage{spanish}{\textit{y}}\foreignlanguage{spanish}{ , que es el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{x}}\foreignlanguage{spanish}{ elevado a +}\textstyleSourceText{\foreignlanguage{spanish}{y}}\foreignlanguage{spanish}{. Si los parámetros no están completos, la +función devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, si hay parámetros +adicionales, solo se procesan los dos primeros parámetros. El tipo de retorno de la función es un número real.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.pow(2, 3) \# 8} + +\paragraph[Función srand]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{srand}}} +\hypertarget{RefHeadingToc358873639824055}{}{\selectlanguage{spanish}\ttfamily +srand(valor)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +{\selectlanguage{spanish} +Esta función se utiliza para establecer la semilla del generador de números aleatorios. El tipo del parámetro debe ser +un número entero.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.srand(2)} + +\paragraph[Función rand]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{rand}}} +\hypertarget{RefHeadingToc358893639824055}{}{\selectlanguage{spanish}\ttfamily +Rand()} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +{\selectlanguage{spanish} +Esta función se utiliza para obtener un número entero aleatorio.} + +{\selectlanguage{spanish}\bfseries +Ejemplo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +math.rand()} + +\subsubsection[7.2.3 Módulo de tiempo]{\selectlanguage{spanish} 7.2.3 Módulo de tiempo} +\hypertarget{RefHeadingToc358913639824055}{}{\selectlanguage{spanish} +Este módulo se utiliza para proporcionar funciones relacionadas con el tiempo.} + +\paragraph[Función time]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{time}}} +\hypertarget{RefHeadingToc358933639824055}{}{\selectlanguage{spanish}\ttfamily +time()} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +{\selectlanguage{spanish} +Devuelve la marca de tiempo actual. La marca de tiempo es el tiempo transcurrido desde Unix Epoch (1 de enero de 1970 +00:00:00 UTC), en segundos.} + +\paragraph[Función dump]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{dump}}} +\hypertarget{RefHeadingToc358953639824055}{}{\selectlanguage{spanish}\ttfamily +dump(ts)} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +\foreignlanguage{spanish}{La marca de tiempo de entrada +}\textstyleSourceText{\foreignlanguage{spanish}{ts}}\foreignlanguage{spanish}{ se convierte en un +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ de tiempo, y la correspondencia +clave-valor se muestra en la siguiente tabla:} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries clave} & +\centering{\selectlanguage{spanish}\bfseries valor} & +\centering{\selectlanguage{spanish}\bfseries clave} & +\centering{\selectlanguage{spanish}\bfseries valor} & +\centering{\selectlanguage{spanish}\bfseries clave} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries valor}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries clave} & +\centering{\selectlanguage{spanish}\bfseries valor} & +\centering{\selectlanguage{spanish}\bfseries clave} & +\centering{\selectlanguage{spanish}\bfseries valor} & +\centering{\selectlanguage{spanish}\bfseries clave} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries valor}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{2.453cm}m{2.453cm}m{2.453cm}m{2.453cm}m{2.453cm}m{2.455cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}'year'}} & +\centering{\selectlanguage{spanish} Año (desde 1900)} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}'month'}} & +\centering{\selectlanguage{spanish} Mes (1-12)} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}'day'}} & +\centering\arraybslash{\selectlanguage{spanish} Día (1-31)}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}'hour'}} & +\centering{\selectlanguage{spanish} Hora (0-23)} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}'min'}} & +\centering{\selectlanguage{spanish} Puntos (0-59)} & +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}'sec'}} & +\centering\arraybslash{\selectlanguage{spanish} Segundos (0-59)}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{{}'weekday'}} & +\centering{\selectlanguage{spanish} Semana (1-7)} & +~ + & +~ + & +~ + & +~ +\\ +\end{supertabular} +\end{center} +\foreignlanguage{spanish}{\textit{Tabla 11: La relación clave-valor del valor de retorno de la función +}}\textstyleSourceText{\foreignlanguage{spanish}{time.dump}} + + +\bigskip + +\paragraph[Función clock]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{clock}}} +\hypertarget{RefHeadingToc358973639824055}{}{\selectlanguage{spanish}\ttfamily +Clock()} + + +\bigskip + +{\selectlanguage{spanish}\bfseries +Descripción} + +{\selectlanguage{spanish} +Esta función devuelve el tiempo transcurrido desde el inicio de la ejecución del intérprete hasta que se llama a la +función en segundos. El valor de retorno de esta función es del tipo {\textquotedbl}real{\textquotedbl} y su precisión +de tiempo está determinada por la plataforma específica.} + +\subsubsection[7.2.4 Módulo de cadena (string)]{\selectlanguage{spanish} 7.2.4 Módulo de cadena (string)} +\hypertarget{RefHeadingToc358993639824055}{}\foreignlanguage{spanish}{El módulo +}\textstyleSourceText{\foreignlanguage{spanish}{cadena}}\foreignlanguage{spanish}{ proporciona funciones de +procesamiento de cadenas.} + +\foreignlanguage{spanish}{Para usar el módulo de cadena, primero use la instrucción +}\textstyleSourceText{\foreignlanguage{spanish}{import string}}\foreignlanguage{spanish}{. Todos los ejemplos de esta +sección asumen que el módulo se ha importado correctamente.} + +\paragraph[Función count]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{count}}} +\hypertarget{RefHeadingToc359013639824055}{}{\selectlanguage{spanish}\ttfamily +string.count(s, sub[, inicio[, fin]])} + +\foreignlanguage{spanish}{Cuenta el número de ocurrencias de la subcadena en la cadena s. Busque desde la posición entre +}\textstyleSourceText{\foreignlanguage{spanish}{inicio}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{fin}}\foreignlanguage{spanish}{ de +}\textstyleSourceText{\foreignlanguage{spanish}{s}}\foreignlanguage{spanish}{ (el valor predeterminado es 0 y +tamaño(s)).} + +\paragraph[Función split]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{split}}} +\hypertarget{RefHeadingToc359033639824055}{}{\selectlanguage{spanish}\ttfamily +string.split(s, pos)} + +\foreignlanguage{spanish}{Divide la cadena s en dos subcadenas en la posición +}\textstyleSourceText{\foreignlanguage{spanish}{pos}}\foreignlanguage{spanish}{ y devuelve la lista de esas cadenas.} + +{\selectlanguage{spanish}\ttfamily +string.split(s, sep[, num])} + +{\selectlanguage{spanish} +Divide la cadena s en subcadenas dondequiera que ocurra sep, y devuelve la lista de esas cadenas. Dividir como máximo un +número de veces (el valor predeterminado es string.count(s, sep)).} + +\paragraph[Función find]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{find}}} +\hypertarget{RefHeadingToc359053639824055}{}{\selectlanguage{spanish}\ttfamily +string.find(s, sub[, inicio[, fin]])} + +{\selectlanguage{spanish} +Compruebe si la cadena s contiene la subcadena sub. Si se especifican el inicio y el final (el valor predeterminado es 0 +y el tamaño(s)), se buscarán en este rango.} + +\paragraph[Función hex]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{hex}}} +\hypertarget{RefHeadingToc359073639824055}{}{\selectlanguage{spanish}\ttfamily +hex(numero)} + +{\selectlanguage{spanish} +Convertir número a cadena hexadecimal.} + +\paragraph[Función byte]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{byte}}} +\hypertarget{RefHeadingToc359093639824055}{}{\selectlanguage{spanish}\ttfamily +byte(s)} + +{\selectlanguage{spanish} +Obtiene el valor del código del primer byte de la cadena s.} + +\paragraph[Función char]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{char}}} +\hypertarget{RefHeadingToc359113639824055}{}{\selectlanguage{spanish}\ttfamily +char(numero)} + +{\selectlanguage{spanish} +Convierte el número usado como código en un carácter.} + +\paragraph[Función format]{\foreignlanguage{spanish}{Función }\textstyleSourceText{\foreignlanguage{spanish}{format}}} +\hypertarget{RefHeadingToc359133639824055}{}{\selectlanguage{spanish}\ttfamily +string.format(fmt[, args])} + +{\selectlanguage{spanish} +Devuelve una cadena formateada. El patrón que comienza con '\%' en la plantilla de formato fmt será reemplazado por el +valor de [args]: \%[flags][fieldwidth][.precision]type} + + +\bigskip + +\begin{center} +\tablefirsthead{{\selectlanguage{spanish}\bfseries Tipo} & +{\selectlanguage{spanish}\bfseries Descripción}\\} +\tablehead{{\selectlanguage{spanish}\bfseries Tipo} & +{\selectlanguage{spanish}\bfseries Descripción}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{7.76cm}m{7.76cm}} +{\selectlanguage{spanish} \%d} & +{\selectlanguage{spanish} Entero decimal}\\ +{\selectlanguage{spanish} \%o} & +{\selectlanguage{spanish} Entero octal}\\ +{\selectlanguage{spanish} \%x} & +{\selectlanguage{spanish} Entero hexadecimal en minúsculas}\\ +{\selectlanguage{spanish} \%X} & +{\selectlanguage{spanish} Entero hexadecimal en mayúsculas}\\ +{\selectlanguage{spanish} \%x} & +{\selectlanguage{spanish} Entero octal en minúsculas}\\ +{\selectlanguage{spanish} \%X} & +{\selectlanguage{spanish} Entero octal en mayúsculas}\\ +{\selectlanguage{spanish} \%f} & +{\selectlanguage{spanish} Punto flotante en la forma [-]nnnn.nnnn}\\ +{\selectlanguage{spanish} \%e \%E} & +{\selectlanguage{spanish} Punto flotante en exp. forma [-]n.nnnn e [+{\textbar}-]nnn, mayúsculas si \%E}\\ +{\selectlanguage{spanish} \%g \%G} & +{\selectlanguage{spanish} Punto flotante como \%f si $-$4 {\textless} exp. ${\leq}$ precision, sino como \%e; mayúsculas +si \%G}\\ +{\selectlanguage{spanish} \%c} & +{\selectlanguage{spanish} Carácter que tiene el código pasado como entero}\\ +{\selectlanguage{spanish} \%s} & +{\selectlanguage{spanish} Cadena sin ceros incrustados}\\ +{\selectlanguage{spanish} \%q} & +{\selectlanguage{spanish} Cadena entre comillas dobles, con caracteres especiales escapados}\\ +{\selectlanguage{spanish} \%\%} & +{\selectlanguage{spanish} El carácter '\%' (escapado)}\\ +\end{supertabular} +\end{center} +\begin{center} +\tablefirsthead{{\selectlanguage{spanish}\bfseries Tipo} & +{\selectlanguage{spanish}\bfseries Descripción}\\} +\tablehead{{\selectlanguage{spanish}\bfseries Tipo} & +{\selectlanguage{spanish}\bfseries Descripción}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{7.76cm}m{7.76cm}} +{\selectlanguage{spanish} {}-} & +{\selectlanguage{spanish} Justificación a la izquierda, el valor predeterminado es justificación a la derecha}\\ +{\selectlanguage{spanish} +} & +{\selectlanguage{spanish} antepone el signo (se aplica a los números)}\\ +{\selectlanguage{spanish} (espacio)} & +{\selectlanguage{spanish} Antepone signo si es negativo, de lo contrario espacio}\\ +{\selectlanguage{spanish} \#} & +{\selectlanguage{spanish} Agrega {\textquotedbl}0x{\textquotedbl} antes de \%x, fuerza el punto decimal; para \%e, \%f, +deja ceros finales para \%g}\\ +\end{supertabular} +\end{center} +\begin{center} +\tablefirsthead{{\selectlanguage{spanish}\bfseries Ancho de campo y precisión} & +{\selectlanguage{spanish}\bfseries Descripción}\\} +\tablehead{{\selectlanguage{spanish}\bfseries Ancho de campo y precisión} & +{\selectlanguage{spanish}\bfseries Descripción}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{7.76cm}m{7.76cm}} +{\selectlanguage{spanish} n} & +{\selectlanguage{spanish} Pone al menos n caracteres, rellena con espacios en blanco}\\ +{\selectlanguage{spanish} 0n} & +{\selectlanguage{spanish} Pone al menos n caracteres, teclado izquierdo con ceros}\\ +{\selectlanguage{spanish} .n} & +{\selectlanguage{spanish} Usa al menos n dígitos para números enteros, redondee a n decimales para punto flotante o no +más de n caracteres. para cadenas}\\ +\end{supertabular} +\end{center} +\subsubsection[7.2.5 Módulo os]{\foreignlanguage{spanish}{7.2.5 }\foreignlanguage{spanish}{Módulo +}\textstyleSourceText{\foreignlanguage{spanish}{os}}} +\hypertarget{RefHeadingToc359153639824055}{}{\selectlanguage{spanish} +El módulo OS proporciona funciones relacionadas con el sistema, como funciones relacionadas con archivos y rutas. Estas +funciones están relacionadas con la plataforma. Actualmente, los códigos de estilo Windows VC y POSIX se implementan en +el intérprete de Berry. Si se ejecuta en otras plataformas, no se garantiza que se proporcionen las funciones en el +módulo del sistema operativo.} + +{\selectlanguage{spanish} +[COMPLETAR]} + +\subsubsection[7.2.6 Módulo global]{\foreignlanguage{spanish}{7.2.6 }\foreignlanguage{spanish}{Módulo +}\textstyleSourceText{\foreignlanguage{spanish}{global}}} +\hypertarget{RefHeadingToc359173639824055}{}\foreignlanguage{spanish}{El módulo +}\textstyleSourceText{\foreignlanguage{spanish}{global}}\foreignlanguage{spanish}{ proporciona una forma de acceder a +las variables globales a través de un módulo. El compilador Berry comprueba que existe un global al compilar el código. +Sin embargo, hay casos en los que los globales se crean dinámicamente por código y aún no se conocen en tiempo de +compilación. El uso del módulo }\textstyleSourceText{\foreignlanguage{spanish}{global}}\foreignlanguage{spanish}{ da +total libertad para acceder a variables globales estáticas o dinámicas.} + +\foreignlanguage{spanish}{Acceder a un global es simplay hecho con +}\textstyleSourceText{\foreignlanguage{spanish}{global.{\textless}name{\textgreater} }}\foreignlanguage{spanish}{para +leer y escribir. También puede usar la sintaxis especial +}\textstyleSourceText{\foreignlanguage{spanish}{global.(nombre)}}\foreignlanguage{spanish}{ si +}\textstyleSourceText{\foreignlanguage{spanish}{nombre}}\foreignlanguage{spanish}{ es una variable que contiene el +nombre del global como cadena.} + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} import global} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a = 1} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} global.a} + +{\selectlanguage{spanish}\ttfamily +1} + +{\selectlanguage{spanish}\ttfamily +{\textgreater}} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} b} + +{\selectlanguage{spanish}\ttfamily +syntax\_error: stdin:1: 'b' no declarado (primer uso en esta función)} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} global.b = 2} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} b} + +{\selectlanguage{spanish}\ttfamily +2} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} global.b} + +{\selectlanguage{spanish}\ttfamily +2} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} var nombre = {\textquotedbl}b{\textquotedbl}} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} global.(nombre)} + +{\selectlanguage{spanish}\ttfamily +2} + + +\bigskip + +\foreignlanguage{spanish}{Llamar a }\textstyleSourceText{\foreignlanguage{spanish}{global()}}\foreignlanguage{spanish}{ +devuelve la lista de todos los nombres globales actualmente definidos (los componentes integrados no están incluidos).} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} import global} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a = 1} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} global.b = 2} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} global()} + +{\selectlanguage{spanish}\ttfamily +['\_argv', 'b', 'global', 'a']} + +\textstyleSourceText{\foreignlanguage{spanish}{global.contains({\textless}nombre){\textgreater} -{\textgreater} +bool}}\foreignlanguage{spanish}{ proporciona una manera fácil de saber si un nombre global ya está definido.} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} import global} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} global.contains({\textquotedbl}g{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +false} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} g = 1} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} global.contains({\textquotedbl}g{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +true} + +\subsubsection[7.2.7 Módulo introspect]{\foreignlanguage{spanish}{7.2.7 }\foreignlanguage{spanish}{Módulo +}\textstyleSourceText{\foreignlanguage{spanish}{introspect}}} +\hypertarget{RefHeadingToc359193639824055}{}\foreignlanguage{spanish}{El módulo +}\textstyleSourceText{\foreignlanguage{spanish}{introspect}}\foreignlanguage{spanish}{ proporciona primitivas para +acceder dinámicamente a variables o módulos. Usar con }\textstyleSourceText{\foreignlanguage{spanish}{import +introspect}}\foreignlanguage{spanish}{.} + +\textstyleSourceText{\foreignlanguage{spanish}{introspect.members(objeto: clase o módulo o instancia o nil) +-{\textgreater} lista}}\foreignlanguage{spanish}{ devuelve la lista de nombres de miembros para la +}\textstyleSourceText{\foreignlanguage{spanish}{clase}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{instancia}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{módulo}}\foreignlanguage{spanish}{. Tenga en cuenta que no incluye +miembros virtuales potenciales creados a través de +}\textstyleSourceText{\foreignlanguage{spanish}{member}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{setmember}}\foreignlanguage{spanish}{.} + +\textstyleSourceText{\foreignlanguage{spanish}{introspect.members()}}\foreignlanguage{spanish}{ devuelve la lista de +variables globales (sin incluir las incorporadas) y es equivalente a +}\textstyleSourceText{\foreignlanguage{spanish}{global()}} + +\textstyleSourceText{\foreignlanguage{spanish}{introspect.get(objeto: clase o instancia o módulo, nombre:cadena) +-{\textgreater} cualquiera}}\foreignlanguage{spanish}{ e +}\textstyleSourceText{\foreignlanguage{spanish}{introspect.set(objeto: clase o instancia o módulo, nombre:cadena, +valor:cualquiera) -{\textgreater} nil}}\foreignlanguage{spanish}{ permite leer y escribir cualquier miembro por su +nombre.} + +\textstyleSourceText{\foreignlanguage{spanish}{introspect.get(o, +{\textquotedbl}a{\textquotedbl})}}\foreignlanguage{spanish}{ es equivalente a +}\textstyleSourceText{\foreignlanguage{spanish}{oa}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{introspect.set(o, {\textquotedbl}a{\textquotedbl}, +1)}}\foreignlanguage{spanish}{ es equivalente a }\textstyleSourceText{\foreignlanguage{spanish}{oa = +1}}\foreignlanguage{spanish}{. También hay una sintaxis alternativa: +}\textstyleSourceText{\foreignlanguage{spanish}{o.({\textquotedbl}a{\textquotedbl})}}\foreignlanguage{spanish}{ es +equivalente a }\textstyleSourceText{\foreignlanguage{spanish}{oa}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{o.({\textquotedbl}a) = 1}}\foreignlanguage{spanish}{ es equivalente a +}\textstyleSourceText{\foreignlanguage{spanish}{oa = 1}}\foreignlanguage{spanish}{.} + +\textstyleSourceText{\foreignlanguage{spanish}{introspect.module(nombre:cadena) -{\textgreater} +any}}\foreignlanguage{spanish}{ es equivalente a }\textstyleSourceText{\foreignlanguage{spanish}{import +nombre}}\foreignlanguage{spanish}{ excepto que no crea la variable global o local, sino que devuelve el módulo. Esta es +la única manera de cargar un módulo con un nombre dinámico, }\textstyleSourceText{\foreignlanguage{spanish}{import +nombre}}\foreignlanguage{spanish}{ solo toma un nombre estático.} + +\textstyleSourceText{\foreignlanguage{spanish}{introspect.toptr(addr:int) -{\textgreater} +comptr}}\foreignlanguage{spanish}{ convierte un número entero en un puntero comptr. +}\textstyleSourceText{\foreignlanguage{spanish}{introspect.fromptr(addr:comptr) -{\textgreater} +int}}\foreignlanguage{spanish}{ hace lo contrario y convierte un puntero en un int. Advertencia: usar con cuidado. En +plataformas donde }\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{void*}}\foreignlanguage{spanish}{ no tienen el mismo tamaño, estas +funciones seguramente darán resultados inutilizables.} + +\textstyleSourceText{\foreignlanguage{spanish}{introspect.ismethod(f:function) -{\textgreater} +bool}}\foreignlanguage{spanish}{ comprueba si la función proporcionada es un método de una instancia (tomando a sí +mismo como primer argumento) o una función simple. Esto se usa principalmente para evitar un error común de pasar un +método de instancia como callback, donde debe usar un cierre que capture la instancia como +}\textstyleSourceText{\foreignlanguage{spanish}{/ -{\textgreater} self.do()}}\foreignlanguage{spanish}{.} + +\subsubsection[7.2.8 Módulo solidify]{\foreignlanguage{spanish}{7.2.8 }\foreignlanguage{spanish}{Módulo +}\textstyleSourceText{\foreignlanguage{spanish}{solidify}}} +\hypertarget{RefHeadingToc359213639824055}{}{\selectlanguage{spanish} +Este módulo permite solidificar el bytecode de Berry en flash. Esto permite ahorrar RAM ya que el código está en ROM. +Esto lo convierte en una buena alternativa a las funciones nativas de C.} + +{\selectlanguage{spanish} +Ver 8.4 Solidificación.} + +\clearpage\section{Capítulo 8: Características avanzadas} +\hypertarget{RefHeadingToc359233639824055}{} +\bigskip + +\subsection[8.1 Modo estricto]{\foreignlanguage{spanish}{8.1 Modo +}\textstyleSourceText{\foreignlanguage{spanish}{estricto}}} +\hypertarget{RefHeadingToc359253639824055}{}\foreignlanguage{spanish}{Berry permite total libertad del desarrollador. +Pero después de un poco de experiencia en la codificación con Berry, encontrará que hay errores comunes que son +difíciles de encontrar y que el compilador podría ayudarlo a detectar. El modo +}\textstyleSourceText{\foreignlanguage{spanish}{estricto}}\foreignlanguage{spanish}{ realiza verificaciones adicionales +}\foreignlanguage{spanish}{\textbf{en tiempo de compilación}}\foreignlanguage{spanish}{ sobre algunos errores comunes.} + +\foreignlanguage{spanish}{Este modo está habilitado con }\textstyleSourceText{\foreignlanguage{spanish}{import +strict}}\foreignlanguage{spanish}{ o cuando se ejecuta Berry con la opción +}\textstyleSourceText{\foreignlanguage{spanish}{{}-s}}\foreignlanguage{spanish}{:} + +\foreignlanguage{spanish}{\ }\textstyleSourceText{\foreignlanguage{spanish}{berry -s}} + +\subsubsection[var obligatorio para variables +locales]{\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ obligatorio para variables +locales}} +\hypertarget{RefHeadingToc359273639824055}{}\foreignlanguage{spanish}{Este es el error más común, una variable asignada +sin }\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ es global si ya existe una variable +global o local en caso contrario. El modo estricto rechaza la asignación si no hay un global con el mismo nombre.} + +{\selectlanguage{spanish} +No más permitido:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def f()} + +{\selectlanguage{spanish}\ttfamily +\ \ i = 0 \ \ \ \# this is a local variable} + +{\selectlanguage{spanish}\ttfamily +\ \ var j = 0} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +syntax\_error: stdin:2: strict: no global 'i', ¿quiso decir 'var i'?} + +{\selectlanguage{spanish} +Pero todavía funciona para globales:} + +{\selectlanguage{spanish}\ttfamily +g\_i = 0} + +{\selectlanguage{spanish}\ttfamily +def f()} + +{\selectlanguage{spanish}\ttfamily +\ \ g\_i = 1} + +{\selectlanguage{spanish}\ttfamily +end} + +\subsubsection[Sin anulación de elementos integrados]{\selectlanguage{spanish} Sin anulación de elementos integrados} +\hypertarget{RefHeadingToc359293639824055}{}{\selectlanguage{spanish} +Berry permite anular una función incorporada. Sin embargo, esto generalmente no es deseable y es una fuente de errores +difíciles de encontrar.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +map = 1} + +{\selectlanguage{spanish}\ttfamily +syntax\_error: stdin:1: estricto: redefinición de 'map' incorporado} + +\subsubsection[Múltiples var con el mismo nombre no permitidos en el mismo ámbito]{\foreignlanguage{spanish}{Múltiples +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ con el mismo nombre no permitidos en el +mismo ámbito}} +\hypertarget{RefHeadingToc359313639824055}{}{\selectlanguage{spanish} +Berry toleraba la declaración múltiple de una variable local con el mismo nombre. Esto ahora se considera como un error +(incluso sin modo estricto).} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def f()} + +{\selectlanguage{spanish}\ttfamily +\ \ var a} + +{\selectlanguage{spanish}\ttfamily +\ \ var a \ \ \# redefinición de a} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +syntax\_error: stdin:3: redefinición de 'a'} + +\subsubsection[No ocultar la variable local del alcance externo]{\selectlanguage{spanish} No ocultar la variable local +del alcance externo} +\hypertarget{RefHeadingToc359333639824055}{}{\selectlanguage{spanish} +En Berry puedes declarar variables locales con el mismo nombre en el ámbito interno. La variable en el ámbito interno +oculta la variable del ámbito externo durante la duración del ámbito.} + +\foreignlanguage{spanish}{La única excepción son las variables que comienzan con el punto '.' que se pueden enmascarar +desde el alcance externo. Este es el caso de la variable local oculta +}\textstyleSourceText{\foreignlanguage{spanish}{.it}}\foreignlanguage{spanish}{ cuando se incrustan múltiples +}\textstyleSourceText{\foreignlanguage{spanish}{for}}\foreignlanguage{spanish}{.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +def f()} + +{\selectlanguage{spanish}\ttfamily +\ \ var a \ \ \ \# variable en el ámbito externo} + +{\selectlanguage{spanish}\ttfamily +\ \ if a} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var a \ \# redefinición de a en ámbito interno} + +{\selectlanguage{spanish}\ttfamily +\ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +syntax\_error: stdin:4: estricto: \ redefinición de 'a' desde el ámbito externo} + +\subsection[8.2 Miembros virtuales]{\selectlanguage{spanish} 8.2 Miembros virtuales} +\hypertarget{RefHeadingToc359353639824055}{}{\selectlanguage{spanish} +Los miembros virtuales le permiten agregar de forma dinámica y programática miembros y métodos a clases y módulos. Ya no +está limitado a los miembros declarados en el momento de la creación.} + +\foreignlanguage{spanish}{Esta función está inspirada en +}\textstyleSourceText{\foreignlanguage{spanish}{\_\_getattr\_\_()}}\foreignlanguage{spanish}{ / +}\textstyleSourceText{\foreignlanguage{spanish}{\_\_setattr\_\_()}}\foreignlanguage{spanish}{ de Python. La motivación +proviene de la integración de LVGL a Berry en Tasmota. La integración necesita cientos de constantes en un módulo y +miles de métodos asignados a funciones C. La creación estática de atributos y métodos funciona, pero consume una +cantidad significativa de espacio de código.} + +{\selectlanguage{spanish} +Esta característica permite crear dos métodos:} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries Método Berry} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Descripción}\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries Método Berry} & +\centering\arraybslash{\selectlanguage{spanish}\bfseries Descripción}\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{7.76cm}m{7.76cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{member}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{(nombre:cadena) -{\textgreater} +any}}\foreignlanguage{spanish}{ Debería devolver el valor del +}\textstyleSourceText{\foreignlanguage{spanish}{nombre}}\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{setmember}} & +\centering\arraybslash \textstyleSourceText{\foreignlanguage{spanish}{(nombre:cadena, valor:any) especificado +-{\textgreater} nil}}\foreignlanguage{spanish}{ Debería almacenar el 'valor' en el miembro virtual con el 'nombre' +especificado}\\ +\end{supertabular} +\end{center} +\subsubsection[Módulo undefined]{\foreignlanguage{spanish}{Módulo +}\textstyleSourceText{\foreignlanguage{spanish}{undefined}}} +\hypertarget{RefHeadingToc359373639824055}{}\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{member()}}\foreignlanguage{spanish}{ debe ser capaz de distinguir entre +un miembro con un valor }\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ y el miembro +que no existe. Para evitar cualquier ambigüedad, la función +}\textstyleSourceText{\foreignlanguage{spanish}{member()}}\foreignlanguage{spanish}{ puede indicar que el miembro no +existe de dos maneras:} + +\liststyleLviii +\begin{itemize} +\item \foreignlanguage{spanish}{generar una excepción - o }\textstyleSourceText{\foreignlanguage{spanish}{import +undefined}}\foreignlanguage{spanish}{ y devolver el módulo +}\textstyleSourceText{\foreignlanguage{spanish}{undefined}}\foreignlanguage{spanish}{. Esto se usa como un marcador +para que la VM sepa que el atributo no existe, mientras se }\foreignlanguage{spanish}{beneficia de excepciones +consistentes.} +\end{itemize} +{\selectlanguage{spanish} +Ejemplo de un objeto dinámico al que puede agregar miembros, pero devolvería un error si el miembro no se agregó +previamente.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class dyn} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var \_attr} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.\_attr = \{\}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def setmember(nombre, valor)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.\_attr[nombre] = valor} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def member(nombre)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ if self.\_attr.contains(nombre)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ return self.\_attr[nombre]} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ else} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ import undefined} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ return undefined} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +{\selectlanguage{spanish} +Ejemplo de uso:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a = dyn()} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.a} + +{\selectlanguage{spanish}\ttfamily +attribute\_error: el objeto 'dyn' no tiene el atributo 'a'} + +{\selectlanguage{spanish}\ttfamily +stack traceback:} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ stdin:1: en función {\textasciigrave}main{\textasciigrave}} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.a = 1} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.a} + +{\selectlanguage{spanish}\ttfamily +1} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.a = nil} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.a} + +{\selectlanguage{spanish}\ttfamily +{\textgreater}} + +\subsubsection[Llamada implícita de member()]{\foreignlanguage{spanish}{Llamada implícita de +}\textstyleSourceText{\foreignlanguage{spanish}{member()}}} +\hypertarget{RefHeadingToc359393639824055}{}\foreignlanguage{spanish}{Cuando se ejecuta el siguiente código +}\textstyleSourceText{\foreignlanguage{spanish}{a.b}}\foreignlanguage{spanish}{, Berry VM hace lo siguiente:} + +\liststyleLix +\begin{itemize} +\item \foreignlanguage{spanish}{Obtiene el objeto llamado +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ (local o global), genera una excepción si +no existe} +\item \foreignlanguage{spanish}{Comprueba si el objeto +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ es de tipo +}\textstyleSourceText{\foreignlanguage{spanish}{módulo}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{instancia}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{clase}}\foreignlanguage{spanish}{. Genera una excepción de lo +contrario} +\item \foreignlanguage{spanish}{Comprueba si el objeto +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ tiene un miembro llamado +}\textstyleSourceText{\foreignlanguage{spanish}{b}}\foreignlanguage{spanish}{. En caso afirmativo, devuelve su valor, +en caso negativo, procede a continuación} +\item \foreignlanguage{spanish}{Si el objeto +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ es del tipo +}\textstyleSourceText{\foreignlanguage{spanish}{clase}}\foreignlanguage{spanish}{, genera una excepción porque los +miembros virtuales no funcionan para métodos estáticos (clase)} +\item \foreignlanguage{spanish}{Comprueba si el objeto +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ tiene un miembro llamado +}\textstyleSourceText{\foreignlanguage{spanish}{member}}\foreignlanguage{spanish}{ y es una +}\textstyleSourceText{\foreignlanguage{spanish}{función}}\foreignlanguage{spanish}{. En caso afirmativo, lo llama con +el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}b{\textquotedbl}}}\foreignlanguage{spanish}{ como +cadena. Si no, genera una excepción} +\item \foreignlanguage{spanish}{Comprueba el valor de retorno. Si es el módulo +}\textstyleSourceText{\foreignlanguage{spanish}{undefined}}\foreignlanguage{spanish}{ genera una excepción que indica +que el miembro no existe} +\end{itemize} +\subsubsection[Llamada implícita de setmember()]{\foreignlanguage{spanish}{Llamada implícita de +}\textstyleSourceText{\foreignlanguage{spanish}{setmember()}}} +\hypertarget{RefHeadingToc359413639824055}{}\foreignlanguage{spanish}{Cuando se ejecuta el siguiente código +}\textstyleSourceText{\foreignlanguage{spanish}{ab = 0}}\foreignlanguage{spanish}{ (mutador), Berry VM hace lo +siguiente:} + +\liststyleLx +\begin{itemize} +\item \foreignlanguage{spanish}{Obtiene el objeto llamado +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ (local o global), genera una excepción si +no existe} +\item \foreignlanguage{spanish}{Comprueba si el objeto +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ es de tipo +}\textstyleSourceText{\foreignlanguage{spanish}{módulo}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{instancia}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{clase}}\foreignlanguage{spanish}{. Genera una excepción de lo +contrario} + +\begin{itemize} +\item \foreignlanguage{spanish}{Si }\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ es del +tipo }\textstyleSourceText{\foreignlanguage{spanish}{clase}}\foreignlanguage{spanish}{, comprueba si existe el miembro +}\textstyleSourceText{\foreignlanguage{spanish}{b}}\foreignlanguage{spanish}{. En caso afirmativo, cambia su valor. Si +no, genera una excepción. (los miembros virtuales no funcionan para clases o métodos estáticos)} +\item \foreignlanguage{spanish}{Si }\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ es del +tipo }\textstyleSourceText{\foreignlanguage{spanish}{instancia}}\foreignlanguage{spanish}{, comprueba si existe el +miembro }\textstyleSourceText{\foreignlanguage{spanish}{b}}\foreignlanguage{spanish}{. En caso afirmativo, cambia su +valor. Si no, procede a continuación} + +\begin{itemize} +\item \foreignlanguage{spanish}{Comprueba si +}\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ tiene un miembro llamado +}\textstyleSourceText{\foreignlanguage{spanish}{setmember}}\foreignlanguage{spanish}{. Si es así, lo llama, si no, +genera una excepción.} +\end{itemize} +\item \foreignlanguage{spanish}{Si }\textstyleSourceText{\foreignlanguage{spanish}{a}}\foreignlanguage{spanish}{ es de +tipo }\textstyleSourceText{\foreignlanguage{spanish}{módulo}}\foreignlanguage{spanish}{. Si el módulo no es de solo +lectura, crea o cambia el valor (}\textstyleSourceText{\foreignlanguage{spanish}{setmember}}\foreignlanguage{spanish}{ +nunca se llama para un módulo de escritura). Si el módulo es de solo lectura, entonces se llama a +}\textstyleSourceText{\foreignlanguage{spanish}{setmember}}\foreignlanguage{spanish}{ si existe.} +\end{itemize} +\end{itemize} +\subsubsection[Manejo de excepciones]{\selectlanguage{spanish} Manejo de excepciones} +\hypertarget{RefHeadingToc359433639824055}{}\foreignlanguage{spanish}{Para indicar que un miembro no existe, +}\textstyleSourceText{\foreignlanguage{spanish}{member()}}\foreignlanguage{spanish}{ devolverá +}\textstyleSourceText{\foreignlanguage{spanish}{undefined}}\foreignlanguage{spanish}{ después de +}\textstyleSourceText{\foreignlanguage{spanish}{import undefined}}\foreignlanguage{spanish}{. También puede generar una +excepción en }\textstyleSourceText{\foreignlanguage{spanish}{member()}}\foreignlanguage{spanish}{, pero tenga en cuenta +que Berry podría intentar llamar a métodos como +}\textstyleSourceText{\foreignlanguage{spanish}{tostring()}}\foreignlanguage{spanish}{ que aterrizarán en su método +}\textstyleSourceText{\foreignlanguage{spanish}{member()}}\foreignlanguage{spanish}{ si no existen como métodos +estáticos. Para indicar que un miembro no es válido, +}\textstyleSourceText{\foreignlanguage{spanish}{setmember()}}\foreignlanguage{spanish}{ debe generar una excepción o +devolver }\textstyleSourceText{\foreignlanguage{spanish}{undefined}}\foreignlanguage{spanish}{. Devolver cualquier otra +cosa como }\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ indica que la asignación fue +exitosa. Tenga en cuenta que puede recibir nombres de miembros que no sean identificadores válidos de Berry. La +sintaxis +}\textstyleSourceText{\foreignlanguage{spanish}{a.({\textquotedbl}{\textless}-{\textgreater}{\textquotedbl})}}\foreignlanguage{spanish}{ +llamará a +}\textstyleSourceText{\foreignlanguage{spanish}{a.member({\textquotedbl}{\textless}-{\textgreater}{\textquotedbl})}}\foreignlanguage{spanish}{ +con un nombre de miembro virtual que no es léxicamente válido, es decir, no se puede llamar en código normal, excepto +mediante el uso indirecto formas como +}\textstyleSourceText{\foreignlanguage{spanish}{introspect}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{member()}}\foreignlanguage{spanish}{.} + +\subsubsection[Especificidades para las clases]{\selectlanguage{spanish} Especificidades para las clases} +\hypertarget{RefHeadingToc359453639824055}{}{\selectlanguage{spanish} +El acceso a los miembros del objeto de clase no desencadena miembros virtuales. Por lo tanto, no es posible tener +métodos estáticos virtuales.} + +\subsubsection[Especificidades de los módulos]{\selectlanguage{spanish} Especificidades de los módulos} +\hypertarget{RefHeadingToc359473639824055}{}\foreignlanguage{spanish}{Los módulos admiten la lectura de miembros +estáticos con }\textstyleSourceText{\foreignlanguage{spanish}{member()}}\foreignlanguage{spanish}{. Al escribir en un +miembro, el comportamiento depende de si el módulo es de escritura (en la memoria) o de solo lectura (en el firmware). +Si se puede escribir en el módulo, los nuevos miembros se agregan directamente al módulo y nunca se llama a +}\textstyleSourceText{\foreignlanguage{spanish}{setmember()}}\foreignlanguage{spanish}{. Si el módulo es de solo +lectura, se llama a }\textstyleSourceText{\foreignlanguage{spanish}{setmember()}}\foreignlanguage{spanish}{ cada vez +que intenta cambiar o crear un miembro. Entonces es su responsabilidad almacenar los valores en un objeto separado como +un global.} + +\subsubsection[Ejemplo]{\selectlanguage{spanish} Ejemplo} +\hypertarget{RefHeadingToc359493639824055}{} +\bigskip + +{\selectlanguage{spanish}\ttfamily +class T} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var a} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ self.a = 'a'} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def member(nombre)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ return {\textquotedbl}miembro {\textquotedbl}+nombre} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def setmember(nombre, valor)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ print({\textquotedbl}Almacenar '{\textquotedbl}+nombre+{\textquotedbl}': {\textquotedbl}+str(valor))} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +t=T()} + + +\bigskip + +{\selectlanguage{spanish} +Ahora intentémoslo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} t.a} + +{\selectlanguage{spanish}\ttfamily +{}'a'} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} t.b} + +{\selectlanguage{spanish}\ttfamily +{}'miembro b'} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} t.foo} + +{\selectlanguage{spanish}\ttfamily +{}'miembro foo'} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} t.bar = 2} + +{\selectlanguage{spanish}\ttfamily +Almacenar 'bar': 2} + + +\bigskip + +{\selectlanguage{spanish} +Esto también funciona para los módulos:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +m = module()} + +{\selectlanguage{spanish}\ttfamily +m.a = 1} + +{\selectlanguage{spanish}\ttfamily +m.member = def (nombre)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return {\textquotedbl}miembro {\textquotedbl}+nombre} + +{\selectlanguage{spanish}\ttfamily +end} + +{\selectlanguage{spanish}\ttfamily +m.setmember(nombre, valor)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print({\textquotedbl}Almacenar '{\textquotedbl}+nombre+{\textquotedbl}': {\textquotedbl}+str(valor))} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +{\selectlanguage{spanish} +Intentemoslo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m.a} + +{\selectlanguage{spanish}\ttfamily +1} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m.b} + +{\selectlanguage{spanish}\ttfamily +{}'miembro b'} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m.c = 3 \ \ \# la asignación es válida por lo que no se llama a {\textasciigrave}setmember()} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m.c} + +{\selectlanguage{spanish}\ttfamily +3} + + +\bigskip + +{\selectlanguage{spanish} +Ejemplo más avanzado:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} class A} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ var i} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def member(n)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ if n == 'ii' return self.i end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ return nil \ \ \ \ \# lo hacemos explícito aquí, pero esta línea es opcional} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ def setmember(n, v)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ if n == 'ii' self.i = v end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ end} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a=A()} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.i \ \ \ \ \ \# devuelve nil} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.ii \ \ \ \ \# i llama implícitamente +{\textasciigrave}a.member({\textquotedbl}ii{\textquotedbl}){\textasciigrave}} + +{\selectlanguage{spanish}\ttfamily +attribute\_error: el objeto 'A' no tiene atributo 'ii'} + +{\selectlanguage{spanish}\ttfamily +stack traceback:} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ stdin:1: en función {\textasciigrave}main{\textasciigrave}} + +{\selectlanguage{spanish}\ttfamily +\# devuelve un excepción ya que el miembro es nulo (considerado inexistente)} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.ii = 42 \ \ \ \# llama implícitamente {\textasciigrave}a.setmember({\textquotedbl}ii{\textquotedbl}, +42){\textasciigrave}} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.ii \ \ \ \ \ \ \ \ \# llama implícitamente +{\textasciigrave}a.member({\textquotedbl}ii{\textquotedbl}){\textasciigrave} and returns +{\textasciigrave}42{\textasciigrave}} + +{\selectlanguage{spanish}\ttfamily +42} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} a.i \ \ \ \ \ \ \ \ \ \# \ la variable concreta también fue cambiada} + +{\selectlanguage{spanish}\ttfamily +42} + +\subsection[8.3 Cómo empaquetar un módulo]{\selectlanguage{spanish} 8.3 Cómo empaquetar un módulo} +\hypertarget{RefHeadingToc359513639824055}{}{\selectlanguage{spanish} +Esta guía lo lleva a través de las diferentes opciones de empaquetado de código para su reutilización utilizando la +directiva de {\textquotedbl}import{\textquotedbl} de Berry.} + +\subsubsection[Comportamiento de import]{\foreignlanguage{spanish}{Comportamiento de +}\textstyleSourceText{\foreignlanguage{spanish}{import}}} +\hypertarget{RefHeadingToc359533639824055}{}\foreignlanguage{spanish}{Cuando se utiliza +}\textstyleSourceText{\foreignlanguage{spanish}{import {\textless}modulo{\textgreater} [as +{\textless}nombre{\textgreater} ]}}\foreignlanguage{spanish}{, suceden los siguientes pasos:} + +\liststyleLxiii +\begin{itemize} +\item \foreignlanguage{spanish}{Hay una caché global de todos los módulos ya importados. Si +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}modulo{\textgreater} }}\foreignlanguage{spanish}{ya fue +importado, }\textstyleSourceText{\foreignlanguage{spanish}{import}}\foreignlanguage{spanish}{ devuelve el valor en +caché ya devuelto por la primera llamada a +}\textstyleSourceText{\foreignlanguage{spanish}{import}}\foreignlanguage{spanish}{. No se realizan otras acciones.} +\item \textstyleSourceText{\foreignlanguage{spanish}{import}}\foreignlanguage{spanish}{ busca un módulo de nombre +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}modulo{\textgreater} }}\foreignlanguage{spanish}{en el +siguiente orden:} +\end{itemize} +\liststyleLxiv +\begin{enumerate} +\item {\selectlanguage{spanish} +en módulos nativos incrustados en el firmware en tiempo de compilación} +\item \foreignlanguage{spanish}{en el sistema de archivos, comenzando con el directorio actual, luego iterando en todos +los directorios desde }\textstyleSourceText{\foreignlanguage{spanish}{sys.path}}\foreignlanguage{spanish}{: busque el +archivo }\textstyleSourceText{\foreignlanguage{spanish}{{\textless}nombre{\textgreater} }}\foreignlanguage{spanish}{, +entonces +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}nombre{\textgreater}.bec}}\foreignlanguage{spanish}{ (código +de bytes compilado), luego +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}nombre{\textgreater}.be}}\foreignlanguage{spanish}{. Si +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_USE\_SHARED\_LIB}}\foreignlanguage{spanish}{ está habilitado, +también busca bibliotecas compartidas como +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}nombre{\textgreater}.so que}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}nombre{\textgreater}.dll}}\foreignlanguage{spanish}{ aunque +esta opción generalmente no está disponible en MCU.} +\end{enumerate} +\liststyleLxv +\begin{itemize} +\item \foreignlanguage{spanish}{Se ejecuta el código cargado. El código debe terminar con una declaración +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{. El objeto devuelto se almacena en +la memoria caché global y se pone a disposición de la persona que llama (en el ámbito local o global).} +\item \foreignlanguage{spanish}{Si el objeto devuelto es un +}\textstyleSourceText{\foreignlanguage{spanish}{módulo}}\foreignlanguage{spanish}{ y si el módulo posee un miembro +}\textstyleSourceText{\foreignlanguage{spanish}{init}}\foreignlanguage{spanish}{, entonces se toma un paso adicional. +La función +}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}modulo{\textgreater}.init(m)}}\foreignlanguage{spanish}{ se +llama pasando como argumento el propio objeto del módulo. El valor devuelto por +}\textstyleSourceText{\foreignlanguage{spanish}{init()}}\foreignlanguage{spanish}{ reemplaza el valor en el caché +global. Tenga en cuenta que }\textstyleSourceText{\foreignlanguage{spanish}{init()}}\foreignlanguage{spanish}{ se llama +como máximo una vez durante la primera +}\textstyleSourceText{\foreignlanguage{spanish}{importación}}\foreignlanguage{spanish}{.} +\end{itemize} +\foreignlanguage{spanish}{Nota: una función +}\textstyleSourceText{\foreignlanguage{spanish}{init(m)}}\foreignlanguage{spanish}{ implícita siempre está presente en +todos los módulos, incluso si no se declaró ninguno. Esta función implícita no tiene ningún efecto.} + +\subsubsection[Empaquetado de un módulo]{\selectlanguage{spanish} Empaquetado de un módulo} +\hypertarget{RefHeadingToc359553639824055}{}{\selectlanguage{spanish} +Aquí hay un ejemplo simple de un módulo:} + +\foreignlanguage{spanish}{Archivo +}\textstyleSourceText{\foreignlanguage{spanish}{demo\_modulo.be}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# modulo simple} + +{\selectlanguage{spanish}\ttfamily +\# use {\textasciigrave}import demo\_modulo{\textasciigrave}} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +demo\_module = module({\textquotedbl}demo\_module{\textquotedbl})} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +demo\_modulo.foo = {\textquotedbl}bar{\textquotedbl}} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +demo\_modulo.decir\_hola = def ()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print({\textquotedbl}Hola Berry!{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +return demo\_modulo \ \ \ \ \ \# devuelve el módulo como salida de import} + + +\bigskip + +{\selectlanguage{spanish} +Ejemplo de uso:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} import demo\_modulo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_modulo} + +{\selectlanguage{spanish}\ttfamily +{\textless}module: demo\_modulo{\textgreater}} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_module.decir\_hola()} + +{\selectlanguage{spanish}\ttfamily +Hola Berry!} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_modulo.foo} + +{\selectlanguage{spanish}\ttfamily +{}'bar'} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_modulo.foo = {\textquotedbl}baz{\textquotedbl} \ \ \# el módulo se puede escribir, aunque esto es +muy desaconsejado} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_modulo.foo} + +{\selectlanguage{spanish}\ttfamily +{}'baz'} + +\subsubsection[Empaquetar un singleton (mónada)]{\selectlanguage{spanish} Empaquetar un singleton (mónada)} +\hypertarget{RefHeadingToc359573639824055}{}{\selectlanguage{spanish} +El problema de usar módulos es que no tienen variables de instancia para realizar un seguimiento de los datos. Están +diseñados esencialmente para bibliotecas sin estado.} + +{\selectlanguage{spanish} +A continuación, encontrará una forma elegante de empaquetar una clase única devuelta como una {\textquotedbl}declaración +de importación{\textquotedbl}.} + +{\selectlanguage{spanish} +Para ello, utilizamos diferentes trucos. Primero, declaramos la clase para el singleton como una clase interna de una +función, esto evita que se contamine el espacio de nombres global con esta clase. Es decir, la clase no será accesible +por otro código.} + +\foreignlanguage{spanish}{En segundo lugar, declaramos una función +}\textstyleSourceText{\foreignlanguage{spanish}{init()}}\foreignlanguage{spanish}{ del módulo que crea la clase, crea +la instancia y la devuelve.} + +\foreignlanguage{spanish}{Según este esquema, }\textstyleSourceText{\foreignlanguage{spanish}{import +{\textless}modulo{\textgreater} }}\foreignlanguage{spanish}{en realidad devuelve una instancia de una clase oculta.} + +\foreignlanguage{spanish}{Ejemplo de +}\textstyleSourceText{\foreignlanguage{spanish}{demo\_monad.be}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# monada simple} + +{\selectlanguage{spanish}\ttfamily +\# use {\textasciigrave}import demo\_monad{\textasciigrave}} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +demo\_monad = module({\textquotedbl}demo\_monad{\textquotedbl})} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\# \ el módulo tiene un solo miembro {\textasciigrave}init(){\textasciigrave} y delega todo a la clase interna} + +{\selectlanguage{spanish}\ttfamily +demo\_monad.init = def (m)} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \# inncer class} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ class my\_monad} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ var i} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ self.i = 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ def say\_hello()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ print({\textquotedbl}Hola Berry!{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \# rdevolver una sola instancia para esta clase} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ return my\_monad()} + +{\selectlanguage{spanish}\ttfamily +end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +return demo\_monad \ \ \ \ \ \# evuelve el módulo como la salida de importación, que eventualmente se reemplaza por el +valor de retorno de 'init()'} + + +\bigskip + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} import demo\_monad} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_monad} + +{\selectlanguage{spanish}\ttfamily +{\textless}instance: my\_monad(){\textgreater} \ \ \ \ \# es una instancia no un modulo} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_monad.say\_hello()} + +{\selectlanguage{spanish}\ttfamily +Hola Berry!} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_monad.i = 42 \ \ \ \ \ \ \ \# \ puedes usarlo como cualquier instancia} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_monad.i} + +{\selectlanguage{spanish}\ttfamily +42} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} demo\_monad.j = 0 \ \ \ \ \ \ \ \ \# hay una fuerte verificación de miembros en comparación con los +módulos } + +{\selectlanguage{spanish}\ttfamily +Attribute\_error: la clase 'my\_monad' no puede asignarse al atributo 'j'} + +{\selectlanguage{spanish}\ttfamily +stack traceback:} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ stdin:1: en función {\textasciigrave}main{\textasciigrave}} + +\subsection[8.4 Solidificación]{\selectlanguage{spanish} 8.4 Solidificación} +\hypertarget{RefHeadingToc359593639824055}{}{\selectlanguage{spanish} +La solidificación es el proceso de capturar estructuras y códigos Berry compilados (clases, módulos, mapas, listas...) y +almacenarlos en el firmware. Reduce drásticamente el uso de la memoria, pero tiene algunas limitaciones.} + +\subsubsection[Módulo solidify]{\foreignlanguage{spanish}{Módulo +}\textstyleSourceText{\foreignlanguage{spanish}{solidify}}} +\hypertarget{RefHeadingToc359613639824055}{}\foreignlanguage{spanish}{La solidificación es manejada por el módulo +}\textstyleSourceText{\foreignlanguage{spanish}{solidify}}\foreignlanguage{spanish}{. Este módulo no está compilado por +defecto debido a su tamaño (\~{}10kB). Debe compilar con la directiva +}\textstyleSourceText{\foreignlanguage{spanish}{\#define BE\_USE\_SOLIDIFY\_MODULE 1}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{El módulo tiene un solo miembro +}\textstyleSourceText{\foreignlanguage{spanish}{dump(x)}}\foreignlanguage{spanish}{ que toma un solo argumento (el +objeto a solidificar) y envía a }\textstyleSourceText{\foreignlanguage{spanish}{stdout}}\foreignlanguage{spanish}{ el +código solidificado.} + +{\selectlanguage{spanish} +De forma predeterminada, solidify agrega todas las constantes de cadena al grupo global. En su lugar, puede generar +cadenas débiles (elegibles para la poda por parte del enlazador) estableciendo el segundo argumento en +{\textquotedbl}verdadero{\textquotedbl}.} + +\foreignlanguage{spanish}{Por defecto, +}\textstyleSourceText{\foreignlanguage{spanish}{solidify.dump}}\foreignlanguage{spanish}{ genera el código solidificado +en la salida estándar. Puede especificar un archivo como tercer argumento. El archivo debe estar abierto en modo de +escritura y no está cerrado para que pueda concatenar varios objetos.} + +\textstyleSourceText{\foreignlanguage{spanish}{solidify.dump(object:any, [, strings\_weak:bool, file\_out:file]) +-{\textgreater} nil}} + +\subsubsection[Solidificación de funciones]{\selectlanguage{spanish} Solidificación de funciones} +\hypertarget{RefHeadingToc359633639824055}{}{\selectlanguage{spanish} +Puede solidificar una sola función.} + +{\selectlanguage{spanish} +Ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} def f() return {\textquotedbl}hello{\textquotedbl} end} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} import solidify} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} solidify.dump(f)} + +{\selectlanguage{spanish}\ttfamily +/********************************************************************} + +{\selectlanguage{spanish}\ttfamily +** Solidified function: f} + +{\selectlanguage{spanish}\ttfamily +********************************************************************/} + +{\selectlanguage{spanish}\ttfamily +be\_local\_closure(f, \ \ /* name */} + +{\selectlanguage{spanish}\ttfamily +\ \ be\_nested\_proto(} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* nstack */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* argc */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* varg */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has sup protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no sub protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const bvalue[ 1]) \{ \ \ \ \ /* constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* K0 \ \ */ \ be\_nested\_str(hello),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_f,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_solidified,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const binstruction[ 1]) \{ \ /* code */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x80060000, \ // \ 0000 \ RET \ \ \ 1 \ \ K0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})} + +{\selectlanguage{spanish}\ttfamily +\ \ )} + +{\selectlanguage{spanish}\ttfamily +);} + +{\selectlanguage{spanish}\ttfamily +/*******************************************************************/} + + +\bigskip + +\foreignlanguage{spanish}{Para compilar utilizando cadenas débiles (es decir, cadenas que el enlazador puede eliminar si +el objeto no está incluido en el ejecutable de destino), use +}\textstyleSourceText{\foreignlanguage{spanish}{solidify.dump(f, true)}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/********************************************************************} + +{\selectlanguage{spanish}\ttfamily +** Solidified function: f} + +{\selectlanguage{spanish}\ttfamily +********************************************************************/} + +{\selectlanguage{spanish}\ttfamily +be\_local\_closure(f, \ \ /* name */} + +{\selectlanguage{spanish}\ttfamily +\ \ be\_nested\_proto(} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* nstack */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* argc */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* varg */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has sup protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no sub protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const bvalue[ 1]) \{ \ \ \ \ /* constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* K0 \ \ */ \ be\_nested\_str\_weak(hello),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_str\_weak(f),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_solidified,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const binstruction[ 1]) \{ \ /* code */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x80060000, \ // \ 0000 \ RET \ \ \ 1 \ \ K0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})} + +{\selectlanguage{spanish}\ttfamily +\ \ )} + +{\selectlanguage{spanish}\ttfamily +);} + +{\selectlanguage{spanish}\ttfamily +/*******************************************************************/} + +\subsubsection[Solidificación de clases]{\selectlanguage{spanish} Solidificación de clases} +\hypertarget{RefHeadingToc359653639824055}{}\foreignlanguage{spanish}{Cuando solidifica una clase, incrusta todos los +subelementos. También se agrega un código auxiliar +}\textstyleSourceText{\foreignlanguage{spanish}{C}}\foreignlanguage{spanish}{ para crear la clase y agregarla al ámbito +global.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} \ class demo} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ var i} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ static foo = {\textquotedbl}bar{\textquotedbl}} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ self.i = 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ end} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ def say\_hello()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ print({\textquotedbl}Hello Berry!{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ end} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} import solidify} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} solidify.dump(demo)} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/********************************************************************} + +{\selectlanguage{spanish}\ttfamily +** Solidified function: init} + +{\selectlanguage{spanish}\ttfamily +********************************************************************/} + +{\selectlanguage{spanish}\ttfamily +be\_local\_closure(demo\_init, \ \ /* name */} + +{\selectlanguage{spanish}\ttfamily +\ \ be\_nested\_proto(} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* nstack */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* argc */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 2, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* varg */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has sup protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no sub protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const bvalue[ 2]) \{ \ \ \ \ /* constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* K0 \ \ */ \ be\_nested\_str(i),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* K1 \ \ */ \ be\_const\_int(0),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_init,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_solidified,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const binstruction[ 2]) \{ \ /* code */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x90020101, \ // \ 0000 \ SETMBR R0 \ K0 \ K1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x80000000, \ // \ 0001 \ RET \ \ \ 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})} + +{\selectlanguage{spanish}\ttfamily +\ \ )} + +{\selectlanguage{spanish}\ttfamily +);} + +{\selectlanguage{spanish}\ttfamily +/*******************************************************************/} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/********************************************************************} + +{\selectlanguage{spanish}\ttfamily +** Solidified function: say\_hello} + +{\selectlanguage{spanish}\ttfamily +********************************************************************/} + +{\selectlanguage{spanish}\ttfamily +be\_local\_closure(demo\_say\_hello, \ \ /* name */} + +{\selectlanguage{spanish}\ttfamily +\ \ be\_nested\_proto(} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 3, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* nstack */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* argc */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 2, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* varg */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has sup protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no sub protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const bvalue[ 1]) \{ \ \ \ \ /* constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* K0 \ \ */ \ be\_nested\_str(Hello\_X20Berry\_X21),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_say\_hello,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_solidified,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const binstruction[ 4]) \{ \ /* code */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x60040001, \ // \ 0000 \ GETGBL R1 \ G1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x58080000, \ // \ 0001 \ LDCONST \ \ \ R2 \ K0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x7C040200, \ // \ 0002 \ CALL \ \ R1 \ 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x80000000, \ // \ 0003 \ RET \ \ \ 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})} + +{\selectlanguage{spanish}\ttfamily +\ \ )} + +{\selectlanguage{spanish}\ttfamily +);} + +{\selectlanguage{spanish}\ttfamily +/*******************************************************************/} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/********************************************************************} + +{\selectlanguage{spanish}\ttfamily +** Solidified class: demo} + +{\selectlanguage{spanish}\ttfamily +********************************************************************/} + +{\selectlanguage{spanish}\ttfamily +be\_local\_class(demo,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_nested\_map(4,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( (struct bmapnode*) \&(const bmapnode[]) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(i, -1), be\_const\_var(0) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(say\_hello, 2), be\_const\_closure(demo\_say\_hello\_closure) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(init, -1), be\_const\_closure(demo\_init\_closure) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(foo, 1), be\_nested\_str(bar) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ (bstring*) \&be\_const\_str\_demo} + +{\selectlanguage{spanish}\ttfamily +);} + +{\selectlanguage{spanish}\ttfamily +/*******************************************************************/} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_load\_demo\_class(bvm *vm) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_pushntvclass(vm, \&be\_class\_demo);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_setglobal(vm, {\textquotedbl}demo{\textquotedbl});} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_pop(vm, 1);} + +{\selectlanguage{spanish}\ttfamily +\}} + + +\bigskip + +{\selectlanguage{spanish} +Las subclases también son compatibles.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} class demo\_sub : demo} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ var j} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ def init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ super(self).init()} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ self.j = 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ end} + +{\selectlanguage{spanish}\ttfamily +\ \ end} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} solidify.dump(demo\_sub)} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/********************************************************************} + +{\selectlanguage{spanish}\ttfamily +** Solidified function: init} + +{\selectlanguage{spanish}\ttfamily +********************************************************************/} + +{\selectlanguage{spanish}\ttfamily +be\_local\_closure(demo\_sub\_init, \ \ /* name */} + +{\selectlanguage{spanish}\ttfamily +\ \ be\_nested\_proto(} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 3, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* nstack */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* argc */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* varg */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has sup protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no sub protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const bvalue[ 3]) \{ \ \ \ \ /* constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* K0 \ \ */ \ be\_nested\_str(init),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* K1 \ \ */ \ be\_nested\_str(j),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* K2 \ \ */ \ be\_const\_int(1),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_init,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_solidified,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const binstruction[ 7]) \{ \ /* code */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x60040003, \ // \ 0000 \ GETGBL R1 \ G3} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x5C080000, \ // \ 0001 \ MOVE \ \ R2 \ R0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x7C040200, \ // \ 0002 \ CALL \ \ R1 \ 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x8C040300, \ // \ 0003 \ GETMET R1 \ R1 \ K0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x7C040200, \ // \ 0004 \ CALL \ \ R1 \ 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x90020302, \ // \ 0005 \ SETMBR R0 \ K1 \ K2} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x80000000, \ // \ 0006 \ RET \ \ \ 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})} + +{\selectlanguage{spanish}\ttfamily +\ \ )} + +{\selectlanguage{spanish}\ttfamily +);} + +{\selectlanguage{spanish}\ttfamily +/*******************************************************************/} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/********************************************************************} + +{\selectlanguage{spanish}\ttfamily +** Solidified class: demo\_sub} + +{\selectlanguage{spanish}\ttfamily +********************************************************************/} + +{\selectlanguage{spanish}\ttfamily +extern const bclass be\_class\_demo;} + +{\selectlanguage{spanish}\ttfamily +be\_local\_class(demo\_sub,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_class\_demo,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_nested\_map(2,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( (struct bmapnode*) \&(const bmapnode[]) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(init, -1), be\_const\_closure(demo\_sub\_init\_closure) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(j, 0), be\_const\_var(0) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_str\_literal({\textquotedbl}demo\_sub{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +);} + +{\selectlanguage{spanish}\ttfamily +/*******************************************************************/} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_load\_demo\_sub\_class(bvm *vm) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_pushntvclass(vm, \&be\_class\_demo\_sub);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_setglobal(vm, {\textquotedbl}demo\_sub{\textquotedbl});} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_pop(vm, 1);} + +{\selectlanguage{spanish}\ttfamily +\}} + +\subsubsection[Solidificación de módulos]{\selectlanguage{spanish} Solidificación de módulos} +\hypertarget{RefHeadingToc359673639824055}{}{\selectlanguage{spanish} +Cuando solidifica un módulo, incrusta todos los subelementos. También funciona con listas o mapas incrustados.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} def say\_hello() print({\textquotedbl}Hello Berry!{\textquotedbl}) end} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m = module({\textquotedbl}demo\_module{\textquotedbl})} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m.i = 0} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m.s = {\textquotedbl}foo{\textquotedbl}} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m.f = say\_hello} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m.l = [0,1,{\textquotedbl}a{\textquotedbl}]} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} m.m = \{{\textquotedbl}a{\textquotedbl}:{\textquotedbl}b{\textquotedbl}, +{\textquotedbl}2{\textquotedbl}:3\}} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} import solidify} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} solidify.dump(m)} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/********************************************************************} + +{\selectlanguage{spanish}\ttfamily +** Solidified function: say\_hello} + +{\selectlanguage{spanish}\ttfamily +********************************************************************/} + +{\selectlanguage{spanish}\ttfamily +be\_local\_closure(demo\_module\_say\_hello, \ \ /* name */} + +{\selectlanguage{spanish}\ttfamily +\ \ be\_nested\_proto(} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 2, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* nstack */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* argc */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* varg */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no upvals */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 0, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has sup protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ NULL, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* no sub protos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ 1, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ /* has constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const bvalue[ 1]) \{ \ \ \ \ /* constants */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* K0 \ \ */ \ be\_nested\_str(Hello\_X20Berry\_X21),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_say\_hello,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \&be\_const\_str\_solidified,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( \&(const binstruction[ 4]) \{ \ /* code */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x60000001, \ // \ 0000 \ GETGBL R0 \ G1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x58040000, \ // \ 0001 \ LDCONST \ \ \ R1 \ K0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x7C000200, \ // \ 0002 \ CALL \ \ R0 \ 1} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ 0x80000000, \ // \ 0003 \ RET \ \ \ 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})} + +{\selectlanguage{spanish}\ttfamily +\ \ )} + +{\selectlanguage{spanish}\ttfamily +);} + +{\selectlanguage{spanish}\ttfamily +/*******************************************************************/} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/********************************************************************} + +{\selectlanguage{spanish}\ttfamily +** Solidified module: demo\_module} + +{\selectlanguage{spanish}\ttfamily +********************************************************************/} + +{\selectlanguage{spanish}\ttfamily +be\_local\_module(demo\_module,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ {\textquotedbl}demo\_module{\textquotedbl},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_nested\_map(5,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( (struct bmapnode*) \&(const bmapnode[]) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(l, -1), be\_const\_simple\_instance(be\_nested\_simple\_instance(\&be\_class\_list, +\{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_const\_list( * \ \ \ \ be\_nested\_list(3,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( (struct bvalue*) \&(const bvalue[]) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_const\_int(0),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_const\_int(1),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_nested\_str(a),} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})) \ \ \ ) \} )) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(m, 3), be\_const\_simple\_instance(be\_nested\_simple\_instance(\&be\_class\_map, \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_const\_map( * \ \ \ \ be\_nested\_map(2,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ ( (struct bmapnode*) \&(const bmapnode[]) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(a, -1), be\_nested\_str(b) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(2, -1), be\_const\_int(3) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \})) \ \ \ ) \} )) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(i, 4), be\_const\_int(0) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(f, -1), be\_const\_closure(demo\_module\_say\_hello\_closure) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \{ be\_const\_key(s, -1), be\_nested\_str(foo) \},} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}))} + +{\selectlanguage{spanish}\ttfamily +);} + +{\selectlanguage{spanish}\ttfamily +BE\_EXPORT\_VARIABLE be\_define\_const\_native\_module(demo\_module);} + +{\selectlanguage{spanish}\ttfamily +/********************************************************************/} + +\subsubsection[limitaciones de la solidificación]{\selectlanguage{spanish} limitaciones de la solidificación} +\hypertarget{RefHeadingToc359693639824055}{}\foreignlanguage{spanish}{La solidificación funciona para muchos objetos: +}\textstyleSourceText{\foreignlanguage{spanish}{clase}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{módulo}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{funciones}}\foreignlanguage{spanish}{ y constantes incrustadas u +objetos como }\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{real}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{string}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +Limitaciones:} + +\liststyleLxvi +\begin{itemize} +\item {\selectlanguage{spanish} +Los upvals no son compatibles. No puede solidificar un cierre que captura upvals del alcance externo} +\item \foreignlanguage{spanish}{La captura de variables globales requiere compilar con la opción +}\textstyleSourceText{\foreignlanguage{spanish}{{}-g}}\foreignlanguage{spanish}{ {\textquotedbl}globales con +nombre{\textquotedbl} (habilitada de forma predeterminada en Tasmota)} +\item {\selectlanguage{spanish} +Las constantes de cadena están limitadas a 255 bytes, cadenas largas (más de 255 caracteres no son compatibles, porque +nadie nunca los necesitó)} +\item {\selectlanguage{spanish} +Los objetos solidificados son de solo lectura, esto tiene algunas consecuencias en las clases. Puede solidificar una +clase con sus miembros estáticos cuando se crea, pero no puede solidificar una función que crea una clase derivada de +otra clase o con miembros estáticos. La razón principal es que la configuración de la superclase o la asignación de +miembros estáticos se implementa mediante el código mutante en la nueva clase, que no puede funcionar en una clase no +mutante de solo lectura.} +\item {\selectlanguage{spanish} +El código solidificado puede depender del tamaño de {\textquotedbl}int{\textquotedbl} y +{\textquotedbl}real{\textquotedbl} y es posible que no se transfiera a través de MCU con tipos de diferentes tamaños. +Es posible que deba volver a solidificar para cada objetivo.} +\end{itemize} +\clearpage\section[Capítulo 9: Interfaz de Función +Externa]{\foreignlanguage{spanish}{C}\foreignlanguage{spanish}{apítulo 9: }Interfaz de Función Externa} +\hypertarget{RefHeadingToc359713639824055}{} +\bigskip + +{\selectlanguage{spanish} +La \textbf{Interfaz de Función Externa} (FFI) es una interfaz para la interacción entre diferentes lenguajes. Berry +proporciona un conjunto de FFI para realizar la interacción con el lenguaje C, este conjunto de interfaces también es +muy fácil de usar en C++. La mayoría de las interfaces FFI son funciones y sus declaraciones se colocan en el archivo +\textit{berry.h}. Para reducir la cantidad de RAM utilizada, FFI también proporciona un mecanismo para generar una +tabla hash fija durante la compilación de C. Este mecanismo debe utilizar herramientas externas para generar código C.} + +\subsection[9.1 Conceptos básicos]{\selectlanguage{spanish} 9.1 Conceptos básicos} +\hypertarget{RefHeadingToc359733639824055}{}{\selectlanguage{spanish} +La función interactiva más importante en FFI debería ser la función de llamar al código Berry y la función C mutuamente. +Para darnos cuenta de cómo dos lenguajes llaman a las funciones del otro, primero debemos entender el mecanismo de paso +de parámetros de la función de Berry.} + +\subsubsection[9.1.1 Máquina virtual]{\selectlanguage{spanish} 9.1.1 Máquina virtual} +\hypertarget{RefHeadingToc359753639824055}{}\foreignlanguage{spanish}{A diferencia de los lenguajes compilados, el +lenguaje Berry no puede ejecutarse directamente en una máquina física, sino en un entorno de software específico, que +es }\foreignlanguage{spanish}{\textbf{Máquina virtual}}\foreignlanguage{spanish}{ (VM). Similar a una computadora real, +el código fuente en forma de texto no se puede ejecutar en una máquina virtual, sino que un compilador debe convertirlo +en {\textquotedbl}código de bytes{\textquotedbl}. La máquina virtual Berry se define como una estructura C +}\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{, el contenido de esta estructura es +invisible para FFI. A través de algunas funciones de FFI, podemos crear e inicializar una máquina virtual. +Introduciremos el uso de máquinas virtuales a través de un ejemplo sencillo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void berry\_test(void)} + +{\selectlanguage{spanish}\ttfamily +\{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ bvm *vm = be\_vm\_new(); // Construir una VM} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_loadstring(vm, {\textquotedbl}print('Hola Berry'){\textquotedbl}); // Compilar código de prueba} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_pcall(vm, 0); // Función de llamada} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_vm\_delete(vm); // Destruir la VM} + +{\selectlanguage{spanish}\ttfamily +\}} + + +\bigskip + +\foreignlanguage{spanish}{Este código da un ejemplo completo del uso de una máquina virtual. Primero, se llama a la +función }\textstyleSourceText{\foreignlanguage{spanish}{be\_vm\_new}}\foreignlanguage{spanish}{ para construir una +nueva máquina virtual, y luego todas las operaciones se completan en este objeto de máquina virtual. La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_vm\_new}}\foreignlanguage{spanish}{ vinculará automáticamente la +biblioteca estándar al crear una máquina virtual. La función de las líneas 4 a 5 es compilar el código fuente de una +cadena en una función Berry y luego llamarla. Finalmente, se llama a la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_vm\_delete}}\foreignlanguage{spanish}{ en la línea 6 para destruir +la máquina virtual. Al ejecutar esta función obtendrá una línea de salida en la terminal:} + +\textstyleSourceText{\foreignlanguage{spanish}{Hola Berry}} + +\foreignlanguage{spanish}{En todos los escenarios, la construcción de la máquina virtual, la carga de la biblioteca y el +proceso de destrucción son los mismos que en las líneas 3, 4 y 6 del ejemplo anterior. Si es necesario, la forma de +compilar o cargar el código fuente puede ser diferente. Por ejemplo, }\foreignlanguage{spanish}{para el código fuente +en forma de archivo, se puede compilar a través de la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadfile}}\foreignlanguage{spanish}{. El código fuente se compilará +en una función Berry y la función se almacenará en la parte superior de la pila. La función Berry se puede ejecutar +llamando a la función FFI }\textstyleSourceText{\foreignlanguage{spanish}{be\_pcall}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{be\_call}}\foreignlanguage{spanish}{. También puede usar REPL a través +de la función }\textstyleSourceText{\foreignlanguage{spanish}{be\_repl}}\foreignlanguage{spanish}{. La interfaz del +REPL se describirá en los capítulos correspondientes.} + +\subsubsection[9.1.2 Pila virtual]{\selectlanguage{spanish} 9.1.2 Pila virtual} +\hypertarget{RefHeadingToc359773639824055}{}{\selectlanguage{spanish} +Berry usa una pila virtual y funciones nativas escritas en C para pasar valores. Cada elemento de la pila es un valor +Berry. Cuando el código Berry llama a una función nativa, siempre crea una nueva pila y empuja todos los parámetros a +la pila. Esta pila virtual también se puede usar en código C para almacenar datos, y el recolector de elementos no +utilizados no reclamará el valor almacenado en la pila.} + + +\bigskip + + \includegraphics[width=19.967cm,height=6.456cm]{berryrmeses-img001.png} + + +\bigskip + +{\selectlanguage{spanish} +La pila virtual utilizada por Berry se muestra en la figura anterior.} + +\foreignlanguage{spanish}{La pila virtual crece de izquierda a derecha. Cuando el código Berry llama a una función +nativa, obtendrá una pila inicial. La posición del primer valor de la pila se llama +}\foreignlanguage{spanish}{\textbf{base}}\foreignlanguage{spanish}{, y la última posición se llama +}\foreignlanguage{spanish}{\textbf{superior}}\foreignlanguage{spanish}{ (top), en la función nativa solo el valor desde +la parte inferior de la pila hasta la posición anterior a la parte superior de la pila puede ser accesible. La posición +de la parte inferior de la pila es fija, mientras que la posición de la parte superior de la pila se puede mover y la +parte superior de la pila siempre está vacía. El motivo de esta propiedad es que después de insertar el nuevo valor en +la pila virtual, en la posición original de la parte superior de la pila se escribirá el nuevo valor, el puntero +superior de la pila avanzará a la siguiente posición; por el contrario, si se extrae el valor en la parte superior de +la pila virtual, el puntero superior de la pila disminuirá de 1. En este momento, aunque la posición del puntero +superior de la pila es objetivamente un valor, este no es válido y se puede borrar en cualquier momento, por lo que la +posición del puntero en la parte superior de la pila aún está vacía. Cuando la pila virtual está vacía, el puntero +inferior }\textstyleSourceText{\foreignlanguage{spanish}{base}}\foreignlanguage{spanish}{ es igual al puntero superior +}\textstyleSourceText{\foreignlanguage{spanish}{top}}\foreignlanguage{spanish}{. La pila virtual no sigue estrictamente +las reglas de funcionamiento de la pila: además de empujar y sacar, también se puede acceder a la pila virtual por +índice, e incluso insertar o eliminar valores en cualquier posición. Hay dos formas de indexar +}\foreignlanguage{spanish}{elementos en la pila: una se basa en la parte inferior de la pila +}\foreignlanguage{spanish}{\textbf{Índice absoluto}}\foreignlanguage{spanish}{, el valor del índice absoluto es un +número entero positivo a partir de 1; el otro se basa en la parte superior de la pila +}\foreignlanguage{spanish}{\textbf{Índice relativo}}\foreignlanguage{spanish}{, el valor del índice relativo es un +número entero negativo a partir de $-$ 1. Tome la Figura anterior como ejemplo, el valor de índice 1, 2{\dots}8 es un +índice absoluto, y el índice absoluto de un elemento es la distancia desde el elemento hasta el final de la pila. El +valor de índice $-$ 1, $-$ 2{\dots} $-$ 8 es un índice relativo, y el valor de índice relativo de un elemento es el +número negativo de la distancia desde el elemento hasta la parte superior de la pila. Si un valor de índice +}\foreignlanguage{spanish}{\textit{index}}\foreignlanguage{spanish}{ es válido, entonces el elemento al que se refiere +debe estar entre la parte inferior de la pila y la parte superior de la pila, lo que significa se cumple que la +expresión:} + +\textstyleSourceText{\foreignlanguage{spanish}{1 ${\leq}$ abs(*index*) ${\leq}$ *top* $-$ *base* + +1}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{Por conveniencia, estipulamos que el puntero inferior de la pila 'base' se usa como +referencia, y su índice absoluto 1, y el valor anterior de 'base' no se considera (por lo general, 'base' no es la +posición inferior de todo el pila). Por ejemplo, cuando regresa una función nativa, la ubicación donde se almacena el +valor de retorno está justo antes de }\textstyleSourceText{\foreignlanguage{spanish}{base}}\foreignlanguage{spanish}{, +y la función nativa no suele acceder a estas ubicaciones.} + +\subsubsection[9.1.3 Operar con pila virtual]{\selectlanguage{spanish} 9.1.3 Operar con pila virtual} +\hypertarget{RefHeadingToc359793639824055}{}\paragraph[Índice y tamaño de pila]{\selectlanguage{spanish} Índice y tamaño +de pila} +\hypertarget{RefHeadingToc359813639824055}{}\foreignlanguage{spanish}{Como se mencionó anteriormente, se pueden usar dos +métodos de indexación para acceder a la pila virtual y el valor del índice debe ser válido. Al mismo tiempo, en muchos +casos también es necesario introducir nuevos valores en la pila. En este caso, el programador debe asegurarse de que la +pila no se desborde. Por defecto, Berry garantiza el espacio +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_STACK\_FREE\_MIN}}\foreignlanguage{spanish}{ para que lo usen las +funciones nativas. Este valor se puede modificar en el archivo +}\foreignlanguage{spanish}{\textit{berry.h}}\foreignlanguage{spanish}{. Su valor por defecto suele ser 10, que debería +ser suficiente en la mayoría de los casos. Si realmente necesita expandir la pila, puede llamar a la función FFI +}\textstyleSourceText{\foreignlanguage{spanish}{be\_stack\_require}}\foreignlanguage{spanish}{. El prototipo de esta +función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_stack\_require(bvm *vm, int count);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{count}}\foreignlanguage{spanish}{ +es la cantidad de espacio necesario. Cuando el espacio restante en la pila virtual sea insuficiente, la capacidad de la +pila se expandirá; de lo contrario, esta función no hará nada.} + +\foreignlanguage{spanish}{\textbf{Advertencia}}\foreignlanguage{spanish}{: si se produce un desbordamiento de la pila, o +si se utiliza un índice no válido para acceder a la pila, el programa fallará. Puede activar el interruptor de +depuración }\textstyleSourceText{\foreignlanguage{spanish}{BE\_DEBUG}}\foreignlanguage{spanish}{ (sección +[sección::BE\_DEBUG] ), que activará la función de aserción, y puede obtener información de depuración en tiempo de +ejecución para detectar errores como desbordamiento de pila o índice no válido.} + +\paragraph[Obtener valor de la pila]{\selectlanguage{spanish} Obtener valor de la pila} +\hypertarget{RefHeadingToc359833639824055}{}{\selectlanguage{spanish} +Hay un conjunto de funciones en FFI para obtener valores de la pila virtual. Estas funciones generalmente convierten los +valores en la pila en valores simples compatibles con el lenguaje C y luego regresan. Los siguientes son FFI de uso +común para obtener valores de la pila:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +bint be\_toint(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +breal be\_toreal(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_tobool(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +const char* be\_tostring(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +void* be\_tocomptr(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{La forma de parámetro de estas funciones es la misma, pero el valor de retorno es diferente. +Las primeras cuatro funciones son fáciles de entender. Al igual que sus nombres, la función de +}\textstyleSourceText{\foreignlanguage{spanish}{be\_toint}}\foreignlanguage{spanish}{ es convertir los valores en la +pila virtual a valores enteros de C (}\textstyleSourceText{\foreignlanguage{spanish}{bint}}\foreignlanguage{spanish}{ +suele ser un alias de tipo }\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{) y +devolverlos. La función de la última función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_tocomptr}}\foreignlanguage{spanish}{ es sacar un valor de puntero +de tipo general de la pila virtual. El significado específico de este puntero se explica por el propio programa C.} + +\foreignlanguage{spanish}{Estas funciones utilizan la misma forma de interpretar los parámetros: el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es el puntero de la instancia de la +máquina virtual; }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del +elemento a recuperar, que puede ser un índice relativo o un índice absoluto. No puede usar FFI para eliminar los tipos +de datos complejos de Berry de la pila virtual, por lo que no puede eliminar un tipo de +{\textquotedbl}map{\textquotedbl} o un tipo de {\textquotedbl}class{\textquotedbl} de la pila. Uno de los beneficios de +este diseño es que no es necesario considerar la recolección de elementos no utilizados en las funciones nativas.} + +\subsubsection[9.1.4 Función nativa]{\selectlanguage{spanish} 9.1.4 Función nativa} +\hypertarget{RefHeadingToc359853639824055}{}{\selectlanguage{spanish} +Una \textbf{Función nativa} está implementada por lenguaje C y puede ser llamada por código Berry. La función nativa +puede ser una función ordinaria. En este caso, llamar a la función nativa no generará ningún espacio asignado +dinámicamente, al igual que una llamada de función C normal. Las funciones nativas también pueden ser cierres, y se +debe asignar espacio para variables libres al crear cierres nativos. En circunstancias normales, las funciones nativas +simples son suficientes para satisfacer las necesidades. Ahorran más recursos que los cierres nativos y son más fáciles +de usar.} + +\paragraph[Definir una función nativa]{\selectlanguage{spanish} Definir una función nativa} +\hypertarget{RefHeadingToc359873639824055}{}{\selectlanguage{spanish} +La función nativa en sí es una función C, pero todas tienen una forma específica. La definición de la función nativa +es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int a\_native\_function(bvm *vm)} + +{\selectlanguage{spanish}\ttfamily +\{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ // hacer algo ...} + +{\selectlanguage{spanish}\ttfamily +\}} + + +\bigskip + +\foreignlanguage{spanish}{La función nativa debe ser una función C cuyo parámetro sea un puntero a +}\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{ y el valor de retorno sea +}\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{. Las funciones de Berry deben devolver +un valor y las funciones nativas no son una excepción. A diferencia del valor de retorno del lenguaje C, el valor de +retorno de la función nativa no es el valor transportado por la instrucción C +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{. Puede usar estos FFI para devolver +el valor de la función nativa, y también hacen que la función C devuelva:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_return(bvm *vm);} + +{\selectlanguage{spanish}\ttfamily +be\_return\_nil(bvm *vm);} + + +\bigskip + +\foreignlanguage{spanish}{Estos FFI son en realidad dos macros, y no es necesario usar la instrucción C +}\textstyleSourceText{\foreignlanguage{spanish}{return}}\foreignlanguage{spanish}{ al usarlos. +}\textstyleSourceText{\foreignlanguage{spanish}{be\_return}}\foreignlanguage{spanish}{ pondrá la parte superior de la +pila virtual} + +\paragraph[Usar una función nativa]{\selectlanguage{spanish} Usar una función nativa} +\hypertarget{RefHeadingToc359893639824055}{}{\selectlanguage{spanish} +Después de definir la función nativa, debe agregarse al intérprete de alguna manera antes de que pueda llamarse en +código Berry. Una de las formas más sencillas es agregar funciones nativas a la tabla de objetos integrada de Berry. El +proceso de configuración de objetos nativos como objetos incorporados de Berry se denomina \textbf{registración}. El +FFI de la función nativa registrada es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_regfunc(bvm *vm, const char *nombre, bntvfunc f);} + + +\bigskip + +\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es la instancia actual de la máquina +virtual, }\textstyleSourceText{\foreignlanguage{spanish}{nombre}}\foreignlanguage{spanish}{ es el nombre de la función +nativa y }\textstyleSourceText{\foreignlanguage{spanish}{f}}\foreignlanguage{spanish}{ es el puntero de la función +nativa. El comportamiento específico de esta función está relacionado con el valor de la macro +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_USE\_PRECOMPILED\_OBJECT}}\foreignlanguage{spanish}{ (aunque el FFI +todavía está disponible cuando se utiliza la técnica de construcción en tiempo de compilación, no puede registrar +dinámicamente las variables integradas. En este caso, consulte el método de registro de los objetos integrados. 1.3 ). +La definición del tipo de función nativa +}\textstyleSourceText{\foreignlanguage{spanish}{bntvfunc}}\foreignlanguage{spanish}{ es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +typedef int (*bntvfunc)(bvm*);} + + +\bigskip + +\foreignlanguage{spanish}{De hecho, el tipo +}\textstyleSourceText{\foreignlanguage{spanish}{bntvfunc}}\foreignlanguage{spanish}{ es el tipo de puntero de función +con el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{ y el tipo de valor +devuelto }\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{. La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_regfunc}}\foreignlanguage{spanish}{ debe llamarse antes de analizar +el código fuente de Berry.} + +\foreignlanguage{spanish}{También puede insertar la función nativa en la pila virtual y luego usar una función FFI +}\textstyleSourceText{\foreignlanguage{spanish}{be\_call}}\foreignlanguage{spanish}{ para llamarla. Un uso más común es +usar el objeto de función nativa en la pila virtual como valor de retorno.} + +\paragraph[Ejemplo completo]{\selectlanguage{spanish} Ejemplo completo} +\hypertarget{RefHeadingToc359913639824055}{}\foreignlanguage{spanish}{Finalizamos esta sección con un ejemplo sencillo. +Aquí, vamos a implementar una función }\textstyleSourceText{\foreignlanguage{spanish}{add}}\foreignlanguage{spanish}{ +que suma dos números y devuelve el resultado del cálculo. Primero, definimos una función nativa para implementar esta +función:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +static int l\_add(bvm *vm)} + +{\selectlanguage{spanish}\ttfamily +\{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ int top = be\_top(vm); // Obtener el número de argumentos} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* Verificar el número y tipo de argumentos */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ if (top == 2 \&\& be\_isnumber(vm, 1) \&\& be\_isnumber(vm, 2)) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ breal x = be\_toreal(vm, 1); // Obtener el primer argumento} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ breal y = be\_toreal(vm, 2); // Obtener el segundo argumento} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_pushreal(vm, x + y); // Empuje el resultado a la pila} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_return(vm); // Devuelve el valor en la parte superior de la pila} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_return\_nil(vm); // Devuelve nil cuando algo sale mal} + +{\selectlanguage{spanish}\ttfamily +\}} + + +\bigskip + +\foreignlanguage{spanish}{Por lo general, las funciones nativas no necesitan usarse fuera del archivo C, por lo que +generalmente se declaran como tipos +}\textstyleSourceText{\foreignlanguage{spanish}{estáticos}}\foreignlanguage{spanish}{. Utilice la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_top}}\foreignlanguage{spanish}{ para obtener el +}\foreignlanguage{spanish}{índice absoluto de la parte superior de la pila virtual (valor +}\textstyleSourceText{\foreignlanguage{spanish}{top}}\foreignlanguage{spanish}{), que es la capacidad de la pila. +Podemos llamar a }\textstyleSourceText{\foreignlanguage{spanish}{be\_top}}\foreignlanguage{spanish}{ antes de que la +función nativa realice la operación de pila virtual, en este momento la capacidad de la pila virtual es igual a la +cantidad de parámetros reales. Para la función +}\textstyleSourceText{\foreignlanguage{spanish}{add}}\foreignlanguage{spanish}{, necesitamos dos parámetros para +participar en la operación, así que verifica si el número de parámetros es 2 en la cuarta línea +(}\textstyleSourceText{\foreignlanguage{spanish}{top == 2}}\foreignlanguage{spanish}{). Y necesitamos verificar si los +dos parámetros son de tipo numérico, por lo que debemos llamar a la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isnumber}}\foreignlanguage{spanish}{ para verificar. Si todo es +correcto, los parámetros se sacarán de la pila virtual, luego el resultado del cálculo se colocará en la pila y +finalmente se devolverá usando }\textstyleSourceText{\foreignlanguage{spanish}{be\_return}}\foreignlanguage{spanish}{. +Si la verificación del parámetro falla, se llamará a +}\textstyleSourceText{\foreignlanguage{spanish}{be\_return\_nil}}\foreignlanguage{spanish}{ para devolver el valor de +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +A continuación, registre esta función nativa en la tabla de objetos integrada. Para simplificar, lo registramos después +de cargar la biblioteca:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +bvm *vm = be\_vm\_new(); // Construir una VM} + +{\selectlanguage{spanish}\ttfamily +be\_regfunc(vm, {\textquotedbl}myadd{\textquotedbl}, l\_add); // Registrar la función nativa +{\textquotedbl}myadd{\textquotedbl}} + + +\bigskip + +\foreignlanguage{spanish}{La segunda línea es donde se registra la función nativa y la llamamos +}\textstyleSourceText{\foreignlanguage{spanish}{myadd}}\foreignlanguage{spanish}{. En este punto, la definición y el +registro de la función nativa están completos. Como verificación, puede compilar el intérprete, luego ingresar el REPL +y ejecutar algunas pruebas. Debería obtener resultados como este:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{\textgreater} myadd} + +{\selectlanguage{spanish}\ttfamily +{\textless}function: 0x562a210f0f90{\textgreater}} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} myadd(1.0, 2.5)} + +{\selectlanguage{spanish}\ttfamily +3.5} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} myadd(2.5, 2)} + +{\selectlanguage{spanish}\ttfamily +4.5} + +{\selectlanguage{spanish}\ttfamily +{\textgreater} myadd(1, 2)} + +{\selectlanguage{spanish}\ttfamily +3} + +\subsection[9.2 Tipos y Funciones]{\selectlanguage{spanish} 9.2 Tipos y Funciones} +\hypertarget{RefHeadingToc359933639824055}{}\subsubsection[9.2.1 Tipos]{\selectlanguage{spanish} 9.2.1 Tipos} +\hypertarget{RefHeadingToc359953639824055}{}{\selectlanguage{spanish} +Esta sección presentará algunos tipos que deben usarse en FFI y son generalmente utilizados por funciones FFI. +Generalmente, los tipos y declaraciones en FFI se pueden encontrar en el archivo \textit{berry.h}. A menos que se +especifique lo contrario en esta sección, la definición o declaración se proporciona en \textit{berry.h} de forma +predeterminada.} + +\foreignlanguage{spanish}{El tipo }\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{ se +utiliza para almacenar la información de estado de la máquina virtual Berry. Los detalles de este tipo no son visibles +para los programas externos. Por lo tanto, esta definición solo se puede encontrar en el archivo +}\foreignlanguage{spanish}{\textit{berry.h}}\foreignlanguage{spanish}{:} + +{\selectlanguage{spanish}\ttfamily +typedef struct bvm bvm;} + +\foreignlanguage{spanish}{La mayoría de las funciones de FFI usan el tipo +}\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{ como primer parámetro, porque todas +operan en la máquina virtual internamente. Ocultar la implementación interna de +}\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{ ayuda a reducir el acoplamiento entre +el estándar FFI y la VM. Fuera del intérprete, normalmente solo se utilizan punteros +}\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{. Para crear un nuevo objeto +}\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{, use la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_vm\_new}}\foreignlanguage{spanish}{ y destruya el objeto +}\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{ usando la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_vm\_delete}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +La definición del tipo de función nativa es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +typedef int (*bntvfunc)(bvm*);} + + +\bigskip + +\foreignlanguage{spanish}{Este tipo es un puntero de función nativo y algunas FFI que registran o agregan funciones +nativas a la máquina virtual usan parámetros de este tipo. Las variables o parámetros de este tipo deben inicializarse +con un nombre de función cuyo parámetro sea del tipo +}\textstyleSourceText{\foreignlanguage{spanish}{bvm}}\foreignlanguage{spanish}{ y cuyo valor de retorno sea del tipo +}\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +Este tipo se usa cuando se registran funciones nativas en lotes o se construyen clases nativas. Se define como:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +typedef struct \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ const char *nombre; // El nombre de la función u objeto} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ bntvfunc funcion; // El puntero de función} + +{\selectlanguage{spanish}\ttfamily +\} bnfuncinfo;} + + +\bigskip + +\foreignlanguage{spanish}{El miembro }\textstyleSourceText{\foreignlanguage{spanish}{nombre}}\foreignlanguage{spanish}{ +de }\textstyleSourceText{\foreignlanguage{spanish}{bnfuncinfo}}\foreignlanguage{spanish}{ representa el nombre de una +función u objeto, y el miembro }\textstyleSourceText{\foreignlanguage{spanish}{funcion}}\foreignlanguage{spanish}{ es +un puntero de función nativo.} + +\foreignlanguage{spanish}{Este tipo es un tipo entero integrado de Berry. Se define en el documento +}\foreignlanguage{spanish}{\textit{berry.h}}\foreignlanguage{spanish}{. Por defecto, +}\textstyleSourceText{\foreignlanguage{spanish}{bint}}\foreignlanguage{spanish}{ se implementa usando el tipo +}\textstyleSourceText{\foreignlanguage{spanish}{long long}}\foreignlanguage{spanish}{, y la implementación de +}\textstyleSourceText{\foreignlanguage{spanish}{bint}}\foreignlanguage{spanish}{ se puede modificar cambiando el +archivo de configuración.} + +\foreignlanguage{spanish}{Este es el tipo de número real incorporado de Berry, que en realidad es el tipo de punto +flotante en lenguaje C. }\textstyleSourceText{\foreignlanguage{spanish}{breal}}\foreignlanguage{spanish}{ se define +como:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#if BE\_SINGLE\_FLOAT != 0} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ typedef float breal;} + +{\selectlanguage{spanish}\ttfamily +\#else} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ typedef double breal;} + +{\selectlanguage{spanish}\ttfamily +\#endif} + + +\bigskip + +\foreignlanguage{spanish}{Puede usar la macro +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_SINGLE\_FLOAT}}\foreignlanguage{spanish}{ para controlar la +implementación específica de }\textstyleSourceText{\foreignlanguage{spanish}{breal}}\foreignlanguage{spanish}{: cuando +el valor de }\textstyleSourceText{\foreignlanguage{spanish}{BE\_SINGLE\_FLOAT}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, se usará la implementación de tipo +}\textstyleSourceText{\foreignlanguage{spanish}{doble}}\foreignlanguage{spanish}{ +}\textstyleSourceText{\foreignlanguage{spanish}{breal}}\foreignlanguage{spanish}{, de lo contrario, la implementación +de tipo }\textstyleSourceText{\foreignlanguage{spanish}{float}}\foreignlanguage{spanish}{ se utilizará para +}\textstyleSourceText{\foreignlanguage{spanish}{breal}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +[sección::código de error]} + +{\selectlanguage{spanish} +Este tipo de enumeración se utiliza en algunos valores de retorno de FFI. La definición de este tipo es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +enum berrorcode \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ BE\_OK = 0,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ BE\_IO\_ERROR,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ BE\_SYNTAX\_ERROR,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ BE\_EXEC\_ERROR,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ BE\_MALLOC\_FAIL,} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ BE\_EXIT} + +{\selectlanguage{spanish}\ttfamily +\};} + + +\bigskip + +{\selectlanguage{spanish} +El significado de estos valores de enumeración son:} + +\liststyleLxvii +\begin{itemize} +\item \textstyleSourceText{\foreignlanguage{spanish}{BE\_OK}}\foreignlanguage{spanish}{: No hay ningún error, la función +se ejecuta con éxito.} +\item \textstyleSourceText{\foreignlanguage{spanish}{BE\_IO\_ERROR}}\foreignlanguage{spanish}{: Ocurrió un error de +lectura de archivo cuando el intérprete estaba leyendo el archivo fuente. El error generalmente es causado por el +ausencia del expediente.} +\item \textstyleSourceText{\foreignlanguage{spanish}{BE\_SYNTAX\_ERROR}}\foreignlanguage{spanish}{: Ocurrió un error de +sintaxis cuando el intérprete estaba compilando el código fuente. Después de que ocurre este error, el intérprete no +generará bytecode, por lo que no puede continuar ejecutándose el código de bytes.} +\item \textstyleSourceText{\foreignlanguage{spanish}{BE\_EXEC\_ERROR}}\foreignlanguage{spanish}{: Error de tiempo de +ejecución. Cuando se produce este error, la ejecución de El código Berry se detiene y el entorno se restaura al máximo +punto de recuperación reciente.} +\item \textstyleSourceText{\foreignlanguage{spanish}{BE\_MALLOC\_FAIL}}\foreignlanguage{spanish}{: Falló la asignación +de memoria. Este error es causado por espacio de pila insuficiente.} +\item \textstyleSourceText{\foreignlanguage{spanish}{BE\_EXIT}}\foreignlanguage{spanish}{: Indica que el programa sale y +el valor no es un error. Ejecutar la función +}\textstyleSourceText{\foreignlanguage{spanish}{exit}}\foreignlanguage{spanish}{ de Berry hace que el intérprete +devuelva este valor.} +\end{itemize} +\foreignlanguage{spanish}{Cabe señalar que cuando se produce un error +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_MALLOC\_FAIL}}\foreignlanguage{spanish}{, ya no se puede realizar +la asignación de memoria dinámica, lo que significa que ya no se pueden asignar objetos de cadena, por lo que la +función que devuelve este error generalmente no brinda información más detallada sobre el error.} + +\subsubsection[9.2.2 Funciones y Macros]{\selectlanguage{spanish} 9.2.2 Funciones y Macros} +\hypertarget{RefHeadingToc359973639824055}{}{\selectlanguage{spanish} +Esta función se utiliza para crear una nueva instancia de máquina virtual. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +bvm* be\_vm\_new(void);} + + +\bigskip + +\foreignlanguage{spanish}{El valor de retorno de la función es un puntero a la instancia de la máquina virtual. +}\textstyleSourceText{\foreignlanguage{spanish}{be\_vm\_new}}\foreignlanguage{spanish}{ es la primera función llamada +cuando se crea el intérprete de Berry. Esta función hará mucho trabajo: solicitar memoria para la máquina virtual, +inicializar el estado y los atributos de la máquina virtual, inicializar el GC (recolector de basura), la biblioteca +estándar se carga en la instancia de la máquina virtual, etc.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_vm\_delete}}\foreignlanguage{spanish}{ se usa para destruir una +instancia de máquina virtual. El prototipo de la función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_vm\_delete(bvm *vm);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero del objeto de la máquina virtual que se va a destruir. La destrucción de la máquina virtual liberará todos +los objetos de la máquina virtual, incluidos los valores de la pila y los objetos administrados por el GC. El puntero +de la máquina virtual después de la destrucción será un valor no válido y ya no se podrá hacer referencia a él.} + +{\selectlanguage{spanish} +Esta función se utiliza para cargar un fragmento de código fuente del búfer y compilarlo en un código de bytes. El +prototipo de la función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_loadbuffer(bvm *vm, const char *name, const char *buffer, size\_t length);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la máquina virtual. }\textstyleSourceText{\foreignlanguage{spanish}{name}}\foreignlanguage{spanish}{ es +una cadena, que generalmente se usa para marcar la fuente del código fuente. Por ejemplo, la entrada del código fuente +del dispositivo de entrada estándar puede pasar la cadena +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}stdin{\textquotedbl}}}\foreignlanguage{spanish}{ a este +parámetro, y la entrada del código fuente del archivo puede ser el nombre del archivo y se pasa a este parámetro. El +parámetro }\textstyleSourceText{\foreignlanguage{spanish}{buffer}}\foreignlanguage{spanish}{ es el búfer para almacenar +el código fuente. La organización de este búfer es muy similar a la cadena de C. Es una secuencia continua de +caracteres, pero el búfer al que apunta +}\textstyleSourceText{\foreignlanguage{spanish}{buffer}}\foreignlanguage{spanish}{ no requiere caracteres +}\textstyleSourceText{\foreignlanguage{spanish}{{}'{\textbackslash}0'}}\foreignlanguage{spanish}{ como terminador. El +parámetro }\textstyleSourceText{\foreignlanguage{spanish}{longitud}}\foreignlanguage{spanish}{ indica la longitud del +búfer. Esta longitud se refiere al número de bytes de texto de código fuente en el búfer.} + +\foreignlanguage{spanish}{Para dar un ejemplo simple, si queremos usar la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadbuffer}}\foreignlanguage{spanish}{ para compilar una cadena, el +uso general es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +const char *str = {\textquotedbl}print('Hola Berry'){\textquotedbl};} + +{\selectlanguage{spanish}\ttfamily +be\_loadbuffer(vm, {\textquotedbl}cadena{\textquotedbl}, str, strlen(str));} + + +\bigskip + +\foreignlanguage{spanish}{Aquí usamos la cadena +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}cadena{\textquotedbl}}}\foreignlanguage{spanish}{ para +representar el código fuente, también puede modificarla a cualquier valor. Tenga en cuenta que la función +}\textstyleSourceText{\foreignlanguage{spanish}{strlen}}\foreignlanguage{spanish}{ de la función de biblioteca estándar +de C se usa aquí para obtener la longitud del búfer de cadena (en realidad, el número de bytes en la cadena).} + +\foreignlanguage{spanish}{Si la compilación es exitosa, +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadbuffer}}\foreignlanguage{spanish}{ compilará el código fuente +en una función Berry y lo colocará en la parte superior de la pila virtual. Si la compilación encuentra un error, +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadbuffer}}\foreignlanguage{spanish}{ devolverá un valor de error +de tipo }\textstyleSourceText{\foreignlanguage{spanish}{berrorcode}}\foreignlanguage{spanish}{ [ver Sección código de +error] y, si es posible, almacenará la cadena de mensaje de error específica en la parte superior de la pila virtual.} + +\textstyleSourceText{\foreignlanguage{spanish}{be\_loadstring}}\foreignlanguage{spanish}{ es una macro definida como:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#define be\_loadstring(vm, str) be\_loadbuffer((vm), {\textquotedbl}string{\textquotedbl}, (str), strlen(str))} + + +\bigskip + +\foreignlanguage{spanish}{Esta macro es solo un contenedor simple para la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadbuffer}}\foreignlanguage{spanish}{. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es un puntero a la instancia de la +máquina virtual, y el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{str}}\foreignlanguage{spanish}{ es un +puntero a la cadena de código fuente. Es muy conveniente usar +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadstring}}\foreignlanguage{spanish}{ para compilar cadenas, por +ejemplo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_loadstring(vm, {\textquotedbl}print('Hola Berry'){\textquotedbl});} + + +\bigskip + +\foreignlanguage{spanish}{Esta forma de escribir es más concisa que usar +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadbuffer}}\foreignlanguage{spanish}{, pero debe asegurarse de que +la cadena termine con un carácter +}\textstyleSourceText{\foreignlanguage{spanish}{{}'{\textbackslash}0'}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +Esta función se utiliza para compilar un archivo de código fuente. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_loadfile(bvm *vm, const char *nombre);} + + +\bigskip + +\foreignlanguage{spanish}{La funcionalidad de esta función es similar a la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadbuffer}}\foreignlanguage{spanish}{, excepto que la función se +compilará leyendo el archivo de código fuente. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es el puntero de la instancia de la +máquina virtual y el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{nombre}}\foreignlanguage{spanish}{ es el +nombre del archivo de origen. Esta función llamará a la interfaz de archivo y, de forma predeterminada, utilizará +funciones como }\textstyleSourceText{\foreignlanguage{spanish}{fopen}}\foreignlanguage{spanish}{ en la biblioteca +estándar de C para manipular archivos.} + +\foreignlanguage{spanish}{Si usa la interfaz de archivo de la biblioteca estándar de C, puede usar nombres de archivo de +ruta relativa o ruta absoluta. Si el archivo no existe, +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadfile}}\foreignlanguage{spanish}{ devolverá un error +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_IO\_ERROR}}\foreignlanguage{spanish}{ (Ve Seccion de código de +error) y colocará el mensaje de error en la parte superior de la pila. Otros mensajes de error son los mismos que los +de la función }\textstyleSourceText{\foreignlanguage{spanish}{be\_loadbuffer}}\foreignlanguage{spanish}{. Se recomienda +usar la función }\textstyleSourceText{\foreignlanguage{spanish}{be\_loadfile}}\foreignlanguage{spanish}{ para compilar +el archivo fuente, en lugar de leer todos los archivos fuente en un búfer, y luego llamar a la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadbuffer}}\foreignlanguage{spanish}{ para compilar el código +fuente. El primero leerá el archivo fuente en segmentos y solo creará un pequeño búfer de lectura en la memoria, +ahorrando así más memoria.} + +\foreignlanguage{spanish}{La función }\textstyleSourceText{\foreignlanguage{spanish}{be\_top}}\foreignlanguage{spanish}{ +devuelve el valor de índice absoluto del elemento superior en la pila virtual. Este valor es también el número de +elementos en la pila virtual (la capacidad de la pila virtual). Llame a esta función antes de agregar o quitar +elementos en la pila virtual para obtener la cantidad de parámetros de la función nativa. El prototipo de esta función +es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_top(bvm *vm);} + + +\bigskip + +\foreignlanguage{spanish}{Esta función se suele utilizar para obtener el número de parámetros de una función nativa. +Cuando se usa para este propósito, se recomienda llamar a +}\textstyleSourceText{\foreignlanguage{spanish}{be\_top}}\foreignlanguage{spanish}{ en la parte superior del cuerpo de +la función nativa. P.ej:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +static int native\_function\_example(bvm *vm)} + +{\selectlanguage{spanish}\ttfamily +\{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ int argc = be\_top(vm); // Obtener el número de argumentos} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ // ...} + +{\selectlanguage{spanish}\ttfamily +\}} + + +\bigskip + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_typename}}\foreignlanguage{spanish}{ convierte el tipo del objeto +Berry en una cadena y lo devuelve. Por ejemplo, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}int{\textquotedbl}}}\foreignlanguage{spanish}{ para un +objeto entero y +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}function{\textquotedbl}}}\foreignlanguage{spanish}{ para +un objeto función. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +const char* be\_typename(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto a operar. La +función }\textstyleSourceText{\foreignlanguage{spanish}{type}}\foreignlanguage{spanish}{ en la biblioteca estándar de +Berry se implementa llamando a +}\textstyleSourceText{\foreignlanguage{spanish}{be\_typename}}\foreignlanguage{spanish}{. Consulte la sección +}\textstyleSourceText{\foreignlanguage{spanish}{baselib\_type}}\foreignlanguage{spanish}{ para conocer la cadena de +retorno correspondiente al tipo de parámetro.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_classname}}\foreignlanguage{spanish}{ se utiliza para obtener el +nombre de clase de un objeto o clase. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +const char* be\_classname(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto a operar. Si +el valor en }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es una instancia, la +función }\textstyleSourceText{\foreignlanguage{spanish}{be\_classname}}\foreignlanguage{spanish}{ devolverá la cadena +del nombre de la clase a la que pertenece la instancia, y si el valor en +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es una clase, devolverá directamente +la cadena del nombre de la clase. En otros casos +}\textstyleSourceText{\foreignlanguage{spanish}{be\_classname}}\foreignlanguage{spanish}{ devolverá +}\textstyleSourceText{\foreignlanguage{spanish}{NULL}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_strlen}}\foreignlanguage{spanish}{ devuelve la longitud de la +cadena Berry especificada. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_strlen(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto a operar. +Esta función devuelve el número de bytes en la cadena en +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ (los caracteres +}\textstyleSourceText{\foreignlanguage{spanish}{{}'{\textbackslash}0'}}\foreignlanguage{spanish}{ al final de la cadena +Berry no se cuentan). Si el valor de la posición +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ no es una cadena, la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_strlen}}\foreignlanguage{spanish}{ devolverá +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{Aunque la cadena +}\textstyleSourceText{\foreignlanguage{spanish}{Berry}}\foreignlanguage{spanish}{ es compatible con el formato de +cadena C, no se recomienda utilizar la función +}\textstyleSourceText{\foreignlanguage{spanish}{strlen}}\foreignlanguage{spanish}{ de la biblioteca estándar de C para +medir la longitud de la cadena Berry. Para cadenas Berry, +}\textstyleSourceText{\foreignlanguage{spanish}{be\_strlen}}\foreignlanguage{spanish}{ es más rápido que +}\textstyleSourceText{\foreignlanguage{spanish}{strlen}}\foreignlanguage{spanish}{ y tiene mejor compatibilidad.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_strconcat}}\foreignlanguage{spanish}{ se utiliza para empalmar dos +cadenas Berry. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_strconcat(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual. Esta función concatenará la cadena en la posición del parámetro de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ con la cadena en la posición superior +de la pila, y luego colocará la cadena resultante en la posición indexada por +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función }\textstyleSourceText{\foreignlanguage{spanish}{be\_pop}}\foreignlanguage{spanish}{ +extrae el valor en la parte superior de la pila. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pop(bvm *vm, int n);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, y el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{n}}\foreignlanguage{spanish}{ es la cantidad de valores que se +extraerán de la pila. Tenga en cuenta que el valor de +}\textstyleSourceText{\foreignlanguage{spanish}{n}}\foreignlanguage{spanish}{ no puede exceder la capacidad de la +pila.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_remove}}\foreignlanguage{spanish}{ elimina un valor de la pila. +Esta función eliminará un valor de la pila.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_remove(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual y el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto que se +eliminará. Después de que el valor en }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ +se mueva, los siguientes valores se completarán y la capacidad de la pila se reducirá en uno. El valor de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ no puede exceder la capacidad de la +pila.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_absindex}}\foreignlanguage{spanish}{ devuelve el valor de índice +absoluto de un valor de índice dado, y }\foreignlanguage{spanish}{su prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_absindex(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual y el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el valor del índice de entrada. Si +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es positivo, el valor de retorno de +}\textstyleSourceText{\foreignlanguage{spanish}{be\_absindex}}\foreignlanguage{spanish}{ es el valor de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{. Si +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es negativo, el valor de retorno de +be\_absindex es el valor de índice absoluto correspondiente a +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{. Cuando +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es un valor negativo (índice +relativo), su posición de índice no puede ser inferior a la parte inferior de la pila.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_newlist}}\foreignlanguage{spanish}{ crea un nuevo valor de +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{, y su prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_newlist(bvm *vm);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual. Después de llamar con éxito a esta función, el nuevo valor de +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ se colocará en la parte superior de la +pila. El valor }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ es una representación +interna de una lista, que no debe confundirse con una instancia de la clase +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_newmap}}\foreignlanguage{spanish}{ crea un nuevo valor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{, y su prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_newmap(bvm *vm);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual. Después de llamar con éxito a esta función, el nuevo valor del +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ se colocará en la parte superior de la +pila. El valor }\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ es una representación +interna de una lista, que no debe confundirse con una instancia de la clase +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_getglobal}}\foreignlanguage{spanish}{ empuja la variable global con +el nombre especificado a la pila. Su prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_getglobal(bvm *vm, const char *name);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual y el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{name}}\foreignlanguage{spanish}{ es el nombre de la variable global. +Después de llamar a esta función, la variable global llamada +}\textstyleSourceText{\foreignlanguage{spanish}{name}}\foreignlanguage{spanish}{ se colocará en la parte superior de la +pila virtual.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_setmember}}\foreignlanguage{spanish}{ se utiliza para establecer el +valor de la variable miembro de la clase de objeto de instancia. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_setmember(bvm *vm, int index, const char *k);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto de la +instancia y el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{k}}\foreignlanguage{spanish}{ es el nombre del +miembro. Esta función copiará el valor en la parte superior de la pila al miembro +}\textstyleSourceText{\foreignlanguage{spanish}{k}}\foreignlanguage{spanish}{ de la instancia de posición de índice. +Tenga en cuenta que el elemento superior de la pila no aparecerá automáticamente.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_getmember}}\foreignlanguage{spanish}{ se utiliza para obtener el +valor de la variable miembro de la clase }\foreignlanguage{spanish}{de objeto de instancia. El prototipo de función +es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_getmember(bvm *vm, int index, const char *k);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto de la +instancia y el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{k}}\foreignlanguage{spanish}{ es el nombre del +miembro. Esta función coloca el valor del miembro de la instancia de posición de índice +}\textstyleSourceText{\foreignlanguage{spanish}{k}}\foreignlanguage{spanish}{ en la parte superior de la pila virtual.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_getindex}}\foreignlanguage{spanish}{ se utiliza para obtener el +valor de }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_getindex(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, y el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto a operar. +Esta función se usa para obtener un elemento del contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ (valores internos, no instancias de +las clases }\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{), y el índice del elemento se almacena +en la parte superior de la pila (el índice relativo es -1). Después de llamar a esta función, el valor obtenido del +contenedor se colocará en la parte superior de la pila. Si no hay ningún subíndice señalado por el contenedor, el valor +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ se colocará en la parte superior de la +pila. Por ejemplo, si el elemento con el índice 1 en la pila virtual es una +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ y queremos extraer el elemento con el +índice 0, entonces podemos usar el siguiente código:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_pushint(vm, 0); // \ Inserte el valor de índice 0 en la pila virtual} + +{\selectlanguage{spanish}\ttfamily +be\_getindex(vm, 1); // \ Obtener un elemento del contenedor de lista} + + +\bigskip + +\foreignlanguage{spanish}{Primero colocamos el valor entero +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{ en la pila, y este valor se usará como +índice para obtener el elemento del contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{. La segunda línea de código implementa +para obtener elementos del contenedor }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{. +El valor de índice del contenedor }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ en +el ejemplo es 1 en la pila virtual. El elemento recuperado se almacena en la parte superior de la pila y podemos usar +el índice relativo -1 para acceder a él.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_setindex}}\foreignlanguage{spanish}{ se utiliza para establecer un +valor en }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_setindex(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, y el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el subíndice del objeto a operar. +Esta función se utiliza para escribir un elemento del contenedor +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{. El índice del valor que se va a +escribir en la pila virtual es -1, y el índice del subíndice de la posición de escritura en la pila virtual es -2. Si +el elemento con el subíndice especificado no existe en el contenedor, la operación de escritura fallará.} + +\foreignlanguage{spanish}{Suponiendo que la posición con el índice +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{ en la pila virtual tiene un valor de +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{, y tiene un elemento con un subíndice +de }\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}prueba{\textquotedbl}}}\foreignlanguage{spanish}{, un +ejemplo de configuración del elemento en el subíndice de +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}prueba{\textquotedbl} }}\foreignlanguage{spanish}{a +}\textstyleSourceText{\foreignlanguage{spanish}{100}}\foreignlanguage{spanish}{ es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_pushstring(vm, {\textquotedbl}prueba{\textquotedbl}); // Empuja el índice {\textquotedbl}índice{\textquotedbl}} + +{\selectlanguage{spanish}\ttfamily +be\_pushint(vm, 100); \ \ \ \ \ \ \ \ // Empuja el valor 100} + +{\selectlanguage{spanish}\ttfamily +be\_setindex(vm, 1); \ \ \ \ \ \ \ \ \ // Establece el par clave-valor a map[{\textquotedbl}prueba{\textquotedbl}] = +100} + + +\bigskip + +\foreignlanguage{spanish}{Primero debemos empujar el subíndice y el valor que se escribirá en la pila en orden. Para +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{, es un par clave-valor. En el ejemplo, +las dos primeras líneas de código completan estas tareas. La tercera línea llama a la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_setindex}}\foreignlanguage{spanish}{ para escribir el valor en el +objeto }\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_getupval}}\foreignlanguage{spanish}{ se utiliza para leer un valor +ascendente del cierre nativo. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_getupval(bvm *vm, int index, int pos);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el valor de índice de cierre +nativo del valor ascendente que se va a leer; +}\textstyleSourceText{\foreignlanguage{spanish}{pos}}\foreignlanguage{spanish}{ es la posición del upvalue en la tabla +upvalue de cierre nativa (la numeración comienza desde 0). El valor leído se colocará en la parte superior de la pila +virtual.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_setupval}}\foreignlanguage{spanish}{ se utiliza para establecer un +valor superior del cierre nativo. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_setupval(bvm *vm, int index, int pos);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el valor del índice de cierre +nativo que se escribirá en upvalue; }\textstyleSourceText{\foreignlanguage{spanish}{pos}}\foreignlanguage{spanish}{ es +la posición del upvalue en la tabla upvalue de cierre nativa (la numeración comienza desde 0). Esta función obtiene un +valor de la parte superior de la pila virtual y lo escribe en el valor superior de destino. Una vez completada la +operación, el valor superior de la pila no se extraerá de la pila.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_getsuper}}\foreignlanguage{spanish}{ se utiliza para obtener el +objeto principal de la clase base o la instancia de la clase. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_getsuper(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es la clase u objeto a operar. Si el +valor en }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es una clase con una clase +base, la función colocará su clase base en la parte superior de la pila; si el valor en +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es un objeto con un objeto padre, la +función tomará su padre. El objeto se coloca en la parte superior de la pila; de lo contrario, se coloca un valor de +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ en la parte superior de la pila.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_data\_size}}\foreignlanguage{spanish}{ se utiliza para obtener el +número de elementos contenidos en el contenedor. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_data\_size(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto contenedor +que se va a operar. Si el valor en }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es +un valor Map o List, la función }\foreignlanguage{spanish}{devuelve el número de elementos contenidos en el contenedor; +de lo contrario, devuelve }\textstyleSourceText{\foreignlanguage{spanish}{{}-1}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_data\_push}}\foreignlanguage{spanish}{ se usa para agregar un nuevo +elemento al final del contenedor. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_data\_push(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto contenedor +que se va a operar. El objeto en }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ debe +ser un valor de Lista. Esta función obtiene un valor de la parte superior de la pila y lo agrega al final del +contenedor. Una vez completada la operación, el valor en la parte superior de la pila no se extraerá de la pila.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_data\_insert}}\foreignlanguage{spanish}{ se utiliza para insertar +un par de elementos en el contenedor. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_data\_insert(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto contenedor +que se va a operar. El objeto en }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ debe +ser un valor de lista o un valor de mapa. El elemento insertado forma un par de pares clave-valor. El valor se almacena +en la parte superior de la pila y la clave se almacena en el índice anterior en la parte superior de la pila. Cabe +señalar que la clave insertada en el contenedor Mapa no puede ser un valor {\textquotedbl}nil{\textquotedbl} y la clave +insertada en el contenedor Lista debe ser un valor entero. Si la operación es exitosa, la función devolverá +}\textstyleSourceText{\foreignlanguage{spanish}{bture}}\foreignlanguage{spanish}{, de lo contrario devolverá +}\textstyleSourceText{\foreignlanguage{spanish}{bfalse}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_data\_remove}}\foreignlanguage{spanish}{ se utiliza para eliminar +un elemento del contenedor. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_data\_remove(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto contenedor +que se va a operar. El objeto en }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ debe +ser un valor de lista o un valor de mapa. Para el contenedor de mapas, la llave para eliminar el elemento se almacena +en la parte superior de la pila virtual (debe empujarse antes de llamar a la función); para el contenedor de lista, el +índice del elemento que se va a eliminar se almacena en la parte superior de la pila virtual (debe estar antes de la +llamada a la función). Si la operación es exitosa, la función devolverá +}\textstyleSourceText{\foreignlanguage{spanish}{btrue}}\foreignlanguage{spanish}{, de lo contrario devolverá +}\textstyleSourceText{\foreignlanguage{spanish}{bfalse}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_data\_resize}}\foreignlanguage{spanish}{ se utiliza para +restablecer la capacidad del contenedor. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_data\_resize(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto contenedor +que se va a operar. Esta función solo está disponible para contenedores de lista y la nueva capacidad se almacena en la +parte superior de la pila virtual (debe ser un número entero).} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_iter\_next}}\foreignlanguage{spanish}{ se utiliza para obtener el +siguiente elemento del iterador. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_iter\_next(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del iterador a operar. +El objeto iterador puede ser un iterador de un contenedor List o un contenedor Map. Para el iterador List, esta función +empuja el valor del resultado de la iteración a la parte superior de la pila, mientras que para el iterador Map, empuja +el valor clave a la posición anterior y la parte superior de la pila, respectivamente. Llamar a esta función +actualizará el iterador. Si la función devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, la llamada falla, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{ para indicar que el iterador actual es un +iterador de lista y devuelve }\textstyleSourceText{\foreignlanguage{spanish}{2}}\foreignlanguage{spanish}{ para indicar +que el iterador actual es un iterador de mapa.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{map\_hasnext}}\foreignlanguage{spanish}{ se usa para probar si hay otro +elemento en el iterador. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int map\_hasnext(bvm *vm, int index)} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del iterador a operar. +El objeto iterador puede ser un iterador de un contenedor List o un contenedor Map. Si hay más elementos iterables en +el iterador, devuelve }\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario, +devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_refcontains}}\foreignlanguage{spanish}{ se usa para probar si hay +una referencia al objeto especificado en la pila de referencia. Debe usarse junto con +}\textstyleSourceText{\foreignlanguage{spanish}{be\_refpush}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{be\_refpop}}\foreignlanguage{spanish}{. Esta API puede evitar la +recursividad al atravesar objetos que tienen sus propias referencias. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_refcontains(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto a operar. +Esta función se utiliza para el valor de un tipo de instancia. Si hay una referencia al objeto en la pila de +referencia, devuelve }\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario, +devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_refpush}}\foreignlanguage{spanish}{ inserta la referencia del +objeto especificado en la pila de referencia. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_refpush(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del objeto a operar. +Esta función se utiliza para el valor de un tipo de instancia.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_refpop}}\foreignlanguage{spanish}{ extrae el objeto en la parte +superior de la pila de referencia. Esta función eliminará un valor de la pila.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_refpop(bvm *vm);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual. Esta función se usa en pares con +}\textstyleSourceText{\foreignlanguage{spanish}{be\_refpush}}\foreignlanguage{spanish}{. El siguiente es el uso de la +API de la pila de referencia para evitar el problema del recorrido recursivo infinito cuando se hace referencia al +objeto mismo:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int list\_traversal(bvm *vm)} + +{\selectlanguage{spanish}\ttfamily +\{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ // ...} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ if (be\_refcontains(vm, 1)) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_return(vm);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_refpush(vm, 1);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ // Atravesando el contenedor, puede llamar a list\_traversal recursivamente.} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_refpop(vm);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_return(vm);} + +{\selectlanguage{spanish}\ttfamily +\}} + + +\bigskip + +\foreignlanguage{spanish}{Este es un proceso transversal simplificado del contenedor List. Para obtener el código +completo, consulte el código fuente de la función +}\textstyleSourceText{\foreignlanguage{spanish}{m\_tostring}}\foreignlanguage{spanish}{ en +}\foreignlanguage{spanish}{\textit{be\_listlib.c}}\foreignlanguage{spanish}{. Asumimos que el índice del objeto List es +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{. Primero, verificamos si la Lista ya +existe en la pila de referencia (línea 4), y si la referencia ya existe, regresa directamente, de lo contrario, +continúa con el procesamiento posterior. Para hacer utilizable +}\textstyleSourceText{\foreignlanguage{spanish}{be\_refcontains}}\foreignlanguage{spanish}{, necesitamos usar +}\textstyleSourceText{\foreignlanguage{spanish}{be\_refpush}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{be\_refpop}}\foreignlanguage{spanish}{ para procesar la pila de +referencia antes y después de la operación transversal real (líneas 7 y 9).} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_stack\_require}}\foreignlanguage{spanish}{ prueba la cantidad de +espacio libre en la pila y expande el espacio de la pila si es insuficiente. El prototipo de función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_stack\_require(bvm *vm, int count);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{count}}\foreignlanguage{spanish}{ es la capacidad de pila libre +requerida. Si la capacidad libre de la pila virtual asignada por la VM a la función nativa es inferior a este valor, se +realizará una operación de expansión.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isnil}}\foreignlanguage{spanish}{ devuelve si el valor indexado por +el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual es +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isnil(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isbool}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es de tipo }\textstyleSourceText{\foreignlanguage{spanish}{bool}}\foreignlanguage{spanish}{, si lo es, la función +devuelve }\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isbool(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del +}\foreignlanguage{spanish}{valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isint}}\foreignlanguage{spanish}{ devuelve si el valor indexado por +el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual es de +tipo entero, si lo es, devuelve }\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo +contrario, devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta +función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isint(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isreal}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es un tipo de número real, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isreal(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isnumber}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es un número entero o un tipo de número real, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isnumber(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isstring}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es un tipo de cadena, si lo es, devuelve }\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, +de lo contrario, devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo +de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isstring(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isclosure}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es un tipo de cierre, si lo es, devuelve }\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, +de lo contrario, devuelve }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo +de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isclosure(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isntvclos}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es un tipo de cierre primitivo, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El }\foreignlanguage{spanish}{prototipo +de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isntvclos(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isfunction}}\foreignlanguage{spanish}{ devuelve si el valor +indexado por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila +virtual es un tipo de función, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isfunction(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir. Hay +tres tipos de funciones: cierre, función nativa y cierre nativo.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isproto}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es de tipo }\textstyleSourceText{\foreignlanguage{spanish}{proto}}\foreignlanguage{spanish}{, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isproto(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir. El +tipo }\textstyleSourceText{\foreignlanguage{spanish}{proto}}\foreignlanguage{spanish}{ es el prototipo de función del +cierre de Berry.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isclass}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es de tipo }\textstyleSourceText{\foreignlanguage{spanish}{class}}\foreignlanguage{spanish}{, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isclass(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isinstance}}\foreignlanguage{spanish}{ devuelve si el valor +indexado por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila +virtual es de tipo }\textstyleSourceText{\foreignlanguage{spanish}{instance}}\foreignlanguage{spanish}{, si lo es, +devuelve }\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isinstance(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_isbytes}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es una instancia o subinstancia de la clase +}\textstyleSourceText{\foreignlanguage{spanish}{bytes}}\foreignlanguage{spanish}{; si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{; de lo contrario, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isbytes(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_islist}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es de tipo }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_islist(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_ismap}}\foreignlanguage{spanish}{ devuelve si el valor indexado por +el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual es de +tipo }\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_ismap(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_iscomptr}}\foreignlanguage{spanish}{ devuelve si el valor indexado +por el parámetro }\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la pila virtual +es un tipo de puntero universal, si lo es, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, de lo contrario, devuelve +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. El prototipo de esta función es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_iscomptr(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual, e +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es el índice del valor a medir.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +bint be\_toint(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{Obtiene el valor de la posición de índice de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ de la pila virtual y devuelve como un +tipo entero. Esta función no comprueba la corrección del tipo. Si el valor es una instancia, se llama al método +}\textstyleSourceText{\foreignlanguage{spanish}{toint()}}\foreignlanguage{spanish}{ si existe.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +breal be\_toreal(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{Obtiene el valor de la posición de índice de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ de la pila virtual y devuelve como un +tipo de número de punto flotante. Esta función no comprueba la exactitud del tipo.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +bint be\_toindex(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{Obtiene el valor de la posición de índice de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ de la pila virtual y devuelve como un +tipo entero. Esta función no comprueba la corrección del tipo. A diferencia de +}\textstyleSourceText{\foreignlanguage{spanish}{be\_toint}}\foreignlanguage{spanish}{, el tipo de valor de retorno de +}\textstyleSourceText{\foreignlanguage{spanish}{be\_toindex}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{, mientras que el valor de retorno del +primero es }\textstyleSourceText{\foreignlanguage{spanish}{bint}}\foreignlanguage{spanish}{.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +bbool be\_tobool(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{Obtiene el valor de la posición de índice de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ de la pila virtual y devuelve como un +tipo booleano. Si el valor indexado no es de tipo booleano, se convertirá de acuerdo con las reglas de la sección +type\_bool, y el proceso de conversión no hará que cambie el valor indexado. Si el valor es una instancia, se llama al +método }\textstyleSourceText{\foreignlanguage{spanish}{tobool()}}\foreignlanguage{spanish}{ si existe.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +const char* be\_tostring(bvm *vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{Obtiene el valor de la posición de índice de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ de la pila virtual y devuelve como un +tipo de cadena. Si el valor indexado no es un tipo de cadena, el valor indexado se convertirá en una cadena y el +proceso de conversión reemplazará el valor en la posición indexada en la pila virtual con la cadena convertida. La +cadena devuelta por esta función siempre termina con los caracteres +}\textstyleSourceText{\foreignlanguage{spanish}{{}'{\textbackslash}0'}}\foreignlanguage{spanish}{. Si el valor es una +instancia, se llama al método }\textstyleSourceText{\foreignlanguage{spanish}{tostring()}}\foreignlanguage{spanish}{ si +existe.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void* be\_tocomptr(bvm* vm, int index);} + + +\bigskip + +\foreignlanguage{spanish}{Obtiene el valor de la posición de índice de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ de la pila virtual y devuelve como un +tipo de puntero general. Esta función no comprueba la exactitud del tipo.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +const void* be\_tobytes(bvm *vm, int index, size\_t *len);} + + +\bigskip + +\foreignlanguage{spanish}{Obtiene el valor de la posición de índice de +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ de la pila virtual y devuelve como un +búfer de bytes. Se devuelve el puntero del búfer y el tamaño se almacena en +}\textstyleSourceText{\foreignlanguage{spanish}{*len}}\foreignlanguage{spanish}{ (a menos que +}\textstyleSourceText{\foreignlanguage{spanish}{len}}\foreignlanguage{spanish}{ sea NULL). Esta función funciona solo +para instancias de la clase }\textstyleSourceText{\foreignlanguage{spanish}{bytes}}\foreignlanguage{spanish}{, o +devuelve }\textstyleSourceText{\foreignlanguage{spanish}{NULL}}\foreignlanguage{spanish}{.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushnil(bvm *vm);} + +\foreignlanguage{spanish}{Inserta un valor +}\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{ en la pila virtual.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushbool(bvm *vm, int b);} + +\foreignlanguage{spanish}{Inserta un valor booleano en la pila virtual. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{b}}\foreignlanguage{spanish}{ es el valor booleano que se insertará en +la pila. Cuando el valor es }\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, significa +falso, de lo contrario es verdadero.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushint(bvm *vm, bint i);} + +\foreignlanguage{spanish}{Inserta un valor entero +}\textstyleSourceText{\foreignlanguage{spanish}{i}}\foreignlanguage{spanish}{ en la pila virtual.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushreal(bvm *vm, breal r);} + +\foreignlanguage{spanish}{Inserta un valor de punto flotante +}\textstyleSourceText{\foreignlanguage{spanish}{r}}\foreignlanguage{spanish}{ en la pila virtual.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushstring(bvm *vm, const char *str)} + +\foreignlanguage{spanish}{Empuja la cadena +}\textstyleSourceText{\foreignlanguage{spanish}{str}}\foreignlanguage{spanish}{ en la pila virtual. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{str}}\foreignlanguage{spanish}{ debe apuntar a una cadena C que termina +con un carácter nulo }\textstyleSourceText{\foreignlanguage{spanish}{{}'{\textbackslash}0'}}\foreignlanguage{spanish}{, +y no se puede pasar un puntero nulo.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushnstring(bvm *vm, const char *str, size\_t n);} + +\foreignlanguage{spanish}{Inserta la cadena +}\textstyleSourceText{\foreignlanguage{spanish}{str}}\foreignlanguage{spanish}{ de longitud +}\textstyleSourceText{\foreignlanguage{spanish}{n}}\foreignlanguage{spanish}{ en la pila virtual. La longitud de la +cadena está sujeta al parámetro }\textstyleSourceText{\foreignlanguage{spanish}{n}}\foreignlanguage{spanish}{ y el +carácter nulo no se usa como marca final de la cadena.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +const char* be\_pushfstring(bvm *vm, const char *formato, ...);} + +\foreignlanguage{spanish}{Empuja la cadena formateada en la pila virtual. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{formato}}\foreignlanguage{spanish}{ es una cadena formateada que +contiene el texto que se insertará en la pila, y el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{formato}}\foreignlanguage{spanish}{ contiene una etiqueta, que puede +ser reemplazada por el valor especificado por el parámetro adicional subsiguiente y formateada según sea necesario. De +acuerdo con la etiqueta de la cadena +}\textstyleSourceText{\foreignlanguage{spanish}{formato}}\foreignlanguage{spanish}{, se pueden requerir una serie de +parámetros adicionales, y cada parámetro adicional reemplazará la etiqueta +}\textstyleSourceText{\foreignlanguage{spanish}{\%}}\foreignlanguage{spanish}{ correspondiente en el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{formato}}\foreignlanguage{spanish}{.} + + +\bigskip + +\begin{center} +\tablefirsthead{\centering{\selectlanguage{spanish}\bfseries especificador} & +{\selectlanguage{spanish}\bfseries Descripción} & +~ +\\} +\tablehead{\centering{\selectlanguage{spanish}\bfseries especificador} & +{\selectlanguage{spanish}\bfseries Descripción} & +~ +\\} +\tabletail{} +\tablelasttail{} +\begin{supertabular}{m{5.1080003cm}m{5.1080003cm}m{5.1080003cm}} +\centering \textstyleSourceText{\foreignlanguage{spanish}{d}} & +{\selectlanguage{spanish} Formato como entero con signo decimal (los números positivos no generan signo)} & +~ +\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{f}} & +{\selectlanguage{spanish} Número de punto flotante de precisión simple o doble con formato decimal} & +~ +\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{g}} & +{\selectlanguage{spanish} Número de punto flotante de precisión simple o doble con formato exponencial} & +~ +\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{s}} & +{\selectlanguage{spanish} Formatear como cadena} & +~ +\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{c}} & +{\selectlanguage{spanish} Formatear como un solo carácter} & +~ +\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{p}} & +{\selectlanguage{spanish} Formatear como dirección de puntero} & +~ +\\ +\centering \textstyleSourceText{\foreignlanguage{spanish}{\%}} & +\foreignlanguage{spanish}{Escapado como carácter +}\textstyleSourceText{\foreignlanguage{spanish}{\%}}\foreignlanguage{spanish}{ (sin parámetro)} & +~ +\\ +\end{supertabular} +\end{center} +\foreignlanguage{spanish}{\textit{Tabla 12: Descripción del parámetro de la etiqueta +}}\textstyleSourceText{\foreignlanguage{spanish}{formato}} + + +\bigskip + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_pushfstring}}\foreignlanguage{spanish}{ es similar a la función +estándar de C }\textstyleSourceText{\foreignlanguage{spanish}{printf}}\foreignlanguage{spanish}{, pero la función de +formato de cadenas es relativamente básica y no admite operaciones como personalizar el ancho y los lugares decimales. +Un ejemplo típico es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_pushfstring(vm, {\textquotedbl}\%s: \%d{\textquotedbl}, {\textquotedbl}hola{\textquotedbl}, 12); // ¡Bien, +funciona!} + +{\selectlanguage{spanish}\ttfamily +be\_pushfstring(vm, {\textquotedbl}\%s: \%.5d{\textquotedbl}, {\textquotedbl}hola{\textquotedbl}, 12); // Error, el +ancho especificado no es compatible.} + + +\bigskip + +\foreignlanguage{spanish}{Esto significa que +}\textstyleSourceText{\foreignlanguage{spanish}{be\_pushfstring}}\foreignlanguage{spanish}{ solo puede realizar +operaciones de formateo simples. Si no se pueden cumplir los requisitos, se recomienda utilizar cadenas con formato +}\textstyleSourceText{\foreignlanguage{spanish}{sprintf}}\foreignlanguage{spanish}{ para las operaciones.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushvalue(bvm *vm, int index);} + +\foreignlanguage{spanish}{Empuja el valor con el índice +}\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ en la parte superior de la pila +virtual.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushntvclosure(bvm *vm, bntvfunc f, int nupvals);} + +\foreignlanguage{spanish}{Empuja un cierre nativo en la parte superior de la pila virtual. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{f}}\foreignlanguage{spanish}{ es el puntero de función C del cierre +nativo, y }\textstyleSourceText{\foreignlanguage{spanish}{nupvals}}\foreignlanguage{spanish}{ es el número de valor +superior del cierre.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushntvfunction(bvm *vm, bntvfunc f);} + +\foreignlanguage{spanish}{Empuja una función nativa en la parte superior de la pila virtual y el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{f}}\foreignlanguage{spanish}{ es el puntero de la función nativa.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushclass(bvm *vm, const char *name, const bnfuncinfo *lib);} + +\foreignlanguage{spanish}{Empuja una clase nativa en la parte superior de la pila virtual. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{name}}\foreignlanguage{spanish}{ es el nombre de la clase nativa y el +parámetro }\textstyleSourceText{\foreignlanguage{spanish}{lib}}\foreignlanguage{spanish}{ es la descripción del +atributo de la clase nativa.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushcomptr(bvm *vm, void *ptr);} + +\foreignlanguage{spanish}{Empuja un puntero general en la parte superior de la pila virtual. El puntero general +}\textstyleSourceText{\foreignlanguage{spanish}{ptr}}\foreignlanguage{spanish}{ apunta a una determinada área de datos +de C. Dado que el recolector de elementos no utilizados de Berry no mantiene el contenido señalado por este puntero, +los usuarios deben mantener el ciclo de vida de los datos ellos mismos.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void* be\_pushbytes(bvm *vm, const void *buf, size\_t len);} + +\foreignlanguage{spanish}{Empuja un búfer }\textstyleSourceText{\foreignlanguage{spanish}{bytes +()}}\foreignlanguage{spanish}{ que comience en la posición +}\textstyleSourceText{\foreignlanguage{spanish}{buf}}\foreignlanguage{spanish}{ y de tamaño +}\textstyleSourceText{\foreignlanguage{spanish}{len}}\foreignlanguage{spanish}{. El búfer se copia en la memoria +asignada de Berry, no necesita mantener el búfer válido después de esta llamada.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +bbool be\_pushiter(bvm *vm, int index);} + +{\selectlanguage{spanish} +Empuja un iterador en la parte superior de la pila virtual.} + + +\bigskip + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_pusherror}}\foreignlanguage{spanish}{ inserta un mensaje de error +en la parte superior de la pila. Después de ejecutar el FFI, el intérprete volverá directamente a la posición que puede +manejar el error, y el código inmediatamente siguiente no se ejecutará. El prototipo de función es:} + +{\selectlanguage{spanish}\ttfamily +void be\_pusherror(bvm *vm, const char *msg);} + + +\bigskip + +\foreignlanguage{spanish}{El parámetro }\textstyleSourceText{\foreignlanguage{spanish}{vm}}\foreignlanguage{spanish}{ es +el puntero de la instancia de la máquina virtual; +}\textstyleSourceText{\foreignlanguage{spanish}{msg}}\foreignlanguage{spanish}{ es la cadena que contiene la +información del error.} + +\foreignlanguage{spanish}{Mueve el valor en el índice +}\textstyleSourceText{\foreignlanguage{spanish}{desde}}\foreignlanguage{spanish}{ a la posición del índice +}\textstyleSourceText{\foreignlanguage{spanish}{hasta}}\foreignlanguage{spanish}{. Esta función no elimina el valor de +la posición del índice }\textstyleSourceText{\foreignlanguage{spanish}{desde}}\foreignlanguage{spanish}{, solo modifica +el valor de la posición del índice }\textstyleSourceText{\foreignlanguage{spanish}{hasta}}\foreignlanguage{spanish}{.} + +\subsection[9.3 Tecnología de construcción en tiempo de compilación]{\selectlanguage{spanish} 9.3 Tecnología de +construcción en tiempo de compilación} +\hypertarget{RefHeadingToc359993639824055}{}{\selectlanguage{spanish} +La tecnología de construcción en tiempo de compilación se implementa principalmente mediante \textit{coc}, que se +encuentra en la ruta \textit{coc/coc} del directorio del código fuente del intérprete. La herramienta \textit{coc} se +usa para generar cadenas constantes y objetos constantes como código C, y se compilará en constantes cuando se compile +el intérprete. En principio, la herramienta \textit{coc} generará código a partir de la información de declaración del +objeto constante (de acuerdo con un formato específico). El proceso calculará automáticamente el valor Hash y generará +la tabla Hash.} + +\foreignlanguage{spanish}{El archivo }\foreignlanguage{spanish}{\textit{Makefile}}\foreignlanguage{spanish}{ en el +directorio raíz del proyecto del intérprete compilará automáticamente esta herramienta y la ejecutará antes de compilar +el código fuente del intérprete. El contenido de +}\foreignlanguage{spanish}{\textit{Makefile}}\foreignlanguage{spanish}{ asegura que cuando se usa el comando +}\textstyleSourceText{\foreignlanguage{spanish}{make}}\foreignlanguage{spanish}{, el código para construir el objeto en +tiempo de compilación siempre se actualizará a través de la herramienta (si necesita actualizarse). El código para +construir objetos en tiempo de compilación se puede generar manualmente a través del comando +}\textstyleSourceText{\foreignlanguage{spanish}{make prebuild}}\foreignlanguage{spanish}{, que se almacena en la +carpeta }\foreignlanguage{spanish}{\textit{generate}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La construcción en tiempo de compilación se puede activar o desactivar modificando la macro +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_USE\_PRECOMPILED\_OBJECT}}\foreignlanguage{spanish}{. En cualquier +caso, se llama a la herramienta }\foreignlanguage{spanish}{\textit{coc}}\foreignlanguage{spanish}{ para generar códigos +de objetos constantes (los códigos no se usan cuando la construcción en tiempo de compilación está desactivada).} + +\paragraph[Usar el comando coc]{\foreignlanguage{spanish}{Usar el comando +}\textstyleSourceText{\foreignlanguage{spanish}{coc}}} +\hypertarget{RefHeadingToc360013639824055}{}\foreignlanguage{spanish}{La herramienta +}\textstyleSourceText{\foreignlanguage{spanish}{coc}}\foreignlanguage{spanish}{ se utiliza para generar código para +objetos constantes. El formato del comando es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +tools/coc/coc -o {\textless}dst\_path{\textgreater} {\textless}src\_path(s){\textgreater} -c +{\textless}include\_path{\textgreater}} + + +\bigskip + +\foreignlanguage{spanish}{La ruta de salida }\foreignlanguage{spanish}{\textit{dst\_path}}\foreignlanguage{spanish}{ se +utiliza para almacenar el código generado, y la ruta de origen +}\foreignlanguage{spanish}{\textit{src\_path}}\foreignlanguage{spanish}{ es una lista de rutas que deben escanearse en +busca del código fuente (utilice espacios para separar varias rutas). +}\textstyleSourceText{\foreignlanguage{spanish}{include\_path}}\foreignlanguage{spanish}{ contiene un archivo de +encabezado C escaneado para detectar directivas de compilación. +}\textstyleSourceText{\foreignlanguage{spanish}{coc}}\foreignlanguage{spanish}{ intenta compilar solo las constantes +necesarias. Dado que }\foreignlanguage{spanish}{\textit{generate}}\foreignlanguage{spanish}{ se usa como la ruta del +código generado en el código fuente del intérprete, +}\foreignlanguage{spanish}{\textit{dst\_path}}\foreignlanguage{spanish}{ debe ser +}\foreignlanguage{spanish}{\textit{generate}}\foreignlanguage{spanish}{. Tomando el proyecto de intérprete estándar +como ejemplo, el comando para usar la herramienta en +}\textstyleSourceText{\foreignlanguage{spanish}{map\_build}}\foreignlanguage{spanish}{ debe ser:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +tools/coc/coc -o generate default src -c default/berry\_conf.h} + + +\bigskip + +{\selectlanguage{spanish} +El significado de este comando es: la ruta de salida es \textit{generate}, y la ruta de origen es \textit{src} y +\textit{default}.} + +\paragraph[Ruta de salida]{\selectlanguage{spanish} Ruta de salida} +\hypertarget{RefHeadingToc360033639824055}{}{\selectlanguage{spanish} +Estrictamente hablando, la carpeta \textit{generate} utilizada como ruta de salida no se puede colocar en ningún lado, +debe almacenarse en un directorio principal que contenga la ruta. La ruta de inclusión se refiere a la ruta donde se +buscará el archivo de encabezado en el proyecto. Tomando el código fuente del intérprete estándar como ejemplo, la ruta +de inclusión es \textit{src} y \textit{default}. Por lo tanto, en el proyecto de intérprete estándar, la carpeta +\textit{generate} se almacena en el directorio raíz del código fuente del intérprete (el directorio principal de +\textit{src} y \textit{default}).} + +{\selectlanguage{spanish} +El motivo de las reglas anteriores es que los siguientes códigos se utilizan en el código fuente del intérprete para +hacer referencia a objetos constantes:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#include {\textquotedbl}../generate/be\_fixed\_xxx.h{\textquotedbl}} + + +\bigskip + +{\selectlanguage{spanish} +Si los lectores quieren definir objetos constantes por sí mismos, también necesitan usar dicho código para incluir los +archivos de encabezado correspondientes. Esta sección presentará cómo usar estas herramientas para definir y usar +objetos constantes.} + +\subsubsection[9.4 Tabla de cadenas en tiempo de compilación]{\selectlanguage{spanish} 9.4 Tabla de cadenas en tiempo de +compilación} +\hypertarget{RefHeadingToc360053639824055}{}\foreignlanguage{spanish}{La tabla de cadenas en tiempo de compilación se +utiliza para almacenar cadenas constantes. Las cadenas constantes son objetos que son transparentes para el script. No +se crean ni destruyen cuando el intérprete se está ejecutando, pero siempre se almacenan como constantes en el segmento +de datos del programa del intérprete. Si necesita usar una cadena como cadena constante, puede agregar el prefijo +}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_str\_}}\foreignlanguage{spanish}{ delante de la cadena en el +código fuente del intérprete, y la declaración se puede colocar en cualquier parte del archivo fuente (incluidos los +comentarios). Por ejemplo, para crear una cadena constante con el contenido +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}cadena{\textquotedbl}}}\foreignlanguage{spanish}{, debe +declarar el símbolo }\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_str\_cadena}}\foreignlanguage{spanish}{ +en el archivo fuente, y este símbolo también es el nombre de la variable que hace referencia a la cadena constante en +el código C.} + +{\selectlanguage{spanish} +Todas las palabras clave crearán cadenas constantes. Si modifica el código relacionado con la palabra clave en el +intérprete de Berry, también se debe modificar el código correspondiente en \textit{coc}.} + +\foreignlanguage{spanish}{Si la cadena contiene símbolos especiales, se {\textquotedbl}escapean{\textquotedbl} +automáticamente como }\textstyleSourceText{\foreignlanguage{spanish}{\_XHH}}\foreignlanguage{spanish}{, donde +}\textstyleSourceText{\foreignlanguage{spanish}{HH}}\foreignlanguage{spanish}{ es la representación hexadecimal (en +mayúsculas) del carácter. Por ejemplo +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}}}\foreignlanguage{spanish}{ está representado por +}\textstyleSourceText{\foreignlanguage{spanish}{\_X3A}}\foreignlanguage{spanish}{. Esta representación es biactiva, por +lo que es fácil convertirla a la cadena original y desde ella.} + +\paragraph[Usar cadena constante]{\selectlanguage{spanish} Usar cadena constante} +\hypertarget{RefHeadingToc360073639824055}{}{\selectlanguage{spanish} +Normalmente, no hay necesidad de declarar cadenas constantes manualmente, ni de usarlas manualmente. Si realmente +necesita llamar a la cadena constante manualmente, incluya el archivo de encabezado \textit{be\_constobj.h} para usar +todas las variables de cadena constante (este archivo de encabezado tiene declaraciones para todas las cadenas +constantes). El uso típico de cadenas constantes es construir objetos en tiempo de compilación. La declaración y +definición de cadenas constantes en este proceso son manejadas automáticamente por la herramienta.} + +\foreignlanguage{spanish}{En cualquier caso, la función FFI +}\textstyleSourceText{\foreignlanguage{spanish}{be\_pushstring}}\foreignlanguage{spanish}{ debe usarse directamente +para crear una cadena. Cuando una cadena tiene una cadena constante, no creará repetidamente un nuevo objeto de cadena, +sino que usará directamente la cadena constante correspondiente.} + +\foreignlanguage{spanish}{De forma predeterminada, todas las cadenas utilizadas se referencian en una tabla hash global +}\textstyleSourceText{\foreignlanguage{spanish}{m\_const\_string\_table}}\foreignlanguage{spanish}{. Sin embargo, +algunos proyectos pueden tener muchas variantes de compilación para las que no se necesitan algunos conjuntos de +cadenas. Si todas las constantes de cadena se almacenan en todas las variantes, esto crea una pérdida de tamaño de +flash. Por esta razón, algunas cadenas pueden declararse como cadenas {\textquotedbl}débiles{\textquotedbl} en el +sentido de tener una referencia {\textquotedbl}débil{\textquotedbl}. En tal caso, la constante de cadena se declara en +código C, pero no se incluye en el objeto de mapa global. Esto significa que el enlazador puede optar por no incluir +las constantes de cadena si ningún código hace referencia a ellas. La desventaja es que si crea dinámicamente un objeto +de cadena con el mismo valor, se crea un nuevo objeto en la memoria (mientras que no lo haría para una constante de +cadena normal). Para indicar cadenas débiles, use el modificador +}\textstyleSourceText{\foreignlanguage{spanish}{strings: weak}}\foreignlanguage{spanish}{ (ver más abajo).} + +\subsubsection[9.5 Construir objeto en tiempo de compilación]{\selectlanguage{spanish} 9.5 Construir objeto en tiempo de +compilación} +\hypertarget{RefHeadingToc360093639824055}{}\foreignlanguage{spanish}{Los objetos construidos en tiempo de compilación +también se denominan objetos constantes. La estructura de datos de estos objetos se construye cuando se compila el +intérprete y no se puede modificar en tiempo de ejecución. +}\textstyleSourceText{\foreignlanguage{spanish}{map\_build}}\foreignlanguage{spanish}{ define un conjunto de reglas de +declaración en la herramienta para generar código C para objetos constantes. La información de declaración del objeto +constante se almacena directamente en el archivo fuente +(}\foreignlanguage{spanish}{\textit{*.c}}\foreignlanguage{spanish}{). Para distinguirlo de otro contenido, se debe +incluir una información de declaración completa en el siguiente código de arranque:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +@const\_object\_info\_begin} + +{\selectlanguage{spanish}\ttfamily +@const\_object\_info\_end} + + +\bigskip + +\foreignlanguage{spanish}{La información de declaración de objeto constante no se ajusta a la sintaxis del lenguaje C, +por lo que debe colocarse en un comentario de varias líneas (incluido con +}\textstyleSourceText{\foreignlanguage{spanish}{/* */}}\foreignlanguage{spanish}{). Todos los objetos constantes tienen +la misma forma de declaración. La estructura de declaración de un objeto constante se denomina {\textquotedbl}bloque de +declaración de objeto{\textquotedbl}, que se compone de:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +type object\_name (attributes) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ member\_fields} + +{\selectlanguage{spanish}\ttfamily +\}} + + +\bigskip + +\textstyleSourceText{\foreignlanguage{spanish}{type}}\foreignlanguage{spanish}{ es el tipo de objeto constante, puede +ser }\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{class}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{module}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{vartab}}\foreignlanguage{spanish}{. +}\textstyleSourceText{\foreignlanguage{spanish}{object\_name}}\foreignlanguage{spanish}{ es el nombre de la variable +del objeto constante en lenguaje C. +}\textstyleSourceText{\foreignlanguage{spanish}{attributes}}\foreignlanguage{spanish}{ es la lista de atributos de los +objetos constantes. Un atributo se compone de nombre de atributo y valor de atributo. El nombre del atributo y el valor +del atributo están separados por punto y coma, y varios atributos están separados por comas. Por ejemplo, la lista de +atributos }\textstyleSourceText{\foreignlanguage{spanish}{scope: global, name: map}}\foreignlanguage{spanish}{ +significa que el atributo }\textstyleSourceText{\foreignlanguage{spanish}{scope}}\foreignlanguage{spanish}{ de un +objeto constante es }\textstyleSourceText{\foreignlanguage{spanish}{global}}\foreignlanguage{spanish}{, y el atributo +}\textstyleSourceText{\foreignlanguage{spanish}{name}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{. También +}\textstyleSourceText{\foreignlanguage{spanish}{strings: weak}}\foreignlanguage{spanish}{ indica que se debe generar +constantes de cadena débiles para los nombres de los campos de miembros o cualquier constante de cadena. +}\textstyleSourceText{\foreignlanguage{spanish}{member\_fields}}\foreignlanguage{spanish}{ es la lista de dominios +miembros de objetos constantes. Un miembro se compone de nombre y valor, separados por comas. Cada línea puede declarar +un miembro y varios miembros deben declararse en varias líneas.} + +\foreignlanguage{spanish}{La herramienta }\foreignlanguage{spanish}{\textbf{coc}}\foreignlanguage{spanish}{ utiliza +expresiones regulares para analizar el bloque de declaración de objetos. En el proceso de análisis, primero se +comparará todo el bloque de declaración del objeto y se comparará la información {\textquotedbl}tipo{\textquotedbl} y +{\textquotedbl}nombre\_del\_objeto{\textquotedbl}. Para la información de +}\textstyleSourceText{\foreignlanguage{spanish}{atributos}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{member\_fields}}\foreignlanguage{spanish}{, sae hará un análisis +adicional. Para facilitar la implementación, la herramienta no tiene requisitos estrictos sobre la sintaxis del bloque +de declaración de objetos y carece de un mecanismo completo de manejo de errores, por lo que debe asegurarse de que la +sintaxis sea correcta al escribir el bloque de declaración de objetos.} + +{\selectlanguage{spanish} +Para facilitar la comprensión, ilustramos con una clase constante simple:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +/* @const\_object\_info\_begin} + +{\selectlanguage{spanish}\ttfamily +class be\_class\_map (scope: global, name: map) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ .data, var} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ init, func(m\_init)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ tostring, func(m\_tostring)} + +{\selectlanguage{spanish}\ttfamily +\}} + +{\selectlanguage{spanish}\ttfamily +@const\_object\_info\_end */} + +{\selectlanguage{spanish}\ttfamily +\#include {\textquotedbl}../generate/be\_fixed\_be\_class\_map.h{\textquotedbl}} + + +\bigskip + +\foreignlanguage{spanish}{En este ejemplo, la información de declaración de toda la clase constante está en el +comentario del lenguaje C, por lo que no afectará la compilación del código C. El bloque de declaración de objetos se +coloca entre }\textstyleSourceText{\foreignlanguage{spanish}{@const\_object\_info\_begin}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{@const\_object\_info\_end}}\foreignlanguage{spanish}{ para garantizar +que la herramienta }\foreignlanguage{spanish}{\textbf{coc}}\foreignlanguage{spanish}{ detecte el bloque de declaración +de objetos.} + +\foreignlanguage{spanish}{Dado que es una declaración de clase constante, el valor de +}\foreignlanguage{spanish}{\textit{tipo}}\foreignlanguage{spanish}{ en el bloque de declaración de objeto es +}\textstyleSourceText{\foreignlanguage{spanish}{class}}\foreignlanguage{spanish}{, y +}\textstyleSourceText{\foreignlanguage{spanish}{be\_class\_map}}\foreignlanguage{spanish}{ es el nombre de variable del +objeto constante en el código C. Se declaran dos atributos en la lista de atributos del objeto (la parte encerrada +entre paréntesis), y el significado de estos atributos se presentará en la sección {\textquotedbl}Clase de construcción +en tiempo de compilación{\textquotedbl} de esta sección. Tres miembros están definidos en la lista de miembros entre +llaves, varios miembros están separados por saltos de línea y el nombre del miembro y el valor del miembro están +separados por una coma. Existen varios formatos legales para los nombres de miembros:} + +\liststyleLxviii +\begin{itemize} +\item {\selectlanguage{spanish} +Formato de nombre de variable Berry: comienza con una letra o guión bajo, seguido de varias letras, guiones bajos o +números.} +\item \foreignlanguage{spanish}{Utilice +``}\textstyleSourceText{\foreignlanguage{spanish}{.}}\foreignlanguage{spanish}{{}'' como primer carácter, seguido de +letras, guiones bajos o números.} +\item \foreignlanguage{spanish}{Operadores sobrecargables, como +``}\textstyleSourceText{\foreignlanguage{spanish}{+}}\foreignlanguage{spanish}{{}'', +``}\textstyleSourceText{\foreignlanguage{spanish}{{}-}}\foreignlanguage{spanish}{{}'' y +``}\textstyleSourceText{\foreignlanguage{spanish}{{\textless}{\textless}}}\foreignlanguage{spanish}{{}'', etc.} + + +\bigskip +\end{itemize} +{\selectlanguage{spanish} +El valor de un miembro puede ser de los siguientes tipos:} + +\liststyleLxix +\begin{itemize} +\item \textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{: Este símbolo se compilará en un +objeto entero (}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_var}}\foreignlanguage{spanish}{), y el valor +del objeto entero se incrementa automáticamente desde +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ está diseñado para la declaración de +variables miembro en la clase, y es automática La función de numeración se utiliza para realizar el número de serie de +las variables miembro.} +\item \textstyleSourceText{\foreignlanguage{spanish}{func(símbolo)}}\foreignlanguage{spanish}{: Declara funciones +miembro nativas o métodos de objetos constantes. El símbolo se compilará en una función nativa con el valor +(}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_func}}\foreignlanguage{spanish}{), +}\textstyleSourceText{\foreignlanguage{spanish}{symbol}}\foreignlanguage{spanish}{ es el puntero de función nativo +correspondiente al miembro. }\textstyleSourceText{\foreignlanguage{spanish}{m\_init}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{m\_tostring}}\foreignlanguage{spanish}{ en el ejemplo son dos funciones +nativas.} +\item \textstyleSourceText{\foreignlanguage{spanish}{closure (símbolo)}}\foreignlanguage{spanish}{: Declara funciones o +métodos miembro de bytecode precompilados de objetos constantes. El símbolo se compilará en una función nativa con el +valor (}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_closure}}\foreignlanguage{spanish}{), +}\textstyleSourceText{\foreignlanguage{spanish}{símbolo}}\foreignlanguage{spanish}{ es el nombre de la función +solidificada. Ver }\textstyleSourceText{\foreignlanguage{spanish}{módulo solidificar}}\foreignlanguage{spanish}{ para +saber cómo solidificar objetos.} +\item \textstyleSourceText{\foreignlanguage{spanish}{nil()}}\foreignlanguage{spanish}{: este símbolo se compilará en un +valor nulo (}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_nil}}\foreignlanguage{spanish}{).} +\item \textstyleSourceText{\foreignlanguage{spanish}{int(valor)}}\foreignlanguage{spanish}{: este símbolo se compilará +en un objeto entero (}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_int}}\foreignlanguage{spanish}{), el +valor del objeto entero es }\textstyleSourceText{\foreignlanguage{spanish}{valor}}\foreignlanguage{spanish}{.} +\item \textstyleSourceText{\foreignlanguage{spanish}{real(valor)}}\foreignlanguage{spanish}{: Este símbolo se compilará +en un número real (}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_real}}\foreignlanguage{spanish}{), el +valor del objeto de número real es }\textstyleSourceText{\foreignlanguage{spanish}{valor}}\foreignlanguage{spanish}{.} +\item \textstyleSourceText{\foreignlanguage{spanish}{comptr(valor)}}\foreignlanguage{spanish}{: Este símbolo se +compilará en un puntero objeto +}\foreignlanguage{spanish}{(}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_comptr}}\foreignlanguage{spanish}{), +el valor del puntero es }\textstyleSourceText{\foreignlanguage{spanish}{valor}}\foreignlanguage{spanish}{ y se puede +utilizar para pasar la dirección de una estructura global de C.} +\item \textstyleSourceText{\foreignlanguage{spanish}{class (símbolo)}}\foreignlanguage{spanish}{: este símbolo se +compilará en un objeto de clase +(}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_class}}\foreignlanguage{spanish}{). +}\textstyleSourceText{\foreignlanguage{spanish}{símbolo}}\foreignlanguage{spanish}{ es un puntero a este tipo de +objeto, y el puntero debe apuntar a un objeto de tipo constante.} +\item \textstyleSourceText{\foreignlanguage{spanish}{module (símbolo)}}\foreignlanguage{spanish}{: este símbolo se +compilará en un objeto de módulo +(}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_module}}\foreignlanguage{spanish}{). +}\textstyleSourceText{\foreignlanguage{spanish}{símbolo}}\foreignlanguage{spanish}{ es un puntero al objeto del módulo, +y el puntero debe apuntar a un objeto de módulo constante.} +\item \textstyleSourceText{\foreignlanguage{spanish}{ctype\_func(símbolo)}}\foreignlanguage{spanish}{: Este símbolo se +compilará en una función nativa +(}\textstyleSourceText{\foreignlanguage{spanish}{be\_const\_ctype\_func}}\foreignlanguage{spanish}{). +}\textstyleSourceText{\foreignlanguage{spanish}{símbolo}}\foreignlanguage{spanish}{ es un puntero al mapeo C +definición. Esta característica es utilizada por }\textstyleDefinition{\foreignlanguage{spanish}{berry\_mapping}} + + +\bigskip +\end{itemize} +\foreignlanguage{spanish}{Para usar el objeto +}\textstyleSourceText{\foreignlanguage{spanish}{be\_class\_map}}\foreignlanguage{spanish}{, debemos incluir el archivo +de encabezado correspondiente en el código C para garantizar que el objeto se compilará. La práctica habitual es +incluir el archivo de cabecera correspondiente cerca del bloque de declaración del objeto. En el ejemplo, la línea 8 lo +contiene. El archivo de encabezado correspondiente se puede usar para construir objetos +}\textstyleSourceText{\foreignlanguage{spanish}{be\_class\_map}}\foreignlanguage{spanish}{ en tiempo de compilación.} + +\foreignlanguage{spanish}{Después de procesarlo con la herramienta +}\foreignlanguage{spanish}{\textbf{coc}}\foreignlanguage{spanish}{, cada bloque de declaración de objeto se compilará +en un archivo de encabezado llamado +}\foreignlanguage{spanish}{\textit{be\_fixed\_be\_xxx.h}}\foreignlanguage{spanish}{, donde +}\foreignlanguage{spanish}{\textit{xxx}}\foreignlanguage{spanish}{ es el nombre de la variable C del objeto. Para +compilar objetos constantes en código C, debemos incluir los archivos de encabezado correspondientes. Por lo general, +se recomienda incluir los archivos de encabezado correspondientes cerca del bloque de declaración de objetos. La octava +línea del ejemplo contiene }\foreignlanguage{spanish}{\textit{be\_fixed\_be\_class\_map.h}}\foreignlanguage{spanish}{ +para construir el objeto }\textstyleSourceText{\foreignlanguage{spanish}{be\_class\_map}}\foreignlanguage{spanish}{ en +tiempo de compilación.} + +\paragraph[Construir mapa en tiempo de compilación]{\selectlanguage{spanish} Construir mapa en tiempo de compilación} +\hypertarget{RefHeadingToc360113639824055}{}\foreignlanguage{spanish}{Los mapas construidos en tiempo de compilación +también son objetos }\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ constantes. Por lo +general, no se declaran directamente mediante bloques de declaración de objetos, sino que se declaran en otras +estructuras de construcción en tiempo de compilación. Al construir el +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ constante, la información del tipo de +objeto constante debe ser }\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{, que admite +un atributo }\textstyleSourceText{\foreignlanguage{spanish}{scope}}\foreignlanguage{spanish}{. Cuando el valor del +atributo 'scope' es 'local', el objeto constante es 'estático', cuando el atributo es 'global', es 'externo', y el +valor de este atributo es 'local' por defecto. Los +}\textstyleSourceText{\foreignlanguage{spanish}{member\_fields}}\foreignlanguage{spanish}{ del objeto +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ constante admiten especificaciones +comunes de nombre de miembro/valo, y los valores de miembro solo se almacenan como datos sin una interpretación +especial. El siguiente es un ejemplo del uso del bloque de declaración de objetos para declarar directamente un objeto +}\textstyleSourceText{\foreignlanguage{spanish}{map}}\foreignlanguage{spanish}{ constante:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +map map\_name (scope: local/global) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ init, func(m\_init)} + +{\selectlanguage{spanish}\ttfamily +\}} + +\paragraph[Construcción de Clases en tiempo de compilación]{\selectlanguage{spanish} Construcción de Clases en tiempo de +compilación} +\hypertarget{RefHeadingToc360133639824055}{}\foreignlanguage{spanish}{Para construir una clase en tiempo de compilación, +use el bloque de declaración de objetos }\foreignlanguage{spanish}{para declarar, y la información de tipo del objeto +es }\textstyleSourceText{\foreignlanguage{spanish}{class}}\foreignlanguage{spanish}{. Las propiedades declaradas de +este objeto son }\textstyleSourceText{\foreignlanguage{spanish}{scope}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{name}}\foreignlanguage{spanish}{. +}\textstyleSourceText{\foreignlanguage{spanish}{scope}}\foreignlanguage{spanish}{ es el alcance de la variable C del +objeto de declaración de atributos, cuando el valor es +}\textstyleSourceText{\foreignlanguage{spanish}{local}}\foreignlanguage{spanish}{ (predeterminado), el alcance es +}\textstyleSourceText{\foreignlanguage{spanish}{static}}\foreignlanguage{spanish}{, cuando es +}\textstyleSourceText{\foreignlanguage{spanish}{global}}\foreignlanguage{spanish}{, el alcance es +}\textstyleSourceText{\foreignlanguage{spanish}{extern}}\foreignlanguage{spanish}{; +}\textstyleSourceText{\foreignlanguage{spanish}{name}}\foreignlanguage{spanish}{ es el valor del atributo es ese nombre +de clase, la clase anónima puede omitir este parámetro. Dado que la lista de atributos de una clase solo almacena +métodos e índices de variables miembro, los +}\textstyleSourceText{\foreignlanguage{spanish}{member\_fields}}\foreignlanguage{spanish}{ de la clase construida en +tiempo de compilación solo pueden usar los valores +}\textstyleSourceText{\foreignlanguage{spanish}{var}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{func()}}\foreignlanguage{spanish}{. Un bloque de declaración de clase +de construcción simple en tiempo de compilación es:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +class be\_class\_map (scope: global, name: map) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ .data, var} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ init, func(m\_init)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ tostring, func(m\_tostring)} + +{\selectlanguage{spanish}\ttfamily +\}} + +\paragraph[Construcción de Módulos en tiempo de compilación]{\selectlanguage{spanish} Construcción de Módulos en tiempo +de compilación} +\hypertarget{RefHeadingToc360153639824055}{}\foreignlanguage{spanish}{La información de tipo del bloque de declaración +del bloque de construcción en tiempo de compilación es +}\textstyleSourceText{\foreignlanguage{spanish}{module}}\foreignlanguage{spanish}{.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +module math (scope: global) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ sin, func(m\_sin)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ cos, func(m\_cos)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ pi, real(M\_PI)} + +{\selectlanguage{spanish}\ttfamily +\}} + +\paragraph[Construcción de un dominio integrado en tiempo de compilación]{\selectlanguage{spanish} Construcción de un +dominio integrado en tiempo de compilación} +\hypertarget{RefHeadingToc360173639824055}{}{\selectlanguage{spanish}\ttfamily +vartab m\_builtin (scope: local) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ assert, func(l\_assert)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ print, func(l\_print)} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ list, class(be\_class\_list)} + +{\selectlanguage{spanish}\ttfamily +\}} + +\clearpage\section[Apéndice A: Definición de la gramática]{Apéndice A: \foreignlanguage{spanish}{Definición de la +gramática}} +\hypertarget{RefHeadingToc360193639824055}{} +\bigskip + +{\selectlanguage{spanish} +Este capítulo dará algunas definiciones gramaticales relacionadas con Berry. Usamos \textbf{Extended Backus Normal Form} +(EBNF) para definir o expresar la gramática. No usamos la gramática EBNF estricta para definir, pero hicimos muchas +simplificaciones, pero estas simplificaciones no afectarán la comprensión de la gramática por parte de los lectores.} + +{\selectlanguage{spanish} +La definición EBNF de la gramática del lenguaje Berry es la siguiente:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +(* program define *)} + +{\selectlanguage{spanish}\ttfamily +program = block;} + +{\selectlanguage{spanish}\ttfamily +(* block define *)} + +{\selectlanguage{spanish}\ttfamily +block = \{statement\};} + +{\selectlanguage{spanish}\ttfamily +(* statement define *)} + +{\selectlanguage{spanish}\ttfamily +statement = class\_stmt {\textbar} func\_stmt {\textbar} var\_stmt {\textbar} if\_stmt {\textbar} while\_stmt +{\textbar}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ for\_stmt {\textbar} break\_stmt {\textbar} return\_stmt {\textbar} expr\_stmt {\textbar} import\_stmt +{\textbar}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ try\_stmt {\textbar} throw\_stmt {\textbar} ';';} + +{\selectlanguage{spanish}\ttfamily +if\_stmt = 'if' expr block \{'elif' expr block\} ['else' block] 'end';} + +{\selectlanguage{spanish}\ttfamily +while\_stmt = 'while' expr block 'end';} + +{\selectlanguage{spanish}\ttfamily +for\_stmt = 'for' ID ':' expr block 'end';} + +{\selectlanguage{spanish}\ttfamily +break\_stmt = 'break' {\textbar} 'continue';} + +{\selectlanguage{spanish}\ttfamily +return\_stmt = 'return' [expr];} + +{\selectlanguage{spanish}\ttfamily +(* function define statement *)} + +{\selectlanguage{spanish}\ttfamily +func\_stmt = 'def' ID func\_body;} + +{\selectlanguage{spanish}\ttfamily +func\_body = '(' [arg\_field \{',' arg\_field\}] ')' block 'end';} + +{\selectlanguage{spanish}\ttfamily +arg\_field = ['*'] ID;} + +{\selectlanguage{spanish}\ttfamily +(* class define statement *)} + +{\selectlanguage{spanish}\ttfamily +class\_stmt = 'class' ID [':' ID] class\_block 'end';} + +{\selectlanguage{spanish}\ttfamily +class\_block = \{'var' ID \{',' ID\} {\textbar} 'static' ['var'] ID ['=' expr] \{',' ID ['=' expr] \} {\textbar} +'static' func\_stmt {\textbar} func\_stmt\};} + +{\selectlanguage{spanish}\ttfamily +import\_stmt = 'import' (ID (['as' ID] {\textbar} \{',' ID\}) {\textbar} STRING 'as' ID);} + +{\selectlanguage{spanish}\ttfamily +(* exceptional handling statement *)} + +{\selectlanguage{spanish}\ttfamily +try\_stmt = 'try' block except\_block \{except\_block\} 'end';} + +{\selectlanguage{spanish}\ttfamily +except\_block = except\_stmt block;} + +{\selectlanguage{spanish}\ttfamily +except\_stmt = 'except' (expr \{',' expr\} {\textbar} '..') ['as' ID [',' ID]];} + +{\selectlanguage{spanish}\ttfamily +throw\_stmt = 'raise' expr [',' expr];} + +{\selectlanguage{spanish}\ttfamily +(* variable define statement *)} + +{\selectlanguage{spanish}\ttfamily +var\_stmt = 'var' ID ['=' expr] \{',' ID ['=' expr]\};} + +{\selectlanguage{spanish}\ttfamily +(* expression define *)} + +{\selectlanguage{spanish}\ttfamily +expr\_stmt = expr [assign\_op expr];} + +{\selectlanguage{spanish}\ttfamily +expr = suffix\_expr {\textbar} unop expr {\textbar} expr binop expr {\textbar} range\_expr {\textbar} cond\_expr;} + +{\selectlanguage{spanish}\ttfamily +cond\_expr = expr '?' expr ':' expr; (* conditional expression *)} + +{\selectlanguage{spanish}\ttfamily +assign\_op = '=' {\textbar} '+=' {\textbar} '-=' {\textbar} '*=' {\textbar} '/=' {\textbar}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ \ \ \ \ {}'\%=' {\textbar} '\&=' {\textbar} '{\textbar}=' {\textbar} '\^{}=' {\textbar} +'{\textless}{\textless}=' {\textbar} '{\textgreater}{\textgreater}=';} + +{\selectlanguage{spanish}\ttfamily +binop = '{\textless}' {\textbar} '{\textless}=' {\textbar} '==' {\textbar} '!=' {\textbar} '{\textgreater}' {\textbar} +'{\textgreater}=' {\textbar} '{\textbar}{\textbar}' {\textbar} '\&\&' {\textbar}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ {}'{\textless}{\textless}' {\textbar} '{\textgreater}{\textgreater}' {\textbar} '\&' {\textbar} +'{\textbar}' {\textbar} '\^{}' {\textbar} '+' {\textbar} '-' {\textbar} '*' {\textbar} '/' {\textbar} '\%';} + +{\selectlanguage{spanish}\ttfamily +range\_expr = expr '..' [expr]} + +{\selectlanguage{spanish}\ttfamily +unop = '-' {\textbar} '!' {\textbar} '\~{}';} + +{\selectlanguage{spanish}\ttfamily +suffix\_expr = primary\_expr \{call\_expr {\textbar} ('.' ID) {\textbar} '[' expr ']'\};} + +{\selectlanguage{spanish}\ttfamily +primary\_expr = '(' expr ')' {\textbar} simple\_expr {\textbar} list\_expr {\textbar} map\_expr {\textbar} anon\_func +{\textbar} lambda\_expr;} + +{\selectlanguage{spanish}\ttfamily +simple\_expr = \ INTEGER {\textbar} REAL {\textbar} STRING {\textbar} ID {\textbar} 'true' {\textbar} 'false' {\textbar} +'nil';} + +{\selectlanguage{spanish}\ttfamily +call\_expr = '(' [expr \{',' expr\}] ')';} + +{\selectlanguage{spanish}\ttfamily +list\_expr = '[' \{expr ','\} [expr] ']';} + +{\selectlanguage{spanish}\ttfamily +map\_expr = '\{' \{expr ':' expr ','\} [expr ':' expr] '\}';} + +{\selectlanguage{spanish}\ttfamily +anon\_func = 'def' func\_body; (* anonymous function *)} + +{\selectlanguage{spanish}\ttfamily +lambda\_expr = '/' [arg\_field \{',' arg\_field\}] {\textbar} \{arg\_field\}] '-{\textgreater}' expr;} + + +\bigskip + +\foreignlanguage{spanish}{El formato EBNF estándar se puede encontrar en materiales relacionados. Aquí hay una +explicación de los detalles que necesitan atención al leer la gramática anterior. Los símbolos que han aparecido a la +izquierda del signo igual son símbolos no terminales, y los demás son símbolos terminales. El terminador encerrado +entre comillas }\textstyleSourceText{\foreignlanguage{spanish}{{}'}}\foreignlanguage{spanish}{ es una cadena fija, que +suele ser una palabra clave u operador de idioma. Hay varios terminadores que son inconvenientes para describir +directamente en EBNF: }\textstyleSourceText{\foreignlanguage{spanish}{INTEGER}}\foreignlanguage{spanish}{ representa el +valor nominal del entero; }\textstyleSourceText{\foreignlanguage{spanish}{REAL}}\foreignlanguage{spanish}{ representa +el valor nominal del número real; }\textstyleSourceText{\foreignlanguage{spanish}{STRING}}\foreignlanguage{spanish}{ +representa el valor literal de cadena; }\textstyleSourceText{\foreignlanguage{spanish}{ID}}\foreignlanguage{spanish}{ +representa el identificador. Estos terminadores se pueden definir mediante expresiones regulares:} + +\liststyleLxx +\begin{itemize} +\item \textstyleSourceText{\foreignlanguage{spanish}{ENTERO}}\foreignlanguage{spanish}{: +}\textstyleSourceText{\foreignlanguage{spanish}{0x[a-fA-F0-9]+{\textbar}{\textbackslash}d+}}\foreignlanguage{spanish}{.} +\item \textstyleSourceText{\foreignlanguage{spanish}{REAL}}\foreignlanguage{spanish}{: +}\textstyleSourceText{\foreignlanguage{spanish}{({\textbackslash}d+{\textbackslash}.?{\textbar}{\textbackslash}.{\textbackslash}d){\textbackslash}d*([eE][+-]?{\textbackslash}d+)?}}\foreignlanguage{spanish}{.} +\item \textstyleSourceText{\foreignlanguage{spanish}{CADENA}}\foreignlanguage{spanish}{: +}\textstyleSourceText{\foreignlanguage{spanish}{{\textquotedbl}({\textbackslash}{\textbackslash}.{\textbar}[\^{}{\textquotedbl}])*{\textquotedbl}{\textbar}'({\textbackslash}{\textbackslash}.{\textbar}[\^{}'])*'}}\foreignlanguage{spanish}{.} +\item \textstyleSourceText{\foreignlanguage{spanish}{ID}}\foreignlanguage{spanish}{: +}\textstyleSourceText{\foreignlanguage{spanish}{[\_a-zA-Z]{\textbackslash}w*}} + + +\bigskip +\end{itemize} +{\selectlanguage{spanish} +Los símbolos que aparecen secuencialmente en el EBNF estándar están separados por comas. Por intuición, uso espacios +para implementar la función de coma. El símbolo de barra vertical ``{\textbar}'' se pronuncia como +{\textquotedbl}o{\textquotedbl}, significa que los patrones izquierdo y derecho solo pueden coincidir con uno de ellos, +o tiene la prioridad más baja. Por ejemplo, la gramática \textit{a} 0 \textit{a} 1 {\textbar}\textit{a} 2 significa la +fórmula correspondiente \textit{a} 0 \textit{a} 1 o la combinación \textit{a} 2 . Los corchetes indican que la +subexpresión dentro de los paréntesis coincide 0 o 1 veces, las llaves indican que la subexpresión interna coincide 0 o +más veces, y los paréntesis solo tienen la función de tomar la subexpresión interna como un todo.} + +{\selectlanguage{spanish} +La siguiente es la definición de gramática JSON admitida por el módulo JSON en la biblioteca estándar de Berry. El uso +de EBNF aún cumple con las convenciones anteriores:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +json = value;} + +{\selectlanguage{spanish}\ttfamily +value = object {\textbar} array {\textbar}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ string {\textbar} number {\textbar} 'true' {\textbar} 'false' {\textbar} 'null';} + +{\selectlanguage{spanish}\ttfamily +object = '\{' [ string ':' value ] \{ ',' string ':' value \} '\}';} + +{\selectlanguage{spanish}\ttfamily +array = '[' [json] \{ ',' json \} ']';} + + +\bigskip + +\foreignlanguage{spanish}{Los símbolos no terminales +}\textstyleSourceText{\foreignlanguage{spanish}{cadena}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{número}}\foreignlanguage{spanish}{ también se pueden definir mediante +expresiones regulares. +}\href{http://www.json.org/}{\textstyleDefinition{\foreignlanguage{spanish}{http://www.json.org}}}\textstyleDefinition{\foreignlanguage{spanish}{ +}}\foreignlanguage{spanish}{proporciona la gramática estándar de JSON, que también incluye las definiciones de +}\textstyleSourceText{\foreignlanguage{spanish}{cadena}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{número}}\foreignlanguage{spanish}{. El soporte para números de la +biblioteca Berry JSON es diferente del estándar. Los números JSON estándar deben comenzar con +{\textquotedbl}-{\textquotedbl} o el número {\textquotedbl}0-9{\textquotedbl}, mientras que la biblioteca Berry JSON +también acepta números que comienzan con un punto decimal.} + +\clearpage\section[Apéndice B: Intérprete del compilador]{Apéndice B: \foreignlanguage{spanish}{Intérprete del +compilador}} +\hypertarget{RefHeadingToc360213639824055}{} +\bigskip + +\subsection[1. Visión general]{\selectlanguage{spanish} 1. Visión general} +\hypertarget{RefHeadingToc360233639824055}{}{\selectlanguage{spanish} +El código fuente del intérprete de Berry está escrito con el estándar ISO C99 y el código central no depende de +bibliotecas de terceros, por lo que tiene una gran versatilidad. Tome el sistema Ubuntu como ejemplo, ejecute el +siguiente comando en la terminal para instalar el intérprete de Berry:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +apt install git gcc g++ make libreadline-dev} + +{\selectlanguage{spanish}\ttfamily +git clone https://github.com/berry-lang/berry} + +{\selectlanguage{spanish}\ttfamily +cd berry} + +{\selectlanguage{spanish}\ttfamily +make} + +{\selectlanguage{spanish}\ttfamily +make install} + + +\bigskip + +{\selectlanguage{spanish} +El Makefile proporcionado en el repositorio de GitHub se crea con el compilador GCC. Otros compiladores también pueden +compilar correctamente el intérprete de Berry. Los compiladores actualmente probados y disponibles incluyen GCC, Clang, +MSVC, ARMCC e ICCARM. El compilador que compila el intérprete de Berry debe tener las siguientes características:} + +\liststyleLxxi +\begin{itemize} +\item {\selectlanguage{spanish} +Compilador C que soporta el estándar C99} +\item {\selectlanguage{spanish} +Compilador C++ compatible con el estándar C++11 (solo para compilación nativa)} +\item {\selectlanguage{spanish} +Plataforma de destino de 32 o 64 bits} +\end{itemize} +{\selectlanguage{spanish} +El compilador de C++ solo se usa para compilar las herramientas \textit{map\_build}, por lo que no es necesario +proporcionar un compilador cruzado de C++ para el intérprete de Berry al realizar la compilación cruzada, pero el +usuario debe preparar un compilador nativo de C++ (a menos que el usuario pueda obtener el * archivo ejecutable de la +herramienta map\_build*).} + +\subsection[2. Portabilidad]{\selectlanguage{spanish} 2. Portabilidad} +\hypertarget{RefHeadingToc360253639824055}{}{\selectlanguage{spanish} +Lo siguiente es cómo portar el intérprete de Berry al proyecto del usuario:} + +\liststyleLxxii +\begin{enumerate} +\item {\selectlanguage{spanish} +Agregue todos los archivos fuente en el directorio \textit{src} al proyecto de usuario y el directorio debe agregarse a +la ruta de inclusión} +\item {\selectlanguage{spanish} +Los usuarios deben implementar por sí mismos archivos \textit{predeterminados} que no sean \textit{berry.c} en el +directorio. Si las condiciones lo permiten, no necesitan modificarlos} +\item {\selectlanguage{spanish} +Utilice la herramienta \textit{map\_build} para generar código de objeto constante y luego compilar} +\end{enumerate} +\subsection[3. Soporte de plataforma]{\selectlanguage{spanish} 3. Soporte de plataforma} +\hypertarget{RefHeadingToc360273639824055}{}{\selectlanguage{spanish} +Actualmente, el intérprete de Berry ha sido probado en algunas plataformas. Los sistemas operativos Windows, Linux y +MacOS que se ejecutan en CPU X86 pueden funcionar normalmente. Las plataformas integradas que se han probado incluyen +Cortex M3/M0/M4/M7. El intérprete de Berry debería poder funcionar bien sobre la base de la biblioteca de tiempo de +ejecución C necesaria. En la actualidad, cuando solo se compila el núcleo del lenguaje Berry, el código del intérprete +generado por el compilador ARMCC tiene solo alrededor de 40 KiB, y el intérprete puede ejecutarse en un dispositivo con +solo 8 KiB de RAM.} + +\clearpage\section{Apéndice C: Guía de portabilidad} +\hypertarget{RefHeadingToc360293639824055}{} +\bigskip + +\subsection[Archivo de configuración]{\selectlanguage{spanish} Archivo de configuración} +\hypertarget{RefHeadingToc360313639824055}{}{\selectlanguage{spanish} +El archivo de encabezado de configuración del intérprete de Berry es \textit{berry\_conf.h}. Este archivo incluye un +lote de macros para la configuración y define algunos contenidos relacionados con la plataforma.} + +\subsubsection[Archivo berry\_conf.h]{\selectlanguage{spanish} \textit{Archivo }\textit{berry\_conf.h}} +\hypertarget{RefHeadingToc360333639824055}{}\paragraph[Interruptor de macro de configuración]{\selectlanguage{spanish} +Interruptor de macro de configuración} +\hypertarget{RefHeadingToc360353639824055}{}\foreignlanguage{spanish}{Las macros de configuración presentadas en esta +sección generalmente se usan para compilar conmutadores de algunos códigos fuente. Para facilitar la descripción, +llamamos a esta macro {\textquotedbl}cambio de macro{\textquotedbl}. Para el interruptor de macro, +{\textquotedbl}on{\textquotedbl} se refiere a establecer el interruptor de macro en un valor distinto de cero, y +{\textquotedbl}off{\textquotedbl} se refiere a establecer el valor del interruptor de macro en +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +Algunos interruptores macro tienen varios estados, no solo {\textquotedbl}encendido{\textquotedbl} o +{\textquotedbl}apagado{\textquotedbl}. Estos interruptores macro se usan generalmente para configuraciones con +múltiples opciones. También hay algunas macros de configuración que no son conmutadores de macro. No importa cuál sea +el valor de estas macros, no habrá código y, por lo tanto, no participará en la compilación. Estas macros se utilizan +generalmente para configurar el valor de la cantidad.} + +{\selectlanguage{spanish} +[sección::BE\_DEBUG]} + +\foreignlanguage{spanish}{Este conmutador de macro se utiliza para activar o desactivar la función de depuración del +propio intérprete. Cuando el valor de +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_DEBUG}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, la depuración se desactiva; de lo +contrario, se activará. La función de depuración mencionada aquí se refiere a la depuración del intérprete, no a la +función de depuración del programa Berry. El valor predeterminado de +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_DEBUG}}\foreignlanguage{spanish}{ es +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{. Si usa +}\foreignlanguage{spanish}{\textit{Makefile}}\foreignlanguage{spanish}{ que viene con el proyecto del intérprete para +compilar, este interruptor de macro se activará automáticamente cuando use el comando +}\textstyleSourceText{\foreignlanguage{spanish}{make debug}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{Cuando se abre esta macro, se activarán algunas aserciones y se generará un mensaje de error +cuando el intérprete encuentre un error que la aserción pueda detectar. Puede abrir +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_DEBUG}}\foreignlanguage{spanish}{ al depurar el intérprete y +cerrarlo al compilar la versión.} + +\foreignlanguage{spanish}{Este conmutador de macro configura el tipo de punto flotante utilizado por el tipo +}\textstyleSourceText{\foreignlanguage{spanish}{breal}}\foreignlanguage{spanish}{. Cuando el valor de la macro es +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, se usará el tipo +}\textstyleSourceText{\foreignlanguage{spanish}{doble}}\foreignlanguage{spanish}{ para implementar +}\textstyleSourceText{\foreignlanguage{spanish}{breal}}\foreignlanguage{spanish}{, de lo contrario, se usará el tipo +}\textstyleSourceText{\foreignlanguage{spanish}{float}}\foreignlanguage{spanish}{ para implementar +}\textstyleSourceText{\foreignlanguage{spanish}{breal}}\foreignlanguage{spanish}{. Este interruptor de macro se puede +activar en algunos entornos con bajo rendimiento o configuración de memoria. En la implementación predeterminada, este +interruptor de macro está desactivado.} + +\foreignlanguage{spanish}{Esta macro configura la implementación del tipo +}\textstyleSourceText{\foreignlanguage{spanish}{bint}}\foreignlanguage{spanish}{. Cuando el valor de la macro es +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{, se usará el tipo +}\textstyleSourceText{\foreignlanguage{spanish}{int}}\foreignlanguage{spanish}{ para implementar +}\textstyleSourceText{\foreignlanguage{spanish}{bint}}\foreignlanguage{spanish}{, cuando el valor sea +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{, se usará el tipo +}\textstyleSourceText{\foreignlanguage{spanish}{long}}\foreignlanguage{spanish}{ para implementar +}\textstyleSourceText{\foreignlanguage{spanish}{bint}}\foreignlanguage{spanish}{, y cuando el el valor es +}\textstyleSourceText{\foreignlanguage{spanish}{2}}\foreignlanguage{spanish}{, se usará 64 ] Tipo de entero con signo +de bit (}\textstyleSourceText{\foreignlanguage{spanish}{\_\_int64}}\foreignlanguage{spanish}{ en Windows, +}\textstyleSourceText{\foreignlanguage{spanish}{long long}}\foreignlanguage{spanish}{ en otras plataformas) implementa +}\textstyleSourceText{\foreignlanguage{spanish}{bint}}\foreignlanguage{spanish}{. El valor predeterminado de esta macro +es }\textstyleSourceText{\foreignlanguage{spanish}{2}}\foreignlanguage{spanish}{. Si desea reducir el uso de la +memoria, puede establecer }\foreignlanguage{spanish}{esta macro en +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{ o +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{ para habilitar el tipo de entero de 32 +bits.} + +\foreignlanguage{spanish}{Esta macro se usa para configurar la información de depuración en tiempo de ejecución del +código Berry. Tiene 3 valores disponibles: establecer en +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{ para desactivar la salida del nombre de +archivo y el número de línea de la información de depuración en tiempo de ejecución, y establecer en +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{ para mostrar el nombre de archivo y el +número de línea en la información de depuración en tiempo de ejecución, establecer a +}\textstyleSourceText{\foreignlanguage{spanish}{2}}\foreignlanguage{spanish}{ Al usar +}\textstyleSourceText{\foreignlanguage{spanish}{uint16\_t}}\foreignlanguage{spanish}{ (entero de 16 bits) escriba para +almacenar la información del número de fila. Su valor por defecto es +}\textstyleSourceText{\foreignlanguage{spanish}{1}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{Establecer esta macro en +}\textstyleSourceText{\foreignlanguage{spanish}{0}}\foreignlanguage{spanish}{ no almacenará el nombre del archivo ni la +información del número de línea, por lo que el consumo de memoria es mínimo. Cuando se establece en +}\textstyleSourceText{\foreignlanguage{spanish}{2}}\foreignlanguage{spanish}{, consume menos memoria, pero si el +programa es demasiado largo, }\textstyleSourceText{\foreignlanguage{spanish}{uint16\_t}}\foreignlanguage{spanish}{ se +desbordará.} + +{\selectlanguage{spanish} +Este modificador de macro configura la función de construir objetos en tiempo de compilación. Activar esta macro +significa que la construcción de objetos en tiempo de compilación está habilitada. Esta macro está activada de forma +predeterminada. Cuando esta macro está activada, los objetos nativos de la biblioteca estándar se generarán en tiempo +de compilación y cuando esta macro está desactivada, los objetos de la biblioteca estándar se generarán en tiempo de +ejecución.} + +\foreignlanguage{spanish}{Las funciones +}\textstyleSourceText{\foreignlanguage{spanish}{be\_regfunc}}\foreignlanguage{spanish}{ y +}\textstyleSourceText{\foreignlanguage{spanish}{be\_regclass}}\foreignlanguage{spanish}{ se verán afectadas por esta +macro. La tabla de objetos integrada no se puede modificar cuando se utiliza la construcción de objetos en tiempo de +compilación. En este momento, estas dos funciones no pueden registrar objetos en el ámbito integrado, pero registran +objetos en el ámbito global.} + +{\selectlanguage{spanish} +Los objetos construidos durante el tiempo de compilación se almacenan junto con el código y no ocuparán recursos de RAM +(o el área de lectura y escritura en la memoria). La tecnología de construcción durante el tiempo de compilación +también puede reducir el tiempo de inicio del intérprete, por lo que se recomienda abrir esta macro. Consulte la +sección [section::precompiled\_build] para obtener más detalles sobre las técnicas de construcción en tiempo de +compilación.} + +\foreignlanguage{spanish}{Esta macro define la capacidad máxima de pila de Berry, que se refiere a la cantidad de +objetos de Berry. Cuando el código Berry usa más de esta cantidad de pila, dejará de ejecutar el programa y devolverá +un mensaje de error. El valor predeterminado de esta macro es +}\textstyleSourceText{\foreignlanguage{spanish}{2000}}\foreignlanguage{spanish}{, que puede modificarse según la +capacidad de memoria del sistema.} + +{\selectlanguage{spanish} +Este valor no afecta el uso de memoria de la pila Berry, porque la capacidad de la pila Berry se ajusta dinámicamente, +por lo que no importa cuánto se establezca, no puede ayudar a reducir el uso de memoria. Su función principal es +terminar la ejecución cuando el programa Berry consume demasiada pila. Es muy probable que estos programas sean +incorrectos, por ejemplo, las llamadas a funciones recursivas sin condiciones de devolución seguirán consumiendo la +pila.} + +\foreignlanguage{spanish}{Esta macro define el espacio mínimo disponible en la pila de Berry y su valor predeterminado +es }\textstyleSourceText{\foreignlanguage{spanish}{10}}\foreignlanguage{spanish}{. La función nativa puede insertar un +valor en la pila de Berry. En este momento, la pila no crecerá automáticamente, así que asegúrese de que haya +suficiente espacio en la pila para que la use la función nativa. No se recomienda modificar este valor, sino usar la +función }\textstyleSourceText{\foreignlanguage{spanish}{be\_stack\_require}}\foreignlanguage{spanish}{ donde realmente +se necesita más espacio de pila.} + +\foreignlanguage{spanish}{Para detectar errores de desbordamiento de pila al depurar el intérprete, puede abrir la macro +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_DEBUG}}\foreignlanguage{spanish}{ (sección [sección::BE\_DEBUG] ).} + +{\selectlanguage{spanish} +Cuando se abre esta macro, el objeto de cadena corta guardará el valor hash de la cadena para mejorar la velocidad de +ejecución, pero el tamaño de cada objeto de cadena aumentará en 4 bytes. Esta macro está desactivada de forma +predeterminada y las pruebas actuales no han encontrado que abrir esta macro traiga una mejora significativa.} + +\foreignlanguage{spanish}{Este conmutador de macro se utiliza para activar o desactivar el módulo +}\textstyleSourceText{\foreignlanguage{spanish}{string}}\foreignlanguage{spanish}{, que está activado de forma +predeterminada.} + +\foreignlanguage{spanish}{Este interruptor de macro se usa para habilitar o deshabilitar el módulo +}\textstyleSourceText{\foreignlanguage{spanish}{json}}\foreignlanguage{spanish}{, que está activado de forma +predeterminada.} + +{\selectlanguage{spanish} +Este conmutador de macro se utiliza para habilitar o deshabilitar el módulo {\textquotedbl}matemático{\textquotedbl}, +que está activado de forma predeterminada.} + +\foreignlanguage{spanish}{Este interruptor de macro se usa para habilitar o deshabilitar el módulo +}\textstyleSourceText{\foreignlanguage{spanish}{time}}\foreignlanguage{spanish}{, que está activado de forma +predeterminada.} + +\foreignlanguage{spanish}{Este conmutador de macro se utiliza para activar o desactivar el módulo +}\textstyleSourceText{\foreignlanguage{spanish}{os}}\foreignlanguage{spanish}{, que está activado de forma +predeterminada.} + +\foreignlanguage{spanish}{Esta macro determina la función +}\textstyleSourceText{\foreignlanguage{spanish}{abortar}}\foreignlanguage{spanish}{ utilizada internamente por el +intérprete de Berry. Por defecto o cuando la macro no está definida, se utilizará la función +}\textstyleSourceText{\foreignlanguage{spanish}{abortar}}\foreignlanguage{spanish}{ en la biblioteca estándar de C. +Esta macro se define como }\textstyleSourceText{\foreignlanguage{spanish}{abortar}}\foreignlanguage{spanish}{ por +defecto. Si el usuario necesita especificar explícitamente la función +}\textstyleSourceText{\foreignlanguage{spanish}{abortar}}\foreignlanguage{spanish}{ utilizada por el intérprete, +reemplace la definición de macro con la función requerida por el usuario. Esta función debe tener la misma forma que la +declaración de la función }\textstyleSourceText{\foreignlanguage{spanish}{abortar}}\foreignlanguage{spanish}{ en la +biblioteca estándar.} + +\foreignlanguage{spanish}{Esta macro determina la función +}\textstyleSourceText{\foreignlanguage{spanish}{exit}}\foreignlanguage{spanish}{ utilizada internamente por el +intérprete de Berry. Por defecto o cuando la macro no está definida, se utilizará la función +}\textstyleSourceText{\foreignlanguage{spanish}{exit}}\foreignlanguage{spanish}{ en la biblioteca estándar de C. Esta +macro se define como }\textstyleSourceText{\foreignlanguage{spanish}{salir}}\foreignlanguage{spanish}{ por defecto. Si +el usuario necesita especificar explícitamente la función +}\textstyleSourceText{\foreignlanguage{spanish}{salir}}\foreignlanguage{spanish}{ utilizada por el intérprete, +reemplace la definición de macro con la función requerida por el usuario. Esta función debe tener la misma forma que la +declaración de la función }\textstyleSourceText{\foreignlanguage{spanish}{exit}}\foreignlanguage{spanish}{ en la +biblioteca estándar.} + +\foreignlanguage{spanish}{Esta macro determina la función +}\textstyleSourceText{\foreignlanguage{spanish}{malloc}}\foreignlanguage{spanish}{ utilizada internamente por el +intérprete de Berry. Por defecto o cuando la macro no está definida, se utilizará la función +}\textstyleSourceText{\foreignlanguage{spanish}{malloc}}\foreignlanguage{spanish}{ en la biblioteca estándar de C. Esta +macro se define como }\textstyleSourceText{\foreignlanguage{spanish}{malloc}}\foreignlanguage{spanish}{ por defecto. Si +el usuario necesita especificar explícitamente la función +}\textstyleSourceText{\foreignlanguage{spanish}{malloc}}\foreignlanguage{spanish}{ utilizada por el intérprete, +reemplace la definición de macro con la función requerida por el usuario. Esta función debe tener la misma forma que la +declaración de la función }\textstyleSourceText{\foreignlanguage{spanish}{malloc}}\foreignlanguage{spanish}{ en la +biblioteca estándar.} + +\foreignlanguage{spanish}{Esta macro determina la función +}\textstyleSourceText{\foreignlanguage{spanish}{libre}}\foreignlanguage{spanish}{ utilizada internamente por el +intérprete de Berry. Por defecto o cuando la macro no está definida, se utilizará la función +}\textstyleSourceText{\foreignlanguage{spanish}{free}}\foreignlanguage{spanish}{ en la biblioteca estándar de C. Esta +macro se define como {\textquotedbl}gratis{\textquotedbl} por defecto. Si el usuario necesita especificar +explícitamente la función {\textquotedbl}libre{\textquotedbl} utilizada por el intérprete, reemplace la definición de +macro con la función requerida por el usuario. Esta función debe tener la misma forma que la declaración de la función +{\textquotedbl}libre{\textquotedbl} en la biblioteca estándar.} + +\foreignlanguage{spanish}{Esta macro determina la función +}\textstyleSourceText{\foreignlanguage{spanish}{realloc}}\foreignlanguage{spanish}{ utilizada internamente por el +intérprete de Berry. Por defecto o cuando la macro no está definida, se utilizará la función +}\textstyleSourceText{\foreignlanguage{spanish}{realloc}}\foreignlanguage{spanish}{ en la biblioteca estándar de C. +Esta macro se define como }\textstyleSourceText{\foreignlanguage{spanish}{realloc}}\foreignlanguage{spanish}{ por +defecto. Si el usuario necesita especificar explícitamente la función +}\textstyleSourceText{\foreignlanguage{spanish}{realloc}}\foreignlanguage{spanish}{ utilizada por el intérprete, +reemplace la definición de macro con la función requerida por el usuario. Esta función debe tener la misma forma que la +declaración de la función }\textstyleSourceText{\foreignlanguage{spanish}{realloc}}\foreignlanguage{spanish}{ en la +biblioteca estándar.} + +\foreignlanguage{spanish}{Esta macro se utiliza para definir la implementación de la función de aserción. De forma +predeterminada, la función }\textstyleSourceText{\foreignlanguage{spanish}{assert}}\foreignlanguage{spanish}{ en la +biblioteca estándar de C se usa para implementar la afirmación. Si el sistema de destino tiene inconvenientes para usar +la función }\textstyleSourceText{\foreignlanguage{spanish}{assert()}}\foreignlanguage{spanish}{ en la biblioteca +estándar para hacer una afirmación, puede modificar la definición de la macro +}\textstyleSourceText{\foreignlanguage{spanish}{be\_assert}}\foreignlanguage{spanish}{. Una función de aserción +correcta debe usar la siguiente declaración:} + +{\selectlanguage{spanish}\ttfamily +void assert(int condition);} + +\foreignlanguage{spanish}{Entre ellos, +}\textstyleSourceText{\foreignlanguage{spanish}{condición}}\foreignlanguage{spanish}{ es la condición de afirmación. Si +no se cumple la condición, se emitirá un mensaje de error y el programa finalizará. Por supuesto, la función +{\textquotedbl}afirmar{\textquotedbl} generalmente se implementa mediante una macro.} + +\subsection[Archivo berry\_port.c]{\selectlanguage{spanish} Archivo berry\_port.c} +\hypertarget{RefHeadingToc360373639824055}{}{\selectlanguage{spanish} +Este archivo implementa las funciones de E/S de bajo nivel del intérprete de Berry, incluida la entrada y salida +estándar y la compatibilidad con el sistema de archivos. El archivo \textit{berry\_port.c} en el directorio +\textit{predeterminado} contiene un conjunto de soporte de E/S portátil. Las operaciones de archivo y la entrada y +salida estándar se implementan mediante API en la biblioteca estándar de C. Las operaciones de ruta y carpeta son +compatibles con las API estándar de Windows y POSIX. Este archivo también implementa un conjunto de funciones de +operación de E/S basadas en FatFs para que los usuarios las usen directamente. Si necesita usar el intérprete de Berry +en otros entornos, estas funciones deben implementarse por separado (es posible que solo deban implementarse +parcialmente).} + +{\selectlanguage{spanish} +Esta sección presentará las funciones de las funciones implementadas en el archivo \textit{berry\_port.c} y guiará a los +usuarios para implementar su propia versión.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_writebuffer(const char *buffer, size\_t length);} + + +\bigskip + +\foreignlanguage{spanish}{Envíe un dato al dispositivo de salida estándar, el parámetro +{\textquotedbl}búfer{\textquotedbl} es la primera dirección del bloque de datos de salida y +{\textquotedbl}longitud{\textquotedbl} es la longitud del bloque de datos de salida. Esta función genera el archivo +}\textstyleSourceText{\foreignlanguage{spanish}{stdout}}\foreignlanguage{spanish}{ de forma predeterminada. Dentro del +intérprete, esta función generalmente se usa como una salida de flujo de caracteres, no como un flujo binario.} + +\foreignlanguage{spanish}{Las funciones +}\textstyleSourceText{\foreignlanguage{spanish}{be\_writebuffer}}\foreignlanguage{spanish}{ son muy versátiles y deben +implementarse.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +char* be\_readstring(char *buffer, size\_t size);} + + +\bigskip + +\foreignlanguage{spanish}{Ingrese un dato del dispositivo de entrada estándar y lea como máximo una fila de datos cada +vez que se llame a esta función. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{buffer}}\foreignlanguage{spanish}{ es el búfer de datos pasado por la +persona que llama, y la capacidad del búfer es +}\textstyleSourceText{\foreignlanguage{spanish}{tamaño}}\foreignlanguage{spanish}{. Esta función dejará de leer y +regresará cuando se agote la capacidad del búfer; de lo contrario, regresará cuando se lea un carácter de nueva línea o +un carácter de fin de archivo. Si la función se ejecuta con éxito, usará directamente el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{buffer}}\foreignlanguage{spanish}{ como valor de retorno, de lo +contrario devolverá }\textstyleSourceText{\foreignlanguage{spanish}{NULL}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{Esta función agregará los saltos de línea de lectura a los datos leídos, y cada vez que se +llame a la función }\textstyleSourceText{\foreignlanguage{spanish}{be\_readstring}}\foreignlanguage{spanish}{, +continuará leyendo desde la posición actual. Esta función solo se llama en la implementación de la función nativa +}\textstyleSourceText{\foreignlanguage{spanish}{input}}\foreignlanguage{spanish}{, y es posible que la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_readstring}}\foreignlanguage{spanish}{ no se implemente cuando no +sea necesaria.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void* be\_fopen(const char *filename, const char *modes);} + + +\bigskip + +\foreignlanguage{spanish}{Para abrir un archivo, +}\textstyleSourceText{\foreignlanguage{spanish}{filename}}\foreignlanguage{spanish}{ es el nombre del archivo que se +abrirá y }\textstyleSourceText{\foreignlanguage{spanish}{modos}}\foreignlanguage{spanish}{ es el método de apertura. La +función devolverá un identificador de archivo o un puntero a la estructura de operación del archivo. El uso de esta +función es similar a la función }\textstyleSourceText{\foreignlanguage{spanish}{fopen}}\foreignlanguage{spanish}{ en la +biblioteca estándar de C. El nombre del archivo es una cadena de estilo C (que termina con un carácter +}\textstyleSourceText{\foreignlanguage{spanish}{{\textbackslash}0}}\foreignlanguage{spanish}{), y el patrón debe +admitir al menos las siguientes condiciones:} + +\liststyleLxxiii +\begin{itemize} +\item \textstyleSourceText{\foreignlanguage{spanish}{r}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{rt}}\foreignlanguage{spanish}{: Para abrir un archivo de texto en modo +de solo lectura, el archivo debe existir.} +\item \textstyleSourceText{\foreignlanguage{spanish}{r+}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{rt+}}\foreignlanguage{spanish}{: Abre un archivo de texto en modo +lectura-escritura y crea un nuevo archivo si el archivo no existe.} +\item \textstyleSourceText{\foreignlanguage{spanish}{rb}}\foreignlanguage{spanish}{: abre un archivo binario en modo de +solo lectura, el archivo debe existir.} +\item \textstyleSourceText{\foreignlanguage{spanish}{rb+}}\foreignlanguage{spanish}{: abre un archivo binario en modo de +lectura y escritura y crea un nuevo archivo si el archivo no existe.} +\item \textstyleSourceText{\foreignlanguage{spanish}{w}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{wt}}\foreignlanguage{spanish}{: Crear y abrir un archivo de texto en +modo de solo escritura, y el el archivo existente será eliminado.} +\item \textstyleSourceText{\foreignlanguage{spanish}{w+}}\foreignlanguage{spanish}{, +}\textstyleSourceText{\foreignlanguage{spanish}{wt+}}\foreignlanguage{spanish}{: Crea y abre un archivo de texto en +modo lectura-escritura, y el el archivo existente será eliminado.} +\item \textstyleSourceText{\foreignlanguage{spanish}{wb}}\foreignlanguage{spanish}{: crea y abre un archivo binario en +modo de solo escritura, y el el archivo existente será eliminado.} +\item \textstyleSourceText{\foreignlanguage{spanish}{wb+}}\foreignlanguage{spanish}{: Crea y abre un archivo binario en +modo lectura-escritura, y el el archivo existente será eliminado.} +\end{itemize} +\foreignlanguage{spanish}{De forma predeterminada, la función +}\textstyleSourceText{\foreignlanguage{spanish}{fopen}}\foreignlanguage{spanish}{ en la biblioteca estándar de C se usa +para implementar }\textstyleSourceText{\foreignlanguage{spanish}{be\_fopen}}\foreignlanguage{spanish}{. Si utiliza +otros métodos para lograrlo, debe asegurarse de que se puedan lograr los modos de funcionamiento anteriores. Si no se +requieren operaciones de archivo, esta función se puede dejar en blanco. Las operaciones de archivos aquí incluyen +todos los escenarios, como usar la función +}\textstyleSourceText{\foreignlanguage{spanish}{abrir}}\foreignlanguage{spanish}{ en el script, cargar el script desde +un archivo (usando la función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_loadfile}}\foreignlanguage{spanish}{), etc.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_fclose(void *hfile);} + + +\bigskip + +\foreignlanguage{spanish}{Cierra un archivo, +}\textstyleSourceText{\foreignlanguage{spanish}{hfile}}\foreignlanguage{spanish}{ es el identificador de archivo +cerrado. La función de esta función es similar a la función +}\textstyleSourceText{\foreignlanguage{spanish}{fclose}}\foreignlanguage{spanish}{ en la biblioteca estándar de C.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +size\_t be\_fwrite(void *hfile, const void *buffer, size\_t length);} + + +\bigskip + +\foreignlanguage{spanish}{Escribe un dato en el archivo especificado. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{hfile}}\foreignlanguage{spanish}{ es el identificador del archivo +}\foreignlanguage{spanish}{que se escribirá, +}\textstyleSourceText{\foreignlanguage{spanish}{buffer}}\foreignlanguage{spanish}{ es el puntero de los datos que se +escribirán, }\textstyleSourceText{\foreignlanguage{spanish}{length}}\foreignlanguage{spanish}{ es el número de datos +que se escribirán (en bytes).} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +size\_t be\_fread(void *hfile, void *buffer, size\_t length);} + + +\bigskip + +\foreignlanguage{spanish}{Leer un fragmento de datos del archivo especificado. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{hfile}}\foreignlanguage{spanish}{ es el identificador del archivo que +se leerá, }\textstyleSourceText{\foreignlanguage{spanish}{buffer}}\foreignlanguage{spanish}{ es el puntero al búfer de +lectura y }\textstyleSourceText{\foreignlanguage{spanish}{length}}\foreignlanguage{spanish}{ es el número de bytes que +se leerán.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +char* be\_fgets(void *hfile, void *buffer, int size);} + + +\bigskip + +\foreignlanguage{spanish}{Lea una línea del archivo, similar a la función +}\textstyleSourceText{\foreignlanguage{spanish}{fgets}}\foreignlanguage{spanish}{ en la biblioteca estándar de C. El +parámetro }\textstyleSourceText{\foreignlanguage{spanish}{hfile}}\foreignlanguage{spanish}{ es el identificador del +archivo que se va a leer, }\textstyleSourceText{\foreignlanguage{spanish}{buffer}}\foreignlanguage{spanish}{ es el +puntero del búfer de lectura y }\textstyleSourceText{\foreignlanguage{spanish}{size}}\foreignlanguage{spanish}{ es la +capacidad del búfer de lectura. Esta función regresará cuando se lean los bytes +}\textstyleSourceText{\foreignlanguage{spanish}{size - 1}}\foreignlanguage{spanish}{, los caracteres de nueva línea y +los caracteres de fin de archivo, y el valor de retorno sea +}\textstyleSourceText{\foreignlanguage{spanish}{buffer}}\foreignlanguage{spanish}{.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_fseek(void *hfile, long offset);} + + +\bigskip + +\foreignlanguage{spanish}{Establezca la posición del puntero de lectura y escritura del archivo. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{hfile}}\foreignlanguage{spanish}{ es el identificador de archivo que se +va a utilizar y }\textstyleSourceText{\foreignlanguage{spanish}{offset}}\foreignlanguage{spanish}{ es el valor que se +va a establecer.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +long int be\_ftell(void *hfile);} + + +\bigskip + +\foreignlanguage{spanish}{Obtenga el puntero de lectura y escritura actual del archivo, el parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{hfile}}\foreignlanguage{spanish}{ es el identificador del archivo que +se va a operar, y el valor de retorno de esta función es el puntero de lectura y escritura del archivo.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +long int be\_fflush(void *hfile);} + + +\bigskip + +\foreignlanguage{spanish}{Escriba los datos del búfer de archivo en el archivo. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{hfile}}\foreignlanguage{spanish}{ es el archivo a operar.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +size\_t be\_fsize(void *hfile);} + + +\bigskip + +\foreignlanguage{spanish}{Obtenga el tamaño del archivo. El parámetro +}\textstyleSourceText{\foreignlanguage{spanish}{hfile}}\foreignlanguage{spanish}{ es el archivo a operar.} + +\subsubsection{Hacer una función nativa} +\hypertarget{RefHeadingToc360393639824055}{}\foreignlanguage{spanish}{La FFI en C (interfaz de función externa) de Berry +opera en una pila virtual para interactuar con la máquina virtual. Si necesitamos hacer una función +}\textstyleSourceText{\foreignlanguage{spanish}{add}}\foreignlanguage{spanish}{ para sumar dos números y usarla en +Berry de esta manera:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +result = add(1, 2)} + + +\bigskip + +{\selectlanguage{spanish} +Necesitamos saber cómo el código C obtiene los argumentos de la llamada a la función Berry y cómo devolver el valor.} + +{\selectlanguage{spanish} +Los argumentos de la función se almacenan en una pila, y desde el primer argumento hasta el último argumento de la +función se almacenan desde la parte inferior de la pila hasta la parte superior de la pila. Si desea utilizar C para +obtener elementos de la pila, utilice el siguiente conjunto de FFI:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_toint(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +breal be\_toreal(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_tobool(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +const char* be\_tostring(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +void* be\_tocomptr(bvm *vm, int index);} + + +\bigskip + +{\selectlanguage{spanish} +Si desea probar si un valor en la pila es de un tipo específico, use el siguiente conjunto de FFI:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int be\_isnil(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isbool(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isint(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isreal(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isnumber(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isstring(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isclosure(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isntvclos(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isfunction(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isproto(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isclass(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_isinstance(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_islist(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_ismap(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +int be\_iscomptr(bvm *vm, int index);} + + +\bigskip + +{\selectlanguage{spanish} +Si necesita enviar valores a la pila, use estos FFI:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +void be\_pushnil(bvm *vm);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushbool(bvm *vm, int b);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushint(bvm *vm, bint i);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushreal(bvm *vm, breal r);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushstring(bvm *vm, const char *str);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushnstring(bvm *vm, const char *str, size\_t n);} + +{\selectlanguage{spanish}\ttfamily +const char* be\_pushfstring(bvm *vm, const char *format, ...);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushvalue(bvm *vm, int index);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushntvclosure(bvm *vm, bntvfunc f, int nupvals);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushntvfunction(bvm *vm, bntvfunc f);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushclass(bvm *vm, const char *name, const bnfuncinfo *lib);} + +{\selectlanguage{spanish}\ttfamily +void be\_pushcomptr(bvm *vm, void *ptr);} + + +\bigskip + +\textstyleSourceText{\foreignlanguage{spanish}{index}}\foreignlanguage{spanish}{ es la posición del elemento en la pila, +un valor positivo es el desplazamiento desde la parte inferior de la pila hasta la parte superior de la pila, y un +valor negativo es el desplazamiento desde la parte superior de la pila hasta la parte inferior de la pila.} + +{\selectlanguage{spanish} +El valor de retorno utiliza dos FFI:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_return(vm)} + +{\selectlanguage{spanish}\ttfamily +be\_return\_nil(vm)} + + +\bigskip + +\foreignlanguage{spanish}{Estos FFI son en realidad macros. +}\textstyleSourceText{\foreignlanguage{spanish}{be\_return}}\foreignlanguage{spanish}{ devuelve el objeto en la parte +superior de la pila, y }\textstyleSourceText{\foreignlanguage{spanish}{be\_return\_nil}}\foreignlanguage{spanish}{ +devuelve }\textstyleSourceText{\foreignlanguage{spanish}{nil}}\foreignlanguage{spanish}{.} + +{\selectlanguage{spanish} +Estas FFI se definen en berry.h.} + +\foreignlanguage{spanish}{Ahora implementemos la función +}\textstyleSourceText{\foreignlanguage{spanish}{add}}\foreignlanguage{spanish}{:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int my\_add\_func(bvm *vm)} + +{\selectlanguage{spanish}\ttfamily +\{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ /* comprobar que los argumentos son todos enteros */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ if (be\_isint(vm, 1) \&\& be\_isint(vm, 2)) \{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ bint a = be\_toint(vm, 1); /* obtener el primer argumento */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ bint b = be\_toint(vm, 2); /* obtener el segundo argumento */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_pushint(vm, a + b); /* empuja el resultado a la pila */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \} else if (be\_isnumber(vm, 1) \&\& be\_isnumber(vm, 2)) \{ /* comprobar que los argumentos son todos números +*/} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ breal a = be\_toreal(vm, 1); /* obtener el primer argumento */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ breal b = be\_toreal(vm, 1); /* empuja el resultado a la pila */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_pushreal(vm, a + b); /* empuja el resultado a la pila */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \} else \{ /* parámetros inaceptables */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \ \ \ \ be\_pushnil(vm); /* empuja nil a la pila */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ \}} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_return(vm); /* devuelve el resultado del cálculo */} + +{\selectlanguage{spanish}\ttfamily +\}} + + +\bigskip + +{\selectlanguage{spanish} +Luego regístrelo en el lugar apropiado:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_regcfunc(vm, {\textquotedbl}add{\textquotedbl}, my\_add\_func);} + +\subsubsection[Crear una instancia de un objeto list en una función nativa]{\foreignlanguage{spanish}{Crear una +instancia de un objeto }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ en una función +nativa}} +\hypertarget{RefHeadingToc360413639824055}{}\foreignlanguage{spanish}{La generación de clases nativas instanciadas en C +puede ser engorrosa en comparación con los tipos simples. Esta sección guiará al lector a instanciar la clase +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{.} + +\foreignlanguage{spanish}{La clase }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ es +un contenedor alrededor de la estructura de la lista, que tiene una propiedad +}\textstyleSourceText{\foreignlanguage{spanish}{.data}}\foreignlanguage{spanish}{ para la estructura de la lista. Por +lo tanto, primero necesitamos construir una estructura de lista:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_newlist(vm);} + + +\bigskip + +\foreignlanguage{spanish}{La función +}\textstyleSourceText{\foreignlanguage{spanish}{be\_newlist}}\foreignlanguage{spanish}{ construye un valor de tipo +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_LIST}}\foreignlanguage{spanish}{. Entonces podemos operar sobre los +datos:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_pushint(vm, 100);} + +{\selectlanguage{spanish}\ttfamily +be\_data\_append(vm, -2);} + +{\selectlanguage{spanish}\ttfamily +be\_pop(vm, 1); /* extraer el entero 100 */} + + +\bigskip + +\foreignlanguage{spanish}{Las dos primeras líneas de código se utilizan para añadir el entero +}\textstyleSourceText{\foreignlanguage{spanish}{100}}\foreignlanguage{spanish}{ a la lista, y la tercera línea del +entero }\textstyleSourceText{\foreignlanguage{spanish}{100}}\foreignlanguage{spanish}{ se extrae para facilitar las +operaciones posteriores.} + +\foreignlanguage{spanish}{Dado que el tipo +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_LIST}}\foreignlanguage{spanish}{ no se puede usar directamente en +Berry, pero lo usa la clase }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{, tenemos +que construir la clase }\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ para él:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_getglobal(vm, {\textquotedbl}list{\textquotedbl});} + +{\selectlanguage{spanish}\ttfamily +be\_pushvalue(vm, -2); /* empuja los datos de la lista al principio */} + +{\selectlanguage{spanish}\ttfamily +be\_call(vm, 1); /* llama al constructor */} + + +\bigskip + +\foreignlanguage{spanish}{El constructor de la clase +}\textstyleSourceText{\foreignlanguage{spanish}{list}}\foreignlanguage{spanish}{ permite el uso del parámetro de tipo +}\textstyleSourceText{\foreignlanguage{spanish}{BE\_LIST}}\foreignlanguage{spanish}{, que toma el argumento como datos +de lista.} + +{\selectlanguage{spanish} +El código completo es el siguiente:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +int m\_listtest(bvm *vm)} + +{\selectlanguage{spanish}\ttfamily +\{} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_getglobal(vm, {\textquotedbl}list{\textquotedbl});} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_newlist(vm);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_pushint(vm, 100);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_data\_append(vm, -2);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_pop(vm, 1);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_call(vm, 1);} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_pop(vm, 1); /* pop the arguments */} + +{\selectlanguage{spanish}\ttfamily +\ \ \ \ be\_return(vm);} + +{\selectlanguage{spanish}\ttfamily +\}} + + +\bigskip + +{\selectlanguage{spanish} +Registre la función nativa en el lugar apropiado:} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +be\_regcfunc(vm, {\textquotedbl}listtest{\textquotedbl}, m\_listtest);} + +\clearpage\section{Requerimientos de Memoria} +\hypertarget{RefHeadingToc360433639824055}{} +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#\#\# RAM requerida} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{}- extrema: 4 KB} + +{\selectlanguage{spanish}\ttfamily +{}- baja: 8 KB} + +{\selectlanguage{spanish}\ttfamily +{}- recomendada: ${\geq}$16 KB} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#\#\# ROM/Flash requerida} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{}- extrema: 64 KB} + +{\selectlanguage{spanish}\ttfamily +{}- baja: 128 KB} + +{\selectlanguage{spanish}\ttfamily +{}- recomendada: ${\geq}$256 KB} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#\#\# Explicación} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +{}- **extrema**: La capacidad de memoria requerida en la configuración mínima. Un valor inferior a este significa que es +casi imposible ejecutar Berry.} + +{\selectlanguage{spanish}\ttfamily +{}- **baja**: la memoria mínima requerida para que el intérprete completo de Berry incluya algunos códigos de usuario y +de terceros.} + +{\selectlanguage{spanish}\ttfamily +{}- **recomendado**: además del intérprete completo de Berry, se sportan muchos usuarios y código de terceros.} + +\clearpage\section{Hoja de ruta} +\hypertarget{RefHeadingToc360453639824055}{} +\bigskip + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +* [x] Soporte multilínea REPL.} + +{\selectlanguage{spanish}\ttfamily +* [x] Información de depuración en tiempo de ejecución.} + +{\selectlanguage{spanish}\ttfamily +* [x] Protección de pila API.} + +{\selectlanguage{spanish}\ttfamily +* [x] Soporte de operación de archivos.} + +{\selectlanguage{spanish}\ttfamily +* [x] Tabla hash fija (basada en ROM).} + +{\selectlanguage{spanish}\ttfamily +* [x] Soporte de destructor.} + +{\selectlanguage{spanish}\ttfamily +* [x] Compatibilidad con módulos nativos (use {\textasciigrave}import xxx{\textasciigrave} para importar un módulo).} + +{\selectlanguage{spanish}\ttfamily +* [x] Soporte de expresiones condicionales.} + +{\selectlanguage{spanish}\ttfamily +* [x] Función anónima.} + +{\selectlanguage{spanish}\ttfamily +* [x] Operación bit a bit.} + +{\selectlanguage{spanish}\ttfamily +* [x] Sentencia de asignación compuesta.} + +{\selectlanguage{spanish}\ttfamily +* [x] Alcance incorporado.} + +{\selectlanguage{spanish}\ttfamily +* [x] Función de argumentos variables.} + +{\selectlanguage{spanish}\ttfamily +* [x] Función nativa: {\textasciigrave}classof(obj){\textasciigrave}.} + +{\selectlanguage{spanish}\ttfamily +* [ ] \~{}\~{}Función nativa: {\textasciigrave}copy(obj){\textasciigrave}\~{}\~{}.} + +{\selectlanguage{spanish}\ttfamily +* [ ] Pila de llamadas de liberación automática.} + +{\selectlanguage{spanish}\ttfamily +* [ ] Expresión regular.} + +{\selectlanguage{spanish}\ttfamily +* [x] GC optimizado para el uso de la pila (sin recursividad).} + +{\selectlanguage{spanish}\ttfamily +* [x] Simplifica los mensajes de error de desbordamiento de pila.} + +{\selectlanguage{spanish}\ttfamily +* [x] Expresión lambda.} + +{\selectlanguage{spanish}\ttfamily +* [x] Manejo excepcional.} + +{\selectlanguage{spanish}\ttfamily +* [x] Compatibilidad con archivos de bytecode.} + +{\selectlanguage{spanish}\ttfamily +* [x] Iterador optimizado y sentencia {\textasciigrave}for{\textasciigrave}.} + +{\selectlanguage{spanish}\ttfamily +* [x] Operador de conexión (redefine el operador de rango {\textasciigrave}..{\textasciigrave}).} + +{\selectlanguage{spanish}\ttfamily +\ \ \ * [x] Conexión de cadena, por ejemplo, {\textasciigrave}'cadena' .. expr{\textasciigrave}.} + +{\selectlanguage{spanish}\ttfamily +\ \ \ * [x] Lista de conexiones, por ejemplo, {\textasciigrave}[] .. expr{\textasciigrave}.} + +{\selectlanguage{spanish}\ttfamily +\ \ \ * [x] Método de serialización de lista (para conexión de cadena de alto rendimiento).} + +{\selectlanguage{spanish}\ttfamily +* [x] Soporte de módulo completo.} + +{\selectlanguage{spanish}\ttfamily +\ \ \ * [x] Exportación/importación del módulo de archivo de script.} + +{\selectlanguage{spanish}\ttfamily +\ \ \ * [x] Compilación/importación del módulo de archivo de bytecode.} + +{\selectlanguage{spanish}\ttfamily +\ \ \ * [x] Carga del módulo nativo compartido (como *.so, *.dll).} + +{\selectlanguage{spanish}\ttfamily +* [x] API de verificación de igualdad universal (como el operador {\textasciigrave}=={\textasciigrave} pero se usa en +C).} + +{\selectlanguage{spanish}\ttfamily +\ \ \ * [x] Coincidencia de clave de mapa completa.} + +{\selectlanguage{spanish}\ttfamily +\ \ \ * [x] Coincidencia de valor de excepción completa.} + +{\selectlanguage{spanish}\ttfamily +* [ ] Compatibilidad con el depurador.} + +{\selectlanguage{spanish}\ttfamily +* [ ] Mecanismo completo de clases y objetos.} + +{\selectlanguage{spanish}\ttfamily +* [ ] Mensaje de error de soporte para la herramienta *map\_build*.} + +{\selectlanguage{spanish}\ttfamily +* [x] Llamada sobrecargada al operador {\textasciigrave}(){\textasciigrave}.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#\# Versión de lanzamiento} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#\#\# V0.2.0} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +* [ ] Documentación china completa.} + +{\selectlanguage{spanish}\ttfamily +* [x] Manejo excepcional.} + +{\selectlanguage{spanish}\ttfamily +* [x] Soporte de módulo completo.} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +\#\#\# V0.1.0} + + +\bigskip + +{\selectlanguage{spanish}\ttfamily +* [x] Interfaz de sistema de archivos portátil.} + +{\selectlanguage{spanish}\ttfamily +* [x] Compatibilidad con objetos constantes precompilados.} + +{\selectlanguage{spanish}\ttfamily +* [x] Módulo constante completo precompilado.} + +{\selectlanguage{spanish}\ttfamily +* [ ] \~{}\~{}Documentación más completa (chino)\~{}\~{}.} + +{\selectlanguage{spanish}\ttfamily +* [ ] \~{}\~{}Guía de portabilidad\~{}\~{}.} +\end{document} diff --git a/es_es/berry_rm_es_es.epub b/es_es/berry_rm_es_es.epub new file mode 100644 index 0000000000000000000000000000000000000000..0c7998ca506fdbd181734042be2cd0d60154b0d1 GIT binary patch literal 126320 zcmaI7Q?M{R(5<;`+qP}nwr$(CZQHiqZQHhOW4?dRsWUS-bCF6qRehCJPp3L73evzJ zC;$Ku005wESgQ7h)inP_0RJ=o+XAq)v^90{bTBn^aImp7HgvJHx1%?8a5bX#vUE`R z-fVxgwlJL<2x?5pk*pbKjp9UjkMl38)D7nT5Ggc;B!*f{>qpPM0vT0do*OX6=P z**JEqy%bFn2p|ZldWBx6{q$eAY6M*cZdKp<$vX&x+uz^1kj-nR|cs9ZdO z=Qnczc(x5dTfPSa#lgAwMSj=j8M|qeB8J^9(Z?zdxgJfWiIvT5n#KIuSD;p{rB|^P zQZI9JTJ2N(?3mc|%ivvIBI`Ffbk*eDrJV1SSiqK1d-caJ(dzf4tAwGe>u>>k>t5}| zO9tge)W-wlrPm&&yrCiUlqL&G#047xZa_WlrEAW_DR_{{?Y{gQ=+s9#37!{mkg)~U zjz|}{ej7k03)r6-97OV3fp&et?Oo3WgMM1 zb<>xDU*lAzH^*M~_{eU&QjUJ=bsH6S2szU26hBR6YPvCtdLwriLk}8DT)OA4KDAyY!~L0hX_ik?HB%e;lGu6k>m*r1#^GL?}k)-YcwwuXZ@Ac-jeQwA6< z+Q0xBWJY4J0D(pdP=*6egLH%rC=)?rFp`$=$S5@|G7eBmiCyf_qRkV5ATO?aVU%<& zZXKn$FEq_d2!bFqWMLqa#++aZ0@@m1r7<)alow-Zzn6qS#3d#wJ`SWZ4N8WyU(jw` z2K8!>h*D$(hARe8%z~r9SosJH<%|NipFu6oSdb7hbQ{U-&Uwv2t{bz8^J!-BYIh#f z?5j)`*fp1#I>Wv;r%b@X<$wDP{Qp()JfLci@_#Dch5`UU{68u-wzqRJwR54fcQC6> z6HHEKKpDI9i-J)HN0Op!0ltm_e>s%IowM|qrvQN&aQoLwSX3X+c)TlE=@Yp)N>n-9tn&psTN&-6Fhnry zTnDrPw+brOX?6*FYol*MOQEGC8eL=3{Xr9v-iD0kh?EE`jm!^~Jgz^6`0%DE^G#K% zh#KnHCHIQy7sO;Tq6$1hP9?TkfRqpdRl=5|{IgmBCc?XT7qA4Q-zuqVKh6NPnQ0{SBu&bL_UNifsIKe03zCU=hog&@}5XYRr0D-Bw2pddPm z+Hzh1J>3hKvG{{?e*#Wuh?4_XWy@ncFS{;Go09W+*%-cE?7Qb6Mvj>M-QGov*9We@ zb#NuRpNNY`3#7ksP@O*HS*^`%@I-)x_*}$iTwhqOfIO!}&F%B$ z)N!dnuzn%a)%Trzm~K_iY@=E=Cg$zwhXbI}A9kR$-@Hz%J0N*L>Gd}K+Lo-|vIEq< z2i7!hOAv{hM+4NZ&)PJty0u=vX_h#7>Z2-&wDEm(T_{nUy%t zU4F?TY3zAFjF{g~XJlLLEDO7I-u&F=_O6w&!fGmuke%-p2Q*(f zfSDRTO1rRerlwi>6&c7HDVu+R=ozYp{7Ori3vkV)MM@F|bF+G)Qr1HPNiLCQCjc2V z=*qUlCw;+)8>zuF8yX5`+{6w217n9XS4+8H+EWW$%BFJJ5}M*&6a$fo2|>Vbxx-N- zzJbwrf1impU_UOob{o4`r=W%PZ>hL z(vYC6wXoKVT4{i=h`KbtPDIg@=$0OOYhCDO4oZ>{H-|^WgS6yOj-r(H-N>ZXHvL+U zME%BNQ1#^176tOY?c(m#u6-!RkJ+9X1)B{HfrNY(F>J65u`LG*5c-_7BH~m!(a0x8 z!^S5$L4(k;2+4+;LzAxx&ABMMD+@Vh$)_0HqPU-{tXG`5%-tffgs>YGdX|PUYn(*Q zj%Y=jjN^_pD4$IW*5WV^6fyk-_zWFlvT9l)dIKnCupIQ(FCTF!qy*jx8q9@>|9T4F?lv?W0shK(?%uR`GF z?7->!TTA?yC6b$OdugYS&AP%rNEU4QRBrd#UOLQ?2bS!FX|>u<7K2bpp&uqaAiAnF&@QaGW9faBd` z!ZyH0fb>7A6MmMTg7mvl%KwX}BK)v3Da>1*j%kUBSbIk+#Bb1x$^9ct#n#Ed=P~&A z=}t(C6x?OCKC_CF5ccyN?&2>Ebk*`*(=4#J#Vtm+%-dx=B|_ykZiBZPY#YYfb4ifK z7FMlr!jjq;@PZDO$IRi+xlS};)uo5_I>*X$)TwjsxV}j(qg6+D8Varv{oc&i%Yu$&qGGf z?FQ~?%DGRZDTr8sJ{d4n@K2T6J7LHI`_2o5h1qe#@frRK=rh|hI(3_50TSJ?{8HCOny(m-E<{m|JYc2w!~GrUj68n_dKb?9lJvlt6#eN+ zWW?=~ww;YIeH`lF@AHBcD8?Va8RmTT4p|=SaM=+cuOa*Jh7Qp`gF_=m2z?T009aly z`@-h(elPg?Hs5nKX#8cG37q8QaHr<@p34LAOBYcgulvWQ@_8_l&jH`isRM9!yubZ_ z-#*8(_k;8EV#wqk0L;65vft|}a=tx=Xp+6-`H|M*Aj~u&2=dGeq2EanHNH`M-pP{X zh;l{Acrm#&iHydcj4#R@+#KcuLgWDE==u{RyL_;{i10Y`M;3^p9K}4Wh>oQ3^~j+V zJOULs0sA6~HEB)(0?BjXO>y+$aWNqG7M>0?mHj_}X94*kiaXwjLr)H)C zJf{q*5TSI=7UlQ3-wA8P!Db(6c^G4JG!bM)_hHbOz)I5UTnKc>G!yPeGnJ0E|xIP&vZung?tVoQYY$flGTmY$#{6lctB-* z1DELip`K`~N0()vc)H#=@(ZK($pU7hF;4A8fZ^|W{eHD((FIjFuLr^m;g_4iiWe;E zFM#tWhGTy~X~#xk*$}UvKsv5H`?8$_jOa3BKyX+X4mgNHz;#A!)hKR0Ac+Jn^@$ca zBO!e1MQZ6|H6cB5`;$eXDzx`)FX@Ry;=h9(KAv<&S&AQ?6Q4|v0TCcj;3QEp{9;ilLilFz`RpCT<#cyQYg59!c=Gg+m&ktfN)C{am1pAQ1(Fp8Cnqf0qhp=Mcz{) zOl)9qh^YiYGu`({wRXTr1%#M(LPmPm6rhA0T zL7$rcXe!V2&?^BPphy=5Jhsv96EDv^&{*o{?)fK+UVP07;*5Pal`Iq0QHtX3d4IkU zp+X*#{R1uu0Uwkc)C?fQADMX`>Ec1D?Mrbmu*vxu0422F{C9&Q!z3GAbJ$fqrjoK|(BN2Ur{EmEK zcYMA{|47gKT}~BD@YnI`ADTIPjKt4i*pcszU6Q?&0Y`b8`u9CI55K?1m5jF>@-S!7 zHrdfmi7BTb%s$}BAM4&QlP|sS#y7@bI*0vZhytnsKffmFKRlO~rfn zuI#h+l)-1ZqjZYY@^ExZxv6;Q~C>rKvbQ}U?TawrAmpE$s_QQd0 zWE(#3x1&CI%P0BI%PLn^5huAjkOtJ?^Sh{0bPzcTc7}*K>40@1L{Zn=j*@4o#Pw_%#L1)y@x+k&9ol2}bT7A(2nn1l_#IVPftC!eRCx zef+2~FFIa)-N_&|sG=AOEXoSG+nwVq1JcQ1F~jj=I5obefMEMb(71JoTP<8{+7Rqr zy*O2j<}KI*@TA3JJEBl5B}y&$#nxy3Zge7p^{Jdhnv(*0p&JA=}>YT z=e8T25@0dC@9;-!0=3w?WQh?7uYsqyjR7n5K+x}~o*j`xs)_<)hAv|J8VGg3)_XyUTM>(~tm z>nsq6_B62l=G=06RIqbyY&e{lkv=N&DSoTMExEYsI!p{q^M{I>a~4#D=d$i0R;PM~ z#DYWt!y{`zQ-m1c=Lvk{o!GDGX}T*V z6<0|~ZbI`{hF6Sh3UCDsud*#5pN|*bh_m2k{MDSOK-8QVL86qtxxLviph%k7)5#VJ z1|oTmrzVY1YdnZd5H^n!AMFNi&$wJ4#C@pvm(`I%X%;}EcX`_%jZsr(6JbpTJ8C!akuy zbJnr?Moey_jZQR7^u=e{M;TR;Y29xNxyZCwRq`aqP95J4Q~Xe9tFZ$I5+|l}3tRD* zf!PSpQ8lEcPcrx{-@0EwIl&0sajHT_RE2Y=5B9rW^mnbx+clFOB+M!x%vevbRq905 z=F^By`XXK|ZH(g6g6ylf<)R%;5?ZS?m}fUkutFT?Xu>2f*kv;BS^D2^dmSKRR`ovB z%nM1D0CU662OSl)Va z0TpPz%Gth(<*eEu&rBvTS?)*=+2Gd(VA26FeIO1Z%E*%OBVUrbo?cMHyABGT}KYt6n{A zDq8XmuT@J9a2f5Gzue+FQTMSH2U(f)MI53Fpkl8;(|>9S=tJU`Ed}d_>?Ioc_f|}J zPc^HsmnM>AzuBYvhZ)^gl4(|a!#Xs7y6Nv|iu9(Eo4DeJEthkJE(EM!8JB!P6geN3 zr>Xe?PD&tlXbH7ky+APF$GD`k3r(3f0UqeL=y=%Ta;c59&~80jiuMZLjdq3 zpA$vLX*-f3e%Bqg*I%WLRElj5&oW&y#>ZQSImwoQ^aKDDRztxZN&_O8y^wrNpp{HMrHfA$N=Cj85P|ztl3}@lc^>ixr573a}(*HY_LCF-$~NfBAcCz z@w8CDUnVfd!2<$n_`y8w2sg=Fr?1fU_P8esFcvVe-mei%6G;Kk*@f=e5Zu)s8KAA{ zx=ExUO$6J)5+Cc(sRpxM{92qu1*RyLg6bYx{sN2EAAe ztfW7qg}wpLOu_d1H&%2>++?{(vm+`t|}uAE@!7jeU;f!`AF9U`&rNm%1Du(aJ&p<=`CE_|{T z%*M_(Vzu2aF;l@~+&i;&WpbovUOa#3HU5j2ocL5&Ti)EETSAWIk(@}`k{F0&r_}&_^1O3OesGL8f&Pvu->cJ;OC(*3` zd;HN1(RajRutK49c7H`kf}rL%Rhv1Pvt8IGWkv18HggDqeK|sXo0E0A1U0Jyfw_b& z!kdG{ITUA!-2_WJcPM=1Ir-^m>>3tcy|d1hUg>EY)+1gaJZVGXY<;6RgcmPbn3WWK z#UYT}F&VKk#D_AhuAO`BoQd_P&NWd`*xd$9tSVMvW?;Z@fFBKlEX`)a+dnB9R*lo& zoftZZi84 z$TGi(w7Y%A(hLyO2qR-;a7^)f&f0lcHih44jqiOkK$1_3|(S+hYHQ@&e^LkHOI)UT!i`=JQtc4Wz76cT^S z`|Bay1)CBN7?*uc>q5q2m zkUw(k9Qr7byAg|fE5Ia^mdCJzX8;_A3P0OxPH?IQ)h1aw1+P(gsCcai)@ui#je?ZD z-d|~kzAng{+GXDDTG5H#EkLSkwu2(wm(VDbw4xw~-e!iTW~|i8FiFG5oEzL=Ti|IX z7-dHW1Gly>v<~rky)vH}6Q>_*m72b`I5K1Tf&A-Ua`?qcA(8m(FIW;ISl{2D?T~a5 zzde_a@&UxG)@nyw4fjL@XqiN#InDrxnw$M_)Czd4yAc2O5mMhTO0yUDw>qoHDT*?p}bv!LQDuOv8Cx;RK}nxJ?CDkV1!R&dkl9@Et%- zcu5UfC2>jd5%^`rnSj4J&uQalM+}Bu0|gyPz>=ze$p?@eJmj{}j{~;jrcvJF8WzD` zs=L(4CDA&b6kSH~VuCh>`E}097N{Ed762l$?Hg%zxt1f=m7J zc{A4T%0?z0WM*B(-&$ZBw2^9ZO8=pp_O&UpHSt=wFfu@kyKdrvlc>1gOjRwp)4l+W z!m$QILUyHj`EjMIzdXy5y5FYqn0rnEkVCtuS2=cA!PI*{!xBnCDk%ZFme)bdG8~Po zaOTJ9@>xQb=M2r6`WlV^?9RArB*IFxY_$4F3;3ygmFTLuH!t~w@*8xYU@y|hFD%EP z9>w_$8cQ{4k1XJ*+b?h+zmj+_G_NaR83PIkwvWvLSSxRPP0JYU6J6aQ7!PlkQ}!YX zCUqk-y^@(hN@Sf^4aYOd)z-_J;LhBHT+IihQ)+nqjP|KfnhvQ%$F?c$<7bfeyt+@5H=LAV`iQ?2d|Bw&LK z*$80{s(a?Xk%|KYCLDzCWA2$_AN-vD?|0?n`sJ0S**BE^G8TNbP*zD18D-1Az ziU7&8@r%3v$Z~${J-AhrlF&UlrK6hwX*HVM|6raO_cL_mH57Zu#5eB1Z*d6M~1rF$pJhDmT~uY0l1T@xkvQ+~GQ3={cs* zsBLDpWL4bq{mK=!R|U_?X_4QS2LZ6Ae~_E)(aqG$$V=V%@5#5E;;P~L_;oUk3(JHYn3vv!cfku!IYqn8 z9ZjZv*CstYS4wU?%~k4t`*xecnS%2Zy~eM^XDEK2Gy}S^Yhd{UZ0h{S)rdT9oP{j= z_=%36L1dF&%C;x}&U66VkxGp4hSH85ma$~3g#K#cu$N?T9}Y7yPS1qXK#i1t(h6q83= zY3VT5F8qeSAcSel#(6wTgKf}Cd>?kYcJ|Dd&Z$gEaR5^Hrkvh-e{2)O&5XTxv+WuC zWz&6?Dlg>vObhB~Et13tjPVp17GiqN18D{LdCKff?o!(emw(*VhMDx5PNEZ@7TWQ7 z-MvetFvHYf(yK~hKcf>L_QYE6SzD`gvQmd+Y*U{8K)Hwa=X{`Mv}O2ub^5R6UjVRA z|5-=zVva94r{j8c4=X$vYMxi_(E}9=0X6F_{W0w}3-W-R2gSa&t9wk9$wp5^aj;|4 z%0Bl~FLih07ZS{0zVLIt=PxH2q4BeXQwy)A<8|Sb_}SGzMK-WHZwa~wmjo1fz(ExMF8Uac#>55^y6m@Z^`p%ArX7Q?tv^hgD+SF2eB9^Eo*I)gz!|-@^?3z_8(xykMARPbL z@wb4^r0?Po<0hIDrhUN9XBz)7bc19xmJv0tjV5#jh(|_+I^-E~q7Fkxz@BI{it5Nn zBsbTD_Q1tLXmq+xGr{y?bpsi6E3n1nM^TJ4Z&I{V4b+DF-jZGYURhtc^u&5qH z?yb^h`Yv9G2U?T*FZjzc;Wa7&*s8Sy7+-$bFn?oJGteV#kzz%}A;R`n%ut;j3;Ky; zRhk8`S(+80%@_k;>36#F*}NA4j@C09?=)sicrtH*y#oW!Hgg6Nc%n*4?O(8sRz(|V zzB?fXO?*!(70nkK%oG@^L4#Gi3RSz8UU33g-cnswJ^bhHh@cyNkkvmLC%yElyyaTW zlDZRK-j(2YDa>Yybqahnb%+-Qs#JIQ1N32$fK;4yw5C$EsBU!iX={5F6OQyRf)Mxi zNh`Rtb9ZWY&-|o|3hT#urIqlbls_GjK&Lu?eMsSzp;@)O5L2xcI1B5{RUF%;yEb4> z9qn!R;)U}st9AS4Du7fXWd*j0(aJ(!R~iBW-P*lRz$~Y3;TYH4opd+`@$-I9NI6qh z9VlZv8@Z%=S}f{Y)*3vbJt4=~0V=F>r6BGUmX93gUp7M9ADji;qMFHWlJCnI-z^C3 zURdx-2H`VJy1m^Io&N3-FNRI^BNTV{uq1wbe{^e;OgnAGr~btsJR^uiaBeu~T8$2RAX|IaK_Ktc5*eXcZbuxgE=o z*1#KeA$Bv@QzV1hDWnmeZ@SIkgHW9*44+%acA}47!c`QCN<4~^ov+5IMvE7QSJ!dvhhQs}&QWXD51UH$_`+Ohg|9(%TyCDvJ8Qz4Q z&o!o3;lmpk&-;e?18#?h$Mpv)1^KRg*oeA3`CwdTvO zODTO|cq)p{RkDB&4IL;R$)r1rlqlCV$bvh;-%$>Dhuz|D^Y{2Ko3Z_&yr!tM8QA+5 zk-^P=tGk}n?JI3%BIr)7WIz%sF1j+SDQabT6B9}XyN2Qfj&ny3ek_5^f|eOQ#ojMR zv&>I}9ckv~e-k~I< zud-QeOXV_JZhF$K_5|xj|wtw)#IF4-Zr$lh4S9V;{)kxp;VNB?6gNE8IXg__N<`(-MD} z$gFP^<+{jPPfV73!R$BVkb-@Yl_w-VA&%=#-y?j!Vr+by4auWdO-xlTu2V|b-7x7* zG~N*Ye0Oomx$9}l=J^;qlia&z0KYWwPAjxtc*k!1kY8snk;>WRVWm6RafA|{!Idq4 z2}feu4Pkv2T*ls0@rYs<>{CaU(Bu9y6RffX??=pGDAmF@aKl^CxL}b|sP|!kMnm!g z6i8H$&FoW~M zGFqmPhoalI=u)2_s7p@)sC+^M1Dja8CDbp>obWQ$PD!!6tr?vwVj(#26)}~WEx06Q zfFFy`dp?-%&@=e_jUr&)<~R<9o^L_LH?LBYP#6lU?BIYn$D}$r8C#|?TfHk$rBC)r zDl}^_@ucubWwpa$A&N-jj>iHA@@aT$yqP zBCFqpofY(nLkY=KH9t2M`bl2@6W%T>bCmk0h36=%wZyhKzro*i zlgjVugiLKV$jQaUciZ4JyhKR>pudzFR1Su9=KgsJJxSfLQHm6`UJ#fU`F^fa>F%jp zs|1uyb(lZ0h?+UI)@WqJ9u|Ct$tAS|!)?iGhA=0L$`{EaC#$2{nXJQVI)ZcTs5mF< z8U7iCe#7sWcd(LDngns(a0h(dbd~Qnmw3@+D?Cr%`W0k z2^(8H6;VHt1BU2RL`*X(QI|8wfRPhU{!Yczl8|Qqa5;>~*0gT}7>Y5oqXor0zun-q zTu#iN89gH8<+fEPCu6RSk@3Y;35P2+Mm-Lh;7;gR3kRV8ybqcTu_B-&;bcrb0MJ0& zAeMn{$xN#I+c92?UN;L6Of~9!77Y>!md=lP3ZKUT_JP1kA?u-qQsY!G49p$=LIy*v zL)&lS+Q?nqvg*7OlfG1*J+BxI>;)vZ_#S30pT~U`%sbsWc{q=0-!0cOfm@S@9$Z3Y zfL)4sUo_w;T^aM_+C@Vku@`=p&vjHi^yExAi_bRx=~{a=GIS=d$HVXA z=%AtvezCSo&{lremt~G*PjIU3G=3V2z6rtT0wa&5M8dNEN#_&AOD0G;La|Nop8-bT(;zDyM%QDK%moo)#9_s8 zUDqTL##u{(h#(hf00%GdJvs=Q-Rp4MKj(uYF)6G3Ezs$kl0lEd*KhU+BC*4T7N!SC z0UA;v7w{GUyJv4wRPTO*2#*`pASU#e)J=hDHT#{g z6hiTy?U6#+Nc!NXwzx!S&039C5D&*y)0u{sATNPN zwEr1goc5@an>$dIUSa7^tXT1K=C z^-YwF@t(G0$eDz&W@drPxdy#>)taLO<~#JXH7UCkk22$D6=DdA7)&&`4XRTz@uxew z^78H3?KM2V&u5GGru+u2tn)3M<`8U&#kSKW{(7CzYXC158*|nTB{D92{Y&FQmObN! z4LSHm8#v(!vdB4Yu}(Owx#TXVnpfqt$T_rI>(_tgp?$g6Yu}-du#uTSE|P}{b$Wdx zDs-q4er<<&8ZR6P0AG67(Q0iLC zQ4Jem@s$ouLA`v`wL*=y5+ssloWM17Whu_mBob|#4cm)B;YnU)y6~jq8-~giM1%Tn zhqbS+6Wfcr=yg(CGTW#`s%Bh=y$Q6BSyVFm}b)E9?&@R(BT{Cq%7}6fKpPTIg4db_hC?thyX!!A;WmmLHixD zk1Nsq+4*e>DBA@~)med{pK}etmdO3)%S*Cq2)aci7pB}Z{ZGBH%JiJf!pqCBOEn-$ z#Y+@ks0J|!ayzV8sJ%;Vkw>w6V~^2+helyce8yEkQa^#+z7jEluHbJB`BCtrAv?)T z^CNX#1>;3zd`tX^Y5LqL`Yh)PI`w0AIO^!)8?YOBuABLT+B=0^Z;T;Ts&f8~?U(i& zJY4rpqOKZ|vo=ijY=(n0ZSpr%AWl;LK`x|{v?fg5_e9$&}S z(onI$+z4nUCKCbOM`Qm)r*z^Mlc}gV8{feR+oZi_5u?%T$1Ibj9+84%P%(9T+de6T z5G2${uO^>(f^MIzatTsVdV|zUi?U3!oJ8>#_*7}G&Nq&N>WG>$E61V24**X6{TKP~ z1T%FmCes)(@Orh8a}TBkzU{q(rS<$9@73+LQM?RT`J3~&)$MdN*P&G@;)znMf2mKT zaGRilFGcWT#c@d+IWwLKq5MPGRZTj5;$+MI7bCv?vI42|>^D-(2Rg0^aI~Fd>TfZ+FA|+g$$LzmN zzNZ_$^;=rqn%+<=7O-O*N|&dB3AmX!4<#lZa-!0Lqyd0Ag(NY*^tP(8xURz5I_#?D zd1+JGhEV$d*pwu@E4j@m8NV9Wo{lZ|dTkI5n0U{|qnF*FKWaam?8kQ24Qh{V@Ccb& zU<+SQ{Vx3-+wpO3mm^KwzqZ`xXGbl}m~gr7&2%v{!O!B+tNw?~9SlZiHndd!9&7Vh^#Q}x@q;oD)hk z4j4-o;bCNtx_Qm<|60UOQ$>pMTwv-L^hOF|-@I0?ugq^|*$jf!InP~^91cphx^D){ zX8g_{7T!I+3$kHIKsYh*u3aA`_2%D?Fia%J$d;2TzL3AGw`940DCTe zc+@6tN1o8>y$ISL<}bn~;p5`r<1Jq3^?E#Z0a5;O(|mz%0bUeUkW^HV(4wSjp{v_1 z0M(>jpgr)>m<;`aGyrHk5?k z45kzGjKa3&XUo=ezF9N(!AU6%N5brOa~>^Ivd3!LA`ih2%uCWJt;|m-9AkI?iZ{Fq zZt>ceRo`l@P#clnxEcDmIxx6oy}4ZX-pGd6)EJS5hf_4%4r{@|duzgbwTI8vvY%0| zy7>6GEDvpt9(A{uz-?^P`l@}{1;ny|m|m>Df$X1qHB7$uK+~2&pn=Z8QG19i))Dv9#W6AdUKD*EB`I7BZ1H{NTKF_7hZj+pJzUlEt zoRk+eZZ)R%(M5mb61G4%`?OQB=5zTxM{ToP4;{uPZ#)qqrB8O=ux3q6!h3jYUv6tg z2OOl7sHjSlJ;R8N#BImasmw~DoG{FY}vw>itcfePCl9)HcE(>bUs=;Gqg zgjytKF&=uneh6euv)uzHshr+r4YnW!4mXm8;ZPPU4HT^hbNbKd^c6dKJ7-^2j*$VVv{t?{G;z%L~r|W)F3Ah0lXBk6(G#)T*I| zDR7?_z0_dLsOOJ5J1FXj3z{?h<4!R5C#WiMWn|4hgp>T6C{>+OzhXd^7A;UE9bZB5 zN9Z#9Y@rX*gkx&h+DRTjJbT2b4u#gp=@fSximEStpyLz-pP${0%shUCmjbeHH75DA zP~XX}moug1j;BrdjjY)yZr0Ct1dA=@cx|@z^PUMx=jT9S53(M`uocA>S-WOC6b4X+ zVJ>L7JgR`>-*5U_#EOuk<3x#C*@tukglDlOp=@mddY5V63=GiGwpZ&AS=A6DFi1^3 zbZ4I9O?NMHNG$`;KivMF|JbD{hpGO-hxB7~5JbKnuf6NsgNG}JB?h)I?g?p*F{Mf1 za>xG8vmmcTyYZ3>q90|caPtJLfUnu-EQaAdJVg&ka48`uNI{_Gcyh(IH$p@Kl3A}M z+~Z??R8okq0Z?I_s`y*>pOY-+Kw;7HSa&F2!yj3E&o9&e;zC{*6Xf{;M6TyMBzeXI z&CGP>%fXl#$azYcg#u>W2U_Ec&%K@7V=x>isoD0 zYjBA_6UUF=h3shIT@?^kMy!6tNha2stZ;QopogDG`cK1#28Eh z+^!3Q%N(YB(ePuYy1TX?Bg^o>Y^MZMYZ)brg5lJuc5}+)dRtJm|3*8>ZkfhyIC4s< z8~>g|#q6&rSu=tt`PNp-;EJejdRN;9EB9YDqw+D0p9271Iz_ zag#Z8z2CmxNp^J0h0c}QtT13FVRq#*ZECd&qY}IZ+#$-g4zRKhqlBok{@k^jrbgRq z-QBpf*>H=%Tt{gu0o|(g#s)@fYo62N#TPC{iA?o(n(|L^se!DLRXQWgAGld2jA1NR zxVBIDN77&1?)EOctZ(f#YwD+rxX+ra|8kcuKe+jT!0n#nNF}#f?+pJ9`nF{60t?){ zrnz@>WC0;9JpphC|K0LZ{GgH<4_|gP968GG{!KRUz3(F6XRkFfKm}YY1_EN9R*x?C z)2?;A0sa1wCp6tpdzl~}7-J4?A_4f5f*~3opgd31fRNrlK>eQh%{y<|d zL4o)hO5U5r0r$Tp_`OJCF&S)k_)tP%t_Z7-Zs+zWbDjBV2|xu=L9vBtfJ*-lH#)(< zvwpm{Z`lszP(DYt zro!yk40jCvVvY*2LkyaK9Lw$Zx%S-e;HA#>Wr>S*+a#OBQ8&tI5=YxbK0IaGM<6rG zvDS!j)IX!_fcqJ?CC=J$lde%wrRbp=Wg@!r|9Pl6UdxSQ`=dbCd@6`&yQ;hh1A!Vj zM|E_>HQxGpR3i&eL+EyYtt{HmN_PQzS(`^AV<7b3$cuqVN>0^rP@E~WYSbpW6%IWS zL{}j9P#YEs+%wTGxb9_};_A{Bhsz>tQYi$7G;zPMUv@YzjZtPM>Kl2jWr|D>wf^tHVIoh6^(;o!+M&R!5ZFV>@o2D!7HwC%P5E0MU}_IkA@t%CqkPk zvNntS+z88CJexHz9%qx3qej5F;=9=aU$I4RGKvsR$R@KLeVmr%Bo0WlBzD~6+{lYW zpkoz!rl<-db}HO^6Tr^ggD>?y@BjX@w0yQtI6PjiiCdA%YG6s-;}QraT1N>4lOKiO zd?#^0R)+gKkim}$goUO5GghU^9m=(UiN<1o!F zDpy8BOz3t%Z^EPdi}HTkCDPse{%h@spl8u*@8r~zjesUmG^!D6yh~ZLyT9tq{_u%A zY9@qbJA#9ID{%o>IFFI*IL#eB+u3DI@N88yY!9(RNg8o4?3pT$CliOS+CF$uqVI#O z&JIz#NN+HmE3V5i+4{W#kn(~_7E)%N)j5mv-&bT=TU~vpCv3SpkrM$QE(0>(|ITJT zHeF4RwXQ#u&>e5CT7#t@FVw|QynajIttX?pEyAm z0pgG_GAMXq;`m^|E+vDYs_(Q2hy&x1ZXP@UG9qcV7^k~EBIqJ3-VBlS*B;0K{9P9~ zl#A%4q_I5(tXDgtclMxh=^r!ZU)Xm0Ob=!@+0o8OKJP|`^H4%})PD7eohUZT4TRXU zULUOa`V4}1xP|@$6=DyvW+*S`M6-|dEzm5n7iOnSa(H*-%jk^v-#~&p`~zzf_h7#T z_U;fk7Pj9@hJX5?aD;BawKq4Nk&eh7+lV&?QwJ8;nmf=9Z1M`nYtvt7BS)GfT1nN1 zM?gBSalPslSYW7^>4551hxJxRp&hz*85{J3#y~<~&#~WO8m0{ZqA9qk)sYbf%)nJy z8#l4*Q>8$lN*vy}tJm4HU(K?biayZ$j_OrH0bJND;o_$q%p(b!q49@U@GdH3I0`>( z3G^vMt4H>iV85SM-_edSUSS;GJxv0T!Z7{OjM`TiGR-Z};{An&9sF$>EUS3>9AaK~ zJjDWwXvlg3YjW|hF30YAUv^p;QMfBsl!8AsfLHj9NYpQWUGOzy*b%I}@e%gGWim4?JI4YVN4-RZN|8@uccI@j(z zp)ChM@l+S+l#;c23f8IctX=Kd%z}{nH{cRTijIbh9<(;R~LPYAysknJZa1KJS1Z3~*V_MDc@1 z{pxirLB6=5*8;$ER)RlFi~++&KF&3OiM-Am{C)FDJP;vYPL1$(jiagXa%V)7Zo#a$ z2m7i)kH13)bjiceulzo94;ZOnMm+uvz^O>r&(L>hlANl-9g1^b>LdM(MIqgz58)XR zi4%vVJJJ{@ci)z9*Q-lzP7%^D7x{@a*5Gt<_KzqlH-DiKXVWD)YL;I)$Qpsu-=Yek zS5)wA$f6dmQ_ZTxfi%Ae|Nq6;IRpu#gWI-k+qP}nwr$(CZQK0Ywr$(CyWe?LcXB6p zlu3rEO7hj(YbUs^^rYF9k@w#%p1?l<&BABj9eiJc5ixw61<|9>=QXM@0iV;u2)yd@<6kucr)2AGS6sNOWhEp3fsqdl>j;jk8wj$G!{CW z@aeDhCU*O(ja}$o;Ak?d;~je%vlG}3MvTJEQ)bJ~g+=iljCA1lHtFCg1{%sUcOS#F z33D47tPvdpnFNwV-9Ip~iJ7+YE@OA2(Mmh;XX+CqibmE$^2OHjS%U3^wXL-toQa0I zh1!~8+O#}?b+`b5DKj87?T-PV?1uqd87Exd+<@^XiSDrKB1Q6e$#NSWL0e6J3evr#pFHaDkL*J!ZGEHG^}pocm?4*v+M7yOy5TsB^J0W=>01=#xhQb)+HpH*Lk`J4GtIn zGS*)3K{Q7}zn4Bs-Ye8F(z>?_DQppGI(}2U4-fNlj;#koL9`+DTb6+O9NTd#(>ye4 z4@$x59M6{Gad!qmf2_KI>`wqh03c9_j$MU>#v*;13DX2+o5|ST= z-r$Av#@RjM*HQrkYDXFqe8RQ{6o9b`szj1j(HOzrwqa3~*?NyrbGYnwcf*75aCN(# z>i=4OTZ~pWCpP^PIjDa2Qk13c>La;2IF0qGC!x92=Tm0fagKwhDqC78RPjfowV!XK zCjx>#I!$wEi6+GW0zkwaK7KqKp4l&FZ>{t1jC75>!q#7tn~heuRd-byiLyJ0nf2C1 z^nA~KA~?*VMZ>wS;o9;?9rP#uJ{wgd&wb0g^9X#jVq{8_xN;Ua{(0zI3<^K3EXwNx zEYPj>JMDgR@6zGDP`S%Js`~Fz-HXHNW)6Ql`u_wMIr>#bCOQ@DHSfpoW?0Qodo`@1 z_fBlNmOsf4rFu_GQU^llp{AqiN!@D4EMI4BvMmUHZ-EUvzsnJgAp6nGL#4f2BZ=E> z;VJfi|ISRMA_}X10~`n*Z7Z9QQMS{BL1}dwJC~ii7i!0#!AniWM{qA&RL0pAj7?bT zgRh?3p*`Twq%V<<<%#USFdu_FhPpWo_q^_1hDBf&z~+}Shr{?DJ5VPln(CuzTl0ZE>9gWi7+sQ48th_0HzS81x!^5#=ck)^F53;n0wnn z%8-4aWECGK!%j$wM`dc|BmfDg9sv@tImIoHUbJ zjv+5}E*D5@kQiGWN~kV4T$SQNu0tPVu7e+`c+wf`i}`Ne7Jp0hR6x(!k1fdjk|#P9 z&;+!7sEyu$+nDx&G0iB!vKfFzdf=5+QLAEUN~B`5$deXj7VilmSxQT;0XyNO-^KV| z3vH24@bU+a`M#ec`G1f{M0{z~2Lc0$iB6*sF=g7h;#^F@6Qq=)8N>)Ak$@lt3KD^z zm^Ky}MtNP6ER<|Sfi}dWy{@e-nrG4xQ=+?9MvbTtSJS z??4!OKfvuw4prK26oVN&P+9~tnaq35XEbIRwRPE}fn2225^{WH0I}ta75d<@2 z$s2c=Z#|WKYN=&JkT=AZFOD9XsDw~V=i=}Hs}DcaIR(TXYaJ;op~|}^{ap>upNFU{ zuAu1|XA5%Rv-G_riB$z7$%40eX;DLz#~vlEMO5emTSp%%lS>AY$&;5)hBK)0flT^` zIBF1Fz^MGg{BL@Jf})uiOCQ7D<_dMT_)eDXR&Do&0ed#X18bp@d;~tZpWWJ3yba=) zI`P~T)+srt@g6eK*4P7)D~PLsc`*81$|B!XNdC=$nJ{k7RWNeRj2>Ae26d`qFwySZ>vQ!9=!%410A3g|io;o^Ln=})n)g0a zvBu%pKpvyH1!+XV{JZqdFejS8A{S)D(P?BSPc0#sYHv)P>(Y`MurQ2x8Mcxsl6zhH z^3hhv66Jb5NtV=v*Jl)%VdYyw2>A6wz3kIwu?^*KJ+LaXK~w9&0xm5*Izf=tn`Y@E z#h(KD&qI{01%HHUb^O2ii+m$M5=rbx92(ob6I|;W%W7{~Kh-G&)znbf>ys*UgP`>Y zLJMXqu|sdlL5vR`o%vz)RlFpD9(HxlvoT8jIcv1iEg*FLLeNVQ>enV1B5t;=;A+a3 zNSU_zIdFB>6)85%0brP}W@E$zJz#w?#yBvpuD6L1S4OulWS?1+bpb<*#R2t#fs~ofji;KX%8d-#+!1^KTRqcfTjHu+;exnE{8tIGZ{Fxq<+XMnVIZr!E!K`UJbQ6-J(P^ zaSHRey>orqVka>JsBSl3>SIbfLJb8CZFl#0DWF`2;fHg?fn({0a;O0ha^nFC8EX0b zU5gXS#zocbU`47X)=cOF#0`@z20TT+0T%6|2LTT~U#PruD{Pv*6>7UEd*X|nM2>Ad zB9qUUbF5WU`csDAEW(2VYzn@X>MHa>9msS2l!8?N22Y0VG0#JTOvrPRvfF}E1oKc_ zTm(QN=FCB7CGC}k>~DJF-Om6U7DH-xBM$y!vS$gkSJ<&NbFhR)6ApFH_7PTow?Cm3 zO4SXL6`pPactFC1=rQc9{KEz%k57HsjE;zOI|>zjJ{t|Zd_|o1(+T|fzyU=JgUBy{ zBvHw3=)|LV3-xh^TJLyw%O~EBl{wpM5d%IVr+bmq_+p?v`X;VORcH6JGMS50=;1Yn z&H$B3q6J(+uzEn*_K_e1>aBhllzRoaPFYw-KxX6Pzi82{5zp90#$Zt6+v-|569>LW zqUz6$DxGgbb#1ivw7ZY9wN&`}B~lq{Ln|hOAryh3EHd`Tr~n#WGQcIB3g(rgVNn!d zeg{7PN5)QV6--w>Op#r5jL(m9{OZ7I;b}d|!A!G^Ps0jyDhrJS9DkX#>7~(!1b+Y( zUk)y(-to2Z!Vab004bz)iL-&DKk)x;Qi#&=PHH9s0H7rOzfB5^4F6+N(AAE|W^eN2 z?+Y?VgJ99qbZ%~*B}opYZK>CDdUr6309>^pg1fcMlmwsi~u zuK8WBq)OVMjTNcXuI&&VwKEgDB#Ry~YNW%D&i{TPf>~D}sZ?25Sk<$4kB%Hy?u`Kx z*WT;>-1-sM_Wyb2=i{8)XY^o^if^55rs3P(`1m->_vXicR$*G-_&P6+ccZ({td-~I zMBn~p4ZRxru&q?!~-!L>C#B-$D{<1^dklvhf`z2L)O^V0uLnL1cV^ZfQ> ziyB!iW#gOj9R8IS2|Qj1h+UtO89uvTIKzoVn?Q^9ponYr$jhw;*=zd;!t|M#OMZB5 zQN6Y$*{n#Q^mL>XQFB&$fhH~D@K4pReIx-&n3E6S=K7rQHI?5;uU~l|^0yZ{IQ|Bl zQT`p!Ct*||>jTC=d@j$gDY$RuJ8tY~uZc(DdV$cH=M_ckjVUq4Uz+*iA?1NEe%C3# z{IxXKBPs)2JOB5~pU$5rTFm2F(LSD6y*EpGcz1WToM;B=!qmzxAKsh=?v58xlF6u1 zLMRh5tuh9jCc!t+WZS$KV*ig)9tjm>TU|2Vml!EDf8^uc7pkv;$Efk~o|%lU02h*o zniGN!T0z0b6HMme`27uHBuvp?H|dH(+Jnh&%x@Bu`-~WDuR^5cUL!;N9+_YM0M)|i zJDXe(q5}DgECQPkkYo_Lk>oP~1)nU4nQziJuYcRogB)3JH1PE(Ae4^J&m%LInFCB| z0{A2CNQyOBS%NNt=XW%5*0Y{J2#+XD5^;2xQJAxFY{j(dGtz(u<2X^O9CO9_zcl4( zoN|WMAqWgQ*?!KODS_c2s%&B~FVeXjQ(5LQ5r!7f3IJ>wgRp%_dhqIeQ5bK4NrlE# zNOAL5WpVgWXYeQ}ds{VMqMQG3RBj8)+x`%t{3+`f!p1!Oaez5hVw52>OkR3-JP{HF zylCmIS7}G^n&7o0j0T6FcoM^}`f})qhTDJ#6*%HKVVV?qKCW?pWyma8;AOC$1S$5w zWN(7Rkcj#zV5xX$G(HNUByycfdcRI!P;%^IueY}?;( zlXE81J3jl9;aR0BQK8~17-a2MRm68^eMvFJ5qdevLwJE-e<#N_Ka1Bn0_kYPBsh=S z#hB9Hd6WMiz6K*@m6kl&sdUK}&;43wb-Y`j%!f}z_OvEm;^>;RwlcxuM-Z#IL$LBj zNbD5?kL;vgHZzyBGmyJ}kldl7-7DYbIxu38BIH*#$dywuS01I@uHcX$=33gtD2ig++r3-2QQ8+ zfqMxmUkf~Ut5EIi-EQvweFAXMQ0?d8-}arf>l$I%0;rRlw)Vj|cgZB{-7R*}&W7C_kqSmD~=Dmq%vk zcoz2gd1G=^C38L_FjhvgzQ+tq*r%tE;-(SNO!5&sMIMbU1dz#o6|gqg&ijxDAtfiN z#mS6?mXH>x-D_>Ujl?m|Yk4y+Z!yuNbgKW3X(7dNrT90n*yDrA>%Q9lVdI+k&csWh{y_hCv)P+^dDjB#LJ@6R(K{^r`_85DW@$Cus{9FcX?O?*5 z!v;?CoUBX_Hl#cWQn0(y*Crp^G_&>|q_d}SIUKn{SF_2Fl>?G2%cGA$WckW+qd1my zNil`sex$3jjglOV`i|%%amFGR_!dLhFA|KGZS!^15w%44*!+^g z?3gw5I-)oL5`0mmh0dAp3S!=&A5p*k-NIpz5bufW_DC;J)rZo1ewUF11@UiqvgFji zOk=Pipu|a3y4;!kT@&$XHciDd?ZWZFFN19xKk#51WBVNOI)k4w&!D0kzKkjZ3MB0o z;XDeEnr3k?1>RjOLAf-V;C%)+wYjFcy!XNe8*EaQ_Y!u3QI)S9z0)u3_`k{ju>z zC%mt)U=Sk;Md;vep7+Xhfn0EI0|wuHKrDLbuHM>1r@;tZ# zBbY;JfLdv(LHu z6AyAIkU>{}+Jj)pj#>aSQxis)&>-ags7rdisBJXAl#N<{TE= zat1x4KZz^SLh6j-a)~Zguc$3pf+q7@Z`jLGBPHcH9nOV3_lghUVCU%$md>HlY5TqwEuSTFse zj5;a_ceRGG7WQ05ay73*W^9f;YV0%{V~t#l5s24i zW@hbK4FZ#fz_I280MD`*$?r#&j9{Eo6`iL+*NAQ-Xfg4){JBq_AN6? zYu=(&kf;->(_FZQHrkJ%Nz#j0fg45Ri1afc-!aK|dxcN8NqJdxRL=W~v~r0gbt*dy5d%|bSn8qURqG;#(Y-@LK`!gzVQKTQvJ6}(PWp3AL7}wEn;%$s$6BAs` z0w(~j^A&d{E7Kk~s{T);+ATC(6HHG7)y{WI*i+wWsMN4bW@gjV+P>o|Kh+fE)ofZu zT5LB&twU<-L}}BNO#E4Idg;Nwv}0k#$|cW1uSKDyK=_42I(SHEQnSioesJm$BrNtG zn1{KPw5UOsi`pquw7~>2pr)2ns|_^+9FV$Oga~nKsbsbYIgvP#e6dNg{HFsYc0?$f zzwc>rfd|QcSw*V0u2Hyh!>aBd(RHfGo{+Y$qS)r~#%`^Rvl_fUTSU+t%Az`j$I)A& zB-*UxO(&wVbi)7%E;Ax5g#XEbAe1c$HcS&|FXe>~qfnmWIKrBS4bw3<$M`r3&{t8Q zH(!Hvo?!kXZ6_NGo5FBex~h4X6^vNcA!c?-ASj0kJlp<5m%!&Fr9U&x&xX@dK6kSz zk;lvPC-asPq>BP(u1~{ac&0~%_*)#dg+CYKgEk{Q0vq&hQ*jImS0RJ_M$33Vy3K?iG;q=Af3oK3eMAS&p(^xg_!KU{@Bd89cA7X~Ewr#)> zA#=xVoeK`b?SL3JFpc(mcyAcqBF_O~i-fp}nZ{j#Wq(#cEY3h)l{FcgTBXRhQ5ct@ z*>{bNfvVd(S(16cfa`{%l4rW3{!ywRFvgIH5vKaNzC)HTCZ|C>ur2WmB$wL4ysowv zK&z%42SHAlh6o>Rg-aNtDu#AV@dY@P3eg7}JG^XD*lHyc?#507xl@udZ6lZM&%U<5++GB8`|}2{om)4Y0j&y(PnDFl92-w zld&f+9ZP6hD-Z%;x2W|v)#?Mh%N;U{FOT*y9Wu=EIqVi#ci{M^21V1X>!j-AhJ9I_e*RG(p)oOu%<#}3V z#CqMnCHm0n!8)mHDz6CfgY(``IUYMln^6uh11lz{V+7fEh8KYA^KC`1B+F$X%> zX%WUBC)MgDYk`;Ekon>%!4zZ)Ed8 z9&>!RKozu(xpRAmPN~0TYcdjNS+Re8c@sDR5tpq3_FLb*!|>5XF{1JrQH{&$&3h|O zOa%mBUL(ztU9mKPpva~{!#`yem?uVYBc;g9tq6O9^$IAw>-wU9XOQZZ+hixz&_65b zjcjT{JFfj6$JxHjruF#OYh<5-wtsD)zDv(DR-jY}eDniCd#L=H848{HTifmphISL# zz^^Xf-Vj%WF#`YynUUM_hqhMj-#M^OAZQ4S5-8)(V{!xHGF(a(3LbRBk``xh>&6OkaRzN@BM zkU(s~T0k~Im=;m46iCN+fwk|6l`?_&KMd&#BH<++;;PFGaLNGzjOkgOhm6g`a9LkD zRuINuGVcdKoF0DwmMf>W~t8HjT)Nlwyd4+{#1;dYVd7WsjOdPxh>zrI&+s5iX6SBi-YA zkRwtj(Xza5HHP(#X&PWS-xx~wOaDUbj|hm=o@S|)XJI9vYf25$j8d} zdU^PKKR%Ao$L8eZdp!<|ygSqU+qQdNq%NoY2vo^ShJhjhJ3u)NEQQSmA7d6o7=0kr5=<-OxIrN#}~NnNyYcl9LVh_N)dY z_)n!+WNim}g*Za&cq||l9m3Jg5?g?>cHoOw(VboQ03f1A+wt0&-j{LBTGJ^&7X|n}7ZbAi& zUIAS65ye_>^F4+F?jzv>S@qVtAgJ;*q#^D$OCX(02F6KKOq)_{kQoLQuedO*|5GLA zuM(J#awovzTiL4W((_1`KFCP8g<69@j|YLrGn#0lSfy1LB;th~9YyuSde&y^i$11H z0Y&g+`t}Z$zg1!9)BZ=qcCt^9E&@QFBE!O|f=uXEGwBN1(PUMb6Nd;0ADU*T(XNz; z4D{p^&{q<$?d@5kd2Rbf|hr9oxbu166YW%UR zS27OdQKd!|6 zYqQvk@?UXbJ%1qF!?62JO%QjHboFX^mvnTBwJV4i%k%ODx7y{LoTVR)8>K+BZmzgt zowvI+H?SD4&Xpuy68QfpB9fHs3P-5Ozwd`J{>D^8^8rDw0$I<=u_w#2Q_c!bt z?md!wEpKWzO1Rsj*0id~8!c>^(2vDS2w8vux{FWczB&!CTLx+m17{-4{E0>c{MXhq0SBWcdiB$|t%Yu>WTeIY~0T`AdS~zN_GZv`y zjC+?!p_u1TgsZ5Z{ng%}K^=RY(Cau=!a&(Q7IcN8DLZvtO`&6@kGj#J>a76mkv5>> zy&8|Hw+=v#+!LaKMI55SAkxr1JvEUCnch90aJd_h?@BspJb7Y2=;pPYcE;%D;h!vN ziE{uMp~`DZg!^pnAiz9mOP_u{s&#=$&MNFpuEL+5&7ev%DbS;5-XgsC#wH=5HSALr zQ$TusX2*!-6iq4s+Ex*}%~}&wVLaz|M2UUd&8wHz!oVUlAqU9CWn=n~eD9!-iFe$c zsxo##<$cj1I2g47w17p5djo*O>@06U^nr1;_M}M%+hw?+hu#wQZF;s>QmY9$WQJmT zXXgZy zt^vr&j)*W9>}+Q?X8jYnViahjUwk`&8v_90B?O!w$Pm2>V&90uWp}n{ zh*(`3^XWKn9yoWI&yZb4!kMT7(Y%~6*=T4GQYuURP8}56tcx&1UKCt)mCUK+XVV3O zdYJM7Y8J;&C1bsel~~?ac&4y4%ZW0W8N4vHC_Dt)alSzSrsM1$1@NbFW{A2F{EBQA zDvB@#6Oy#|B{U9Vq{6&;3xK9Fb^)!cMYr=c%^KV@O>nJ;rXDkf>Avtl60EO_OZlLG z4-NGy^PxWk2;~h7a1ZJDt@L~T?KM*Qn`DW=BfiD1s_l8{lSK48CS8T>uz#(WI+;@q z8^euWPKYvcjTe?2M=iA5K)SXvQiGbd`KD)j(0`Y1UUzzi_K^8x+`y1rCgv~LT0eVo zJ91x#DFGSfco;gKL|o=_FQ@;E+;1BpY?##Yq0E~Fj6y1L{!p&xWL&juecW3Ptm+F+ z0PDq&Dg5rt6hXd*_RSPs;M~OV;5`#sW!KdA@^Wg(l&oY^YG)f+;xTCluqRqr?&>2u zdr~>gV^3BkuNvSzF#Ki8J(yR)J0?cnY~X8(^wkPIZJ&j<^x5D=ceX6QtvVtNQgQxs znsn8|-K?c;6-Rbn(hcQif?Tnt_-pQ8!(-**RV7@oet=IH3R5 zHaurTQ@d@ypP-M`WA$~dz0c5Z$x{7o+O4*@S#Px*4cWfq$r08irV^v*AZAqOpynew zQ#zQvay$DpMKo);P>9JdY~{CeRYV}oLn2lJqrbQE?X9kfQ~7v^iFs5py6fosQKA6U zL7YP#K=rkpVB7PI#hz)XOa8aEDF1uFVb41nb>8-fV;^-c;Tf)Vzz@6*+HG#>D#M;z zxSafN>(fl^S-aYm@5eSdp924b<&-<>P3o9lr>Jj{lp^4|jVJ*HbFSKLF!gQRfKTg8 z#M3vBj{0p45+zt*ko8k0?N|nyBZ&N9ZQ) z;I!GI@fD9yA1B2^2&KA{0?<|;H#zBP-QjB>Y(kowA@cpJ5wsD&lTUp(rN z)(pR{Jd8DK)+*xA=H75anvD+U*Bef3j|c{ z;tn=mLKhATvG)-i*r}FAz!k)_@4v3DzOJ^eD88<;{_UwF^|}0R1NyAChM>)lrdL|6 zXyB5rHB18Ax+*ou1iPXf>(?i{>Ls0FE4#)sotT686Fz*K?K9G>o%T8GH_s!!J*+oR zU_i}%KIOxs=ew`2l&=8&SG(LZ&D%Bi`5zw#=AAiscX#}PH^;B-xw$xf-`C@i9*bKJ z-_=(5kNbt&;;jqeJRa}Q7j^pVuSEJRbr~y6%VzI~^m2m5uQhh)8O?|1hY882|7Iv( z?zCx(-$jqIG^WVXl)trT(uH?$*#9xh1b(R)P(CtmJJ#N{=;MTH=nF(XL;I>;~ zxVErOeE;wQ8Qtx@7j;7b~{Q53p-D@x!in8Em{mh2a$|FqoA&eTLn{&Dz4pu3|;IQrs>Pcv7cu2C6f^DUMtGZL*& zmuWx@`Yk1$|M%$RiWglJ40(35*PXYnQQxX7c2RB^PIv65Fvq5GSXjOM+nlsG{oyCT z^GKf8DchLIeAUW3A}jQS)!8Cpi4Hj(AS>kbM<(Q9xOR4jK+?h7$YzD9_FOEaEqS_` zV&79OdD6FYsq#d%zI`prg4Z%T9V%~QUHSgLx{IqPp8GaRHgDD6&E#R8?H{n6W)2qf z^!v6#jcppNc87C(*oW^!I!9R;xTPvMO*Pv$JWAK*5dAkO<)CM`DnhKw{CF~SI@m4P zyN+(>dinqsvUSllL}aMi*SPYx@~S%ws;4m%!!5ek7idzU1y!W9Le+orc!!QTCE54?Q(VW zeI`|$I9iJH)pxe`1l)`4T2a;Xb9t;Pb)m1*N0lZL-*a z{~mtq-0Q0;4?f4>VYP+h{+JdP3oFMf{MSW$?0b0}2LGM9E&H){-^&f^-wsy#_2~Rn zgny}XxAu1I8Dd7UX=HE_wG0fh9BqO@H*;?HO_McoZtFJ}&m8y_3()f|Pef?@wEKsm ztva;-4cv(6)cCajnU!X_|3wr;pF$ftxAz$wl8spEx337^VzZ>t9O%lDgDrIotAsfc$dPjL=AEnLgjU* z#)oThX>8dfEphUuZz9|JlC5b$`_$flNrI=e-P+r+qovrsQg7+GkMdkM1+%5$oJX|O za;SLK(zJ8Kj_#Mf)}XCuv;o}6Q`_p4fM50NY+r|xbX^ayV6W=goK8pfX3i4mqC%19 zQbw9f)e2Ls-XZaD^6~zDvFrDFxPI;&q3iSbIXT4;KaFI@Tvrh1O%!Gr+UUgtEBy&g z3WPBoK|~;E1One#%aAi-J8S1?^P6;rA~^-tH!{4#g40Zoons9r)RwJKA*TO zz_OKGT!o!KTFw5~Q=y2MiH`aVLDqcz-e3{s^aA`@L>U>mFSz9H%354zUkrM68f|Ul zaqY1N*_}!0fQrah({g!ls!D>#Xv(U39Ohf9kpr!PUMfNEqFRL_NwhBCVSpFkj5ECX z?=U*xpN_bS--$o~p_U0C31VtEGwLPCnc=V3 zdKOlr^c*5PR%Km2#(j$GteYMGYA!&yK}liEy)$B?IuESs=+%XVvUf#O z!M&T#EwlnoLw3v_p$>J5m#<^%-#y_~{C;DdCj}@R3Gn*@ zS~UncB1HPVzQ$utgK^@$2vzgL-AlMaRcqAz`!o8%-oEe%(80mCo1;OLsgej#iCKbp z7~tR(Xa)Ye^!{+!G9=V7J9Ei`USo7~>M133X#iy~UZi#AvjQ~cb54P`r{Ok{;&_7Q z;!Mk+m>>~gI676&J5i!A^BZ!!Ab7q@c&Ic#mMQv34#U6TNgaMeuj0w;2kw4Y768(SHp=mDM zOnHZJ3O=B`F)Go4wqT$|L$Km!n17HAn12{?drO<1zt7rP3o?V;?|=$G)e)ernANzYeuL@Y(Ut!_rZ>Ngd*qE4*=l@~(yto}VNlsp> z@B95cX6<#pe_u#VdN>jfr9*Okd|yyORT3eiRnf}9N4a!$47%e*SxB9BQq6h70wV9J z^`m+D{_gMf>(ZEB9+<@Or!uAb6)ufTyAYunjux7!+h52hwbL>MCrVXz^&^-%oHXIs zy&+w=;2%~kqnrEBcaYqzK|>~gr$2aLemfvz_DIJwZr;H91;ano94$`%Zh7PG)as+15{amv8`*E|PqPF;Cv!4r zf>l6doC!@i{hmrCa|@O?t%cp`e*b>tU(eUuXO>?M9{*qPMTmE;ak500PHk`+ig(3+ zf8tTsizcs%Mmu6zrJimta`?Dtp84IsuADi5#D|mB&YSpwhF)!V-ZCWxI@JyDt2%hB zQm(T%^an5c-+z*+2^W(`V@5VIMW#^H{UnnbB~GNh%IS63IVNUi%si<@mIh#u(1INq z#F9*f$c!q9GOqBMqlxODa?!GG;N{G3kSUYe1v^R3r$<7(-3Vo@I1E6O6@no$o6Ei&l`Dp!ONbG$Z7RRJyZrVjqh*xKR3I)gkPDt8O?|eH z6|9Ob$Yg?-XoXE&HpS1vXCBgB-vjih?9T^7s|f zgit!TAJn+8&;%(uaUNa(@RQ&BrK38-$AN+3#e)IZ?v`-@Xf7PI=}f9g8q|Dg1UGoh zZS&W9Z6GzC=i38`?I!()(EJDdL2pM7o^@~<)!*QlsS<`SK(koweEF#Gvv2mqkMgkT zFhX9I@t2z2NcObB;oPNNC$KWuDmjYYD4138nG!;+ZMM2*u6=QZQQpWXC9(=JDtY0w z2NiUZ^#IzSsss*NEWsuyaulzEK&+fmjYtUSB@Lw>!NAbs1;_)@<-X{e7$^^^K|bYw zLaU7iO}9=OJjG5mi0rD$NaY|cnw0{cL9rt=aR;eBYIOdFx(fwBy7yJR*S0ooS&1Vp zE0YEucKfjNRDmKupX)s@=VDL-HO?*H_=}2?h57rS=pf;vldlAe1G2%r`RG&mf`?L_ z9MFFvrO8UYN{2!s2A-oJL6cGh<5&LxnvKCiV!6y&87++>RN=A&dm!Br7bkGrjVI2M z47P*F$bWw(+I$b5yH{(}5}1`K1dBGelNC#xmgfSz09ca%yb99z);h>Sg6NHd;4o&X zmdJ#gBg3?vsXw{4l(i>ZPvX_Q-nm5u0#nSN&h&GL@&Kgbt#N?PbMSoBPxrCvQlxAhih`8d6)Id~d zl1{oHyG03F*_Y-Po5U7#XJ`7M{T)x$+n%pe6ys0>W%PPQdj(}6Za@T@D3+MRl5vJI zO;iFdo)={zk>^tpd@gotRs!2Hve*+FbvTun&Fr2p89#|L5($FM$bi~1D=DXk-iPl> z0j6}&owRC$fNOrD(@iqlOUXrhQD9-*Nq()a2@SZi)DLRw`DYnnq%&!|P(5K1v~PxF*WnUmk@{0+x4idv^2l?t$nLc;;hVH(SZ{;->#>^& zasYpCVz-0`FpQv^SgZEj*w;H`hpWzGbO^?-a|2{o!s}WO4dzy@UNQ>lY9FeXq?2W< z7d!wRkY8110S~)6)?b9&o*!>WJ1R|pfw&V-b`UiErlipAM9il0%c}(9)*xHEY@A-m z4${sF(!{95>CP&qp9pvXc@K~*;`*&F&KI4lM!7^+AnGa$xo7u*l#+g@+7Oe-W}=yj zxb!5(zrwYn7YcX-Gyr6QDlr?g|%`JBwvYmDij<*e_BbqKiHgO3MZoJb1$jb-9TFqsw3+!If6`H8W8vDu!Kd6g4M&PK<*l!;Mt)$w!2t ziCoPfA%0|hCk)a(z2*m?uVnin{w0G47pNblp}`8*NAj8sVLD=HOfm(|TgBwRV#V+G z3Wl6vh?tdL{i z?OyJ;skX=Q5P?=@^cZV|z|qO6TI)g28LUzgKwQ-C3RS?A0P2BzeYM$zb<8R-D-{Z$ zZlN5L2(EZte+#0kM*I$(%h@CR)H=1RdRZx8mq94_C$GL;W6C$y_PC>lu#e_@fjm)x zYt1r^5B>JjOdCR)TH`01Lo+5FvZR&A4@ZaHu`&4KiY8<5Lhrn>B^z|xEQtUX6rBC1 z>nl4{%}h2fc+G326(S#TBOmcC(j*q*r!m9jmUpZpr~KgExQ~oF0e3&EU_i7YZeU`i zG}ILAod)`0UOUKV>0|9RVWXS?jSo}NYA9W7fZBmgUK)j`NsxwZyJ#5jLR`om%IDEW zx;OhN!LylQ4WxiDo7o=1>@-~R(X&h6npds|*qDn4**k!@FuftZoLMj~01Nto|9)1u z8xdMORFhp~XCt@}Ebd(UYXjIYt}MA z0`0s3ySoNU_suhQc2Y607S>acWiRic$9od+SI{(TV&1Ry8*hO45zm|^WjLKn3-GIEeD%tN_tU-==g zV&iwMqGNc;w$P{>vR6$VIl1wQw364CC$U6!0y6op5+PG^h;&&u7W}(6jkDCnf^jI^X%mAozcJj7i@bc09j%d-+ zNw^Ss6fcRolcBS$jVYLX#s_l4(>(Xt0T4^j#k2@dUJ||oO{p`fnQ4EbEXUFI$H|tJ zeB!k17@y5U2>VoHKW!=9kyLe!Lq&pN2i9O<9#-}P5#`fzO^0Yzfn!sVMsMy#ga)nL zwnR{hrc3Ers|he%x+86pcemN8UW#BU_0ERM{Y!q&Gz6EmJv(3dt|DBLEKRqQvs1*c zMgly~BESLHqa-i~(ePu@ua(TBiJ~$QAHnn(4gS9YBjjh!ywH*oS&WErXU=W|PGoua zhT~uw7naN3mmX@N96!bouOJJ=DcjWC@`Drxsm{qM#PpOQFFAbbu&3c zv`LhnNy*gEL$WqWJJ#lHGW+XLOkm;E4U!xVFdgV|BC0D0iKy2Zc%76+4*p`53oJRFAL4!T3<6f@Lx` zrBgK}|8!QW)kRdhLM6E%@mn}}O%Wq4kTM*F70YUp72ANOR}Is$T4g+!N+u~*5|REP zb)&|hr9%y!%YT#KH2{2R%5oA>tee%~`iI9l-W?auZ!=#Dtk+F9kw zY9?dFwXQO|(Ii|u)M~01n}cf;ho>eo1N|UcowD8nJ-ZSLgr;$k?hbIWn?g;kDWE7x zje5UHUW8cj9JYEamdh_kT!<{?n<_&();lc-M5A7H#d1r;ojBSOS@gP zRoD$3j5_h9Q2!VNy0(`?$dCX-v)BXJpHBhOBYfv13W?3mziX{~k{1Yf29MGldW|KsvNTL-P zP4*R4>P@loNl8inS-h*-E3|VF_EddI75sN5y@)L>H~^Hb2o!i3>T+CXT>{CB>?K=i*m=RXeHKy$bBugkqg z1y9{zv$El1s^G_e8OknC9hn7~OqQYuNiyjRyt{&y%Z?t0!1q@tct&KcC2M}L2iuZsziB*)6N}R;6*WPI{0Ln zrlvDy-mHupHz!l>a^X%WzEHGR+xc&C0FSzEemlKM_>kM~?hyEF(!LA8EnfQBCO5}} zI?xsqH`b_ocNI)mcWSnJ)QOR3P-_EQ%-HHkn+a7OhgkbV_}HYL<`kvHp%>m9127e2 zD%XRxY1;=Ea$L2R_I7@{CDXSn`j2PW$n*H&r_tXv+6U{j4Vc!$kQ1xz_RMmA}US~b(BInXcaK3g@kntMN0jEJK|dK{0|WNe1c zT8>Jbx?>ING{oz^V&|fGTpD`y`q*XK;=fU@=!|J8&2Gg@g_iXzEZ4t~{sBk99$|Yp z$J!Qj_0GF|&{5B|K3NJO8*83e`F=%pjR*gII?3S89}?S!+wx8gT?Jb1e6+s|b|TY# z<|X#vTPYFsxWp7xVO*n=UN0Kw@*az@#NY0atp(Ju=ldkNa3m`RJD~nQ!p$f`dxzigx&w!}ttBuDmDz+4Q9 ztj#VXZUk5wRWzkrXF;bi5QWqz7Blo_5w6WjE=d;?U1zJnrAk;TPDog zMm=ydV5nC&+u3EW7%;HaNB@ng236abpK|3dLJFHhOJR#lGJdt zC0HdDVmp!ikRcnzGs7?&m$77wS3Ylke0#@~0Eaq~o`MudDXOiN{kcW&WZTUGrlvr? zG!7Mn7nmS{(Uh>1EQw1U5VP>s~^9(a4!>W|BY;B2mIsB z8}D_79k->e8p-8opTCC%S5}srd{YXb^0qJkpCAVA~1<_Cj6Xep$OZsKUc%(j&qpc$HvuVPL`eZe!Fk=9o~8C&-<{5~E9 zkd&bmt77>SSSpy0mNX{q} z3wak0k#lK%#~$2<>Z@4UVT29DWf|CG?HG6SuivdEDIFu_IR2w!>p<8Jlj~J1(~W)@ z0t>o}M~&yldI2VrR8?F}Y$im;M#nx?@{s7#*o_P>8zxxzDM#u6F+lry-O zh!i@5rREfo;HlNTPm|4wl8s3dG=|f1LG%HcVcejWk%rt@JXhgW8xr4ow;lwl(5rG0 z!je!;ES*o&Nt@S36@N;mI&-5RiSg8QrmTBnR2B&O#;lqS`CPg7SLa`92TDWO!tRjF zZ}Kl&6f}CPw~+2OvT?fm|6o3_iH>@vgV*BtHo^-#%STW$VP^KKg=4O@i;Y3PU{F&1 z&7}8}E1#g3a@Y25Md!wPvH}Zzx4RD$90v!r=V;q4*N%Di&$5+xE!`?J_ae|;wQ&{y z<>Xp2f)cveyn!Fw*Sm{l$O|WhnL(hc7@EA;pM>}|g5KTi;2_bnhwJ}2UjL~`59mc< zm3SF5v-t3{;hG5pbYZfOD4j}vocEN^?*rUv2|a4ad+r6>6r1-UfgB)=W+kXi7;vg+{+ z70pF`+Ep^hC*@EbNr|}Fhn-RYiNU&(i=PO#kD291LRU@kSt$xgZ8C%SWe`}we&o7& zs)>>+@|&iQuJNl7bR7C>@CL>9Do`#cHP*z+oRUZ#YT4c+) znP&$>Z3(TIbu{twG|AyTzsr9(D%8tOcG^>hi+4E;(*hXsHTfRW>DmkoYB{gfwuGya zxvh|e5jWAe{UJq_pPjW&Fiw2mo(@nN)2Yt_JECV|^7&bs;J*9F&HYBBzrQH!?nhPq z&BNrUo6Y@My+6`~>iWUue~HD<-`0KR*WPy>7Tucwsx~N_=mZh|odEkPh%m3aQi}2o z0b)o;=}*oy0kz*hw2tDCub(cAj49Z4ZICqW>M?A!d2xarq0<4IzoQt?@4Pbuy=qmx zTCA30SDi#?57eqw=G64#dF)aLJ@v-oX+o!koM{+gRTG0E>$dAfZCNQ%X^mMAw%oFQ zaFf}BqIMl=CI>dyOv;M;&(f#?)~|EQsO?-sW|j$_1kVkEwjXN;pB^>f%-?$fY7DQMo|lhWJ_|n50S7OyvdO7Xv#N7B0*zcfemA)TQHxU%>yF zWq|&}peO%OuT4fB!X?@Znua2pUjLB!^g<) z;_AVOmC8Ti^G6Jvt@ox`{g-7|^X9BloqeMjy4$npqB(;2#Ko9StaB;~p~LScs_94H z3UTJzh$SPtc$+&Z)DPPDu~^EoxX=N;=w>RR5IyKj2jHK-W7x9XOO-RnA2KhG=*{)J za7D4NKWcffL{7nclRPrY(=buYLl(XEoaoBvOyI_MhZr5jj%Ec zevLlY?+KLYkc%09(%VY5IR>YctImv#t&Izdbp;YzfSEDGug-3_&->>j&HVCHA?vCN zpZwBgk_#41Ks*XQMiE+D6FF#)5tcs3-q_Mx6H*@cCo$H38kCFgPQW&a?9$UE4drFo zEZWH_*q9?%@SF;q&)Q!HJhwF=t|1@t(g$Aez2PHF?=tHks?Mbmm8j46@4-%0-9cZO zHp8Z+`5)alRj7MWnl=HOHQ&REmI^NaK)Zx<)}Krog!!nhfZeqM?umcmLq+3VqkkB zWjht<9t1m2I;yIUWp9v7k9)`mJO$J%Jsx%Ctfb@aC#+{HArLQxAFP4P9^_{c-2_+2 zI+sQ-7!|k@Ez%DWbfu;ri zC_p*H7eOLk%Cp%B4;o!5|0%*t?|v{oG`e@k=jv+iIlh*xu=(RR?RNYi3M|Y~d?M?W?-6{!1;0bIIi!dhART zhSdtWC%|Tg-U9e~v%Q6x#F}m^+^B4ROw7c*2D^O}28v~cqR3znEFg&Og)P-eYEylK za8msp)P`{60i`;6AX5h690t_L|HqwMEl_>=9f4h;qHA(=1=l*gWCn{7#f4hIe?ocKRG19_TvKc3T}%9;sI|3# zFe5|IWJXD-wL{3gR@yLa9{I1KZU8jzNd>SACeRkUlHnQ}4 z8?Jk?8J&r&pI1eJLhD-dUfbp3iiuvaRZN)$ z+=?!z5+X26?ugZ+jUCBBicmyr;9$3RXg!Fj)nn1D@O)h<>-Cga8)0o*Un97L$nBjT1?p*&Z8Yn&2SDdp1qirc$+P~VQAreNk%hfscAH{dCcs1koSeQIB`j*g!QBnB#l@)HBJmBCeXI-+i5M8D^cnXl}7_z~M}{%O(S^GtokK`ybU1{v#g&KVs0kwE|8wz5d?AhW7c0$)jk6Ts@1Vy9c zQVMqPZ6ce)*fH@G|LXIg=rUnQJK^K-!TsjFI5@zCv7nK+`S(Zua&>+keccN2y&m6B zIo;pyt})}ksd@i;G7cDDe51|`LH4>*)3OE(;K^FO*Bqzrd33O#Ai*$1>)mHalT22z z#7sLJ5*=$Hw&OSFWZAwMOb&eGTd+ex#3H(OI>TnU2aCZAj(YlG(wuBZN_0r@CX$Xv z9ghQ=^nAe%L}*|2+7E1~RDOfx_;*#}wk@I(9E)h%(q;(nc{D2+TamWOGhYr+g9rua z*bYN)-C>2g;c$|@oG%2jo0`g@lKjK8rdBKq0xXP`EnV*sImvWLFVck=dW|`7(_+=R zzVK@OD{igm%2Gwyj>AFWV~y_02EuGdo1qxJex5fj^4<(@gZbYc()zdCr+$I|M-PGh z(?bodVKmA>003EF|GOSyWc@Ea)RHn|i_C};^2#%k(iJr>vm~^fEJH=57*8NXrBbas zHxnK8ThIIM0kR8(Mx#-Gi5<^=AlYt922~hRNm_lFt%L9P%Hd@0&awtodLGnVYS3ey z28d-SZCM$Z)5Cj#S6{RcWQbc4EhS5#fm_5q{j_17I`hJORn^Uo0rTilX;@?!(~SdL z6b<#XpkRDVP#s}mG(a?KoO_w;U)}+a5w(IDFVpo_kgycka`LY;XuQ^g$F4oV%_8}@ zG!V2q;@m1x?;a#3H{bvZdNfNzJMX1VGnwVC;Dv)yBlU!k4kh%ZNGv)7A|OCqwLWH? zK(YC_!r%K*HR`NY$6tX*fy}Z;dZw#ozy0i!1Vr4TCUvzqM=9&PBy~9!R)Hv5QJemq zK_2z^&X@VJY2j6#eRAzfa%*EFV5!Xb^7t~_QM*?+ABM-u7b0%|dqg|V&(G57M}{$=cZ08EzANsGZB$BS$#)*QMyz1m0b(l>U6?Oha4N%JD?Vs)K-fbx4( zBcL#jo~YmPAmQ(1D`VJLeLw~HqE>3!?^jyE$ig>t)0nnk5zAU|xQH_+^ol$K^}xOc z?tYnD8=a9}o}4+4(z?SFDwNNDNVIk$vIexM1k`J-^BMXcDG(H3eZk1K|@#+o!oLl zh!LkpS4!D2CC!R!E?d$;!!WdUz`V3_UFHi9@nL!~{Yw5OzUv`kCQQRHX=?h)yowqn zWFYE`c;BgeKg!psWpuKcrl7sQPi%bcMlg9O(JXyEejUf@d%x_4k^erw`FT644jJED z=;h?;to;30*y-Byewz8p0)Hy(?)G|F5Xax~37O00`8l3EKRJ@WY@VIo8Oy7dsZmur zZkf1xO4{tMygPKluR4}WOR1RifC~xgHSe`uym~_R`0DX&Vk74^{&FgE`b$qXr<9{# z8RMy#^%vFqFL#VU)}zRYr|GP`v$8%aX|J8(#NwA1geYa6 zXbr>6^8p92@e55b1+;cn+U)wu>J5Mo6x1WvzYuus5>LrxjqpcjF{B9{p0VRFMQNM7 zY|m)cFo*qG=AHxpS|q^~_k)tg8028+EsX=d_J5a;>!1Tj)4PHkWvU|%T82EV@-whv z{}lO~0hA|#p?HdK%3&$jM$y5Ro2%MvE2si$xJ8giUoordvPteFcR~Zs2D&G+w7`vd z-SURSA27evg%~DBE=f0pUZlw|IdUY-7@G}?urt@K`mcgmELumVVo$8Qbkcd__@|%|@*|gqJf~F|sNerlCN=G37?-_b@<(*2 zXI{4Y^Z`Q#LOiTW5d<1nG$D?(&{Ksb$ct$Mu*-?2(k1g?Aipl!4HM}R=*xRi07u#{ zU*JQ!kj93GCb?!c-slfdYB3KD_jj>dFr0ia>qliF0)Yn}FLdGvl1dNBs6v-bjst*D zr3C>U%hF>Lc=CscRh1o9HA5SGu@JB?;b5l=86Y^n9RT8uhBkGcV!L*o4#fleXOTUm z42Ic}SMBjhf+j=O2lFP;$sNFP3D9?m5ZEOgtnhdP#PW+B?+p}pK8-PmD-{m+mYH@U zrg-WAhm5GG7QNox*@cifC+4e{95XF^zp-^=;A&sl`CeLI|m--DfHWuTbl55JG923W@BJ$5702TE^v6{EQC z_v8)^*}~$S1b&Z^65Od-f>sC=Q1ijTR>Tj);kZQL)C!KBMY?_IhZ%|-iE_RdpE3Yu z^QcL>>54r$*aEQLYtMUg_-T}P+oFC>?+eGxE-arustQ1?eJ%}a3qoAtkiHPicI-$~{fu-tk&W=w3kt=Z9Ps|+O^*l&h@Nu$&~r{9eq*mjmYF)CoZmj2 zE%wHOsHJ>x{!yeIg@ft#Boe!^ds{dI^W>LM`y<5#hJ{Vfwn_GKY82-i0EGk;Sf02P z=KDvus&jd5t1V?;6Wn#1i4AVgL_o*drj&ET)5|R?j_uY&a16krmaJK^8*(hsa$lWj zMsm$ShIJZtJV&UK6N!?d%uX?nWJ=Aemv-u0QXSlw5?C;*TXntn2?dR`5ja>Ada7b{ zL%dhC$mxw;H^%i3kK)wxU@};!Luue$c*7~UWVA3$9vy)XIXF;k!_K2^e{-zn1$F9| zH5u0VKTyvI*eGrQ$8Mk%d1kAA-?~Ms5x59zB!?Nk@JSLh+5`Kg zLXeu}#0+(ZSjfgq; zf-qds&QIoi!LyaR@DD>MrJ1zRvvC|{K%Wik-@-0K;J4r;Vkd(<;ztArI#u=;O>tIC z_$*KO2;NG962Uu-(lyHzv6k0x^hZ8!zxg6=i20$^r0A3(eUz#ShNPUY>U-!m#|4~5 zBduR7kI6Mtz)@@_rUq#1V^iXA9U6}I&^I_NLc>&x@Y&#eOvgpjZdI9)8H7xyMnb&V z<)DRWYu!>0AE=;h#Xco`xe?!wZ<|$r?wsfu0O9zh?xwY@S55F}pU7Tt;s!A#Yr9s0 z?Q0TU@sRU{DIznZl-apJ_Y_b*1+MXo3y&M2zh0H+fO=4 z(dcc(;*@h5A6ckxzB2W+AZ-JU8LPd&DswY1Ib9T05~6xFfR&XMtNmxuG8a=k+=pTT z5EN-3sFjPT;%!Z%{xmXDMWl~0N%=vM$MX0V*w}xrF>iCqr| z!E9<9kW7Sx9fAtkP^uHgYLMk$mB9_u<4C2U^h!+*Ol`x!WAX6x*o_#D;!8R}T9-eo zd3%xMnHw`@*e*TMW7^qexBC+p8lEAwr$ zU%y9#(@$n2>#>Tpkf3;Jq6he*dLetFF=&#JZOI$qWpXp!kLo{vDNx~S9mo{&alcCG zX3N{i>}Vn$6r}gV&qbAX0s_b~qA@-p$+c2!#%+8_H<01$rMO0zy)akuYXotw4}+?s zFdhh*xgsbyV7R5M8sZl7sHRCY=417tf~xJFh2BTpoUUE{XvfDg_BfVhz>-sG_psH( z5@J!o%6d{E4Wk%-PzmobVGNQ6TuGqzZlF`OOraB#PKYt1xUn9Xf%9VGpfwxs8415n z{bJW02+mV;z;6}-2BUO6A^idzae7U0b?coPbaEkkK#CjG6np<$$&A*Z$YHw}9;{Z^ z3@GVT&|2_pSp|YC5z9%=r4-;&Qa$OwehPLy8)QD-@xl4=0k}uez`oc9Siq2#QLg!-><(#a&g}8b-yq8=59ZL!*Y7) z9!8rGRsVXY8{4MLLDkLaptfwm7#?q4JVb=kpP41)oL@+x{cluN!7cSL$zhDZb1m(r}Cu|4|tFuj&`DFf-76K?W0xaP?GLq zdli0mm&Npx0%sI_&S~hvgLhxjl4AX!qCGY;=YF_%5VK!@Bxe z7YyNuY){|J_vzF^M}=6PPK=6LJE-GhjF$I1oxUy<116}!rtPhlkRz;qh36y$@H}pVp-Rr_1fMtHKK%4=QbCKM zCar0+Lngr6N!@leT2aSBuS+9aDh`y&49_b>Pa0auQbc7Q)wA@n9T0W2kx2I{4345 zpv^VMsAmkNVpLv!;#Y$?S3%srMM|@{06w8kg?WZEc9;*#Ko1*Qa+Zj5!Oj&tBQ-(w zM-Ct7`j*q=e02>+#?iI;jEusYtFd-plq>#2iqK+@US>e}$@3KHi*w`I=#xy6nY?{! z+A_e~wc5=nGkVR^Xw!R$%}eVYbFO|y+QpMi`E?=GgTYc@m}|9yH1y5w^XkT@WcYR0 z%s01V>&GP?v~w#>5J^OB1}p_O8do~F{)p)cM~|*$Q4_eCO^f=A=$ibH>GTt^EUBl- z!JX0j9GINJ{(L9-Jx3US>UFbvWg?-3zk(b>h24-=S$hmoO*S~9%hpRbgY=a6<)mm% zReo1;q`6Cmp23FcNJyTE0Hd~&HK?i||LT(5Y@Mk8c=04~PiQKY$1*ltJ(iX7v zCo5kYV3zd7^^>#_%BV*JSl|TYI-%4vmCA;cRur_772|$1sSSyzBv(`~jX=59A9X`Q z6CLciOX4QO25N z2`?rO=;U-U1M#&?JXZEt(87b#rEz2wul|wN*6%kQI$>7680)P05vl!#C!o5h<179LNa6=Ya>kWZW76Z*`2g=Up74atW%tTs+kp3ms<1;TLx+o0 z78h{E-^Zy8sTD-AxEY_0kVa-+efE`=3wK}=y{w8^zZyVkJ~@G>30A)!L>aYBl6{qn zgcF))s&f?jx!&l!McGG`IEZ=iE56!!O_1mQfGD;T17{H6+>N{$Cy?ihTpn0Ez@n7c zIUt*8T~oote02y%sJ)@Qp>{?Th=QXgPWk{iiAz!4eZHWd_yp#~fPyK}NJ{{m!FvF} ziO^FJM~>Q0ZW7}tMwZJmF##S9q~_(3JDl0xLfg=L0GA=7+HBM1WB~Q$(-M8`GtYT**; zv(M-k>Ny!_mvKhUcv`DPP1nyxrFw%HD`^kw+3GJnLjl60YmY|@CjCSJ5ZgMAq318M zuvX+*pI&D>UCZnLD)N&o(@vy_Yk6r%@OF+|srp?355bPZ`si-xjWPl^@$SkVj~e4w zGm?wsox1tG4ZH_>nz$QcVyyc59A|H%h*AD<^EdQh$!?cGzp4;{prX@ zB3|aEiw%7xoqjx_hd4}Qm~y_y^O~h62O{M9O`j${Y|U4sTl7KItoLsp3v&61&4kU4 zUc?2ajI_dYLEBx@e`e6ljwZDh0dg!@&85PD2u<0w?yH-p_GZy9F?oUEcuIyzMSD9l zgRSEDjuHC~v4)nPgvVrO{?gIhK!M1&BpS_zbNv0;YZ z%sFvlL8I*P5&0$tc{HY@DbTd7p~6)YqkH#Jt z0=m+GI=WRD%BL&!~UZSj-*cCX17WymbUppve}Zo zKZ2q-&23f|FDr>iFVn@D1IL;Z)2Nx#h#bkg$wDx@eCpeojD9O3Jit;dpzpdM#ul#y zsuZ6G zohPOQGN$ZYOIK02@%0ZIMqP81j{8P9v_0GfSPFVhGu4{@z>A=r1Ji;kV-mh@n;}_Y zk?;}Wp@X)Gw)R37?i=x1hlc>X>^&?ht&BhrN@kge3064XZrk zDB0m+oz3elaAq`iFez{#B2MhRr-cK%$EwGdt69cN5PAOVM(9Up5B9{%_NMPvgp(s& zkIg3OlFgpM+0BDufm&DpCUz$uEr&)#rl@YiXGC~xt(RbcTOfC$%pxbUED#uRdD_;m zU43e>WDI4DwAH&Sl?*R3KHKi-V*X`gL6r_1ts1`okOI=Ui&PCty^2|rpQkI-Yd@gLQwvqTRIEx;Ua9L#zIwfzEJK76-V|9U# zJDbgwa5XVI6ewk6e918zXpYD0JNyx?Ymp@YS(F}s`QekV->UzhCyr@>z+- z$H9gxP^XaUXIk9C=QZpVF6lk;!!7I`%{r(dtZK(8xGsD?o(Y#LCXxVw`x8x6O?U;R)xf_pZ?i(=tTr35 z9-fzSt=SswqpiQyHV>1%Jt=zFsZ{-E^YCMMY*}n#*qd2*b~QeS$riFf9RoXj4Rwqz zS#B=v_dY_}3KKL!k)pcJcSXewRi%Z!2Nizpj>;uI6*e?hO=IuN+>+wG$T6^C_TLfr zgi?!_lB!TSxw}G}qc1npY&#;`slXfZ8e9H8nHeLUW{twwh1&63!```yi=ouhMQ-3(P4EmMm8Lj&e(}(X zJ27HQ)`i;J1+v43;(C@H0rG<&%yv~&eFq&~5F*1K#hu(QwXNJ;JW!$K-eE@P1sDu?CV|l&0%fY+gVVf_79wmLY)+Q}w2rJ~RxL_w< z5gzLs^^JS%0s{Jl@Q~iivA%ZX6qCFdPMHE;qkiUuv|qT>r6d-hn~Q$<&GILlbZ0Z z#5b)^qy;UrZo@Crf1s82Pqv*0a(h0~Y(Y{5C4#l%`)qYS0p_r!T~dlQJ<{f3tzZDx znizT3G-sBAG#)TL+URWm@;9w3QBPLr9~r=HHgtV~w2K)P8|AP~+)YhG?ymIfFmD97 zR#_}`up|`kxaFV(<`f0N=sM>~zizLBuTvto#DqiQ1 zHItO(q;KIM(RmRq`vj)I@fn#UIsCAy;`zrC{X5M8?b=`=X8b1tkyF2z`j!H^p1%A9 zFX8u%Vg{Me)$0bC#vuaLsY6_rJ1M_DnY(H$3)x<0DRs{{P11Bsj&y z2?)%VFF#WiBK!@!Z!7-&P1Vg-!x(5J!`|Tbgqp(+sU(M18{3m1qbn7Q7_*aXrqI2{ zmXY*x)=PJGs0bn(kO#S4gHzRcVMRGl1KX<*9Nm*$Y;0=RnW#db! z04;g(@nvvwQp*Qcd&1kn7j8#`k$Wm#=ReMjt@buB6)zRd=^r%Zy4CgWplP(UBk9MA z_~Hsz{ZDoITj6~i@9?q!u>%^1u?w+FDf$@eNR16b-ugi>j`1r<5BCCO?}xbKofJ) zCY_7}nAz9Igk*o51(K7p2jf{=pQF3Im(jgnQQNQLqnO)Vd+vd*qZpUUHHf6kY;(_x zv5&4x_69^GQIjrOw-^Ce>M$MFO)?t1cA%HM77yBhkvFINu-@)hQbdFPyARV{*5Jj1tbsE0*|^%nNQdS<=h$S`B{sp! zC2a#aYmRWygW2U~-4hat6=2{Bm1{?W7-w`Ms}@Z~PZ`IRUVg6EFJx*7|RDCztf5x@s=%a8u7C;e9c^~;IgsfX8h&)9tZU9NdP8()8^O1w+~kmEf-mt$Y~(tgA`(r?T3V&b1@i=wl#5{FvB&)OehHw1Dv$I`T_6izJu#KG$NC$i8)m z()G+>wl3+ZJK}WxOXVjKdvcG=cbT)hzy1K;#a`&;6oQ=0xK41{>@w}GM5Vgg@obT? ztY4YhL|~?Pk$UdzMiKY;Xe>CjrNTfMJB-$M-wr1V8^7KaKDmmX4X*`;aPHEiJQZyM z-67{e6@TxMe#;YH@QeFp?6OEls&92mCG00|LuCiJLzWc)uv0J~Wh8mVg$$-sI|Q&h zHX;}#3GAl$N@r`SSG*b~!k3x=w?#g+?W<&BY#%{EFXQd4LVO);i*);hHWbkk-S!<> zEs@a|zfaOA-{|w*or!@`qTc|pmO3SSi^e9&2v_2Nb*$}1UHWHE=51EijB|W`jNp_f zib+5Fq=g(`N%`Vhx*dPX31DN$2{^_kF^JM6&1&6X-+I#ULmABgL~9sCeQs6|L>!B^ zMvm$5b_51tN$`og0d&7JFTsmP`N;F*&|30*GgKl)=a24f;27St?FB~Y>@IZDFcj36 zA?6mP>>dlvx*hMzYK&`;fbIpWDQ1>1)o@{oBxyO`ct%<@_WcQ7`V-uKQvSW&83soF z(Uo*cuDql1d@C57&XVxahpSam$(Ge^PTJrl#T5$6;oBpH#3T_yX+YmBX9&5IosMxP zm|6AGI?a&uvTrNcpKEkQ`mjC*?+7vM7jLH z0Bx17#RhF4TqBwu%oESXfSJQP*zb0eqErjJn<|NI+c_+msK6zmtCo$fZRIt`CY-f1 zw9)3Jqejf&nL*Wl!UEwYr51GIGsuhbq^pbHdrTet>wd?pueX{%l;45yo}9qDdc$h3 z)lcFza-KV#NN@-br&HC$4BG-eBmZjX z$EW5-wOcPjOG{YMN4`tIQng(`NcV=iuBEMz9Z#Vqo2vH=_!)h z9CZ}#p};A?PTTbt3~gb@&OREFFv02cg^tG(L+I92ZwSSk0g0iV+ee|!VGJ9ktEzi~ zlDO!S6hl^G$1{)W0PfI_!maCFg}siNbL}Y6r+-<&gcU}#xJz1#I7`I0n;n3&H}LDi zeD+Jt&8*41OLn zWwpSso&^X1Pz3V-@kTNJw>L`VKW06If758i8itZ#;*!;?79IXnLRhN?t(xUhN0Bv*!QMZSw6Q8{(JBbe_aWYv zq6M;wDQ+;E29qkASvU%!=Fbj|>NV?2=BC(^<@%O6vgZf59_9=1^&x8^g@)&(t5eEI z`wqow`zkULZZ6q>@%u?SEkcs1(rSvj^OLfFm#x0`Kv$QvDFOPbApfHDEEnKz#?pc^cuPC%2cNd7Skp;FEQexXV#G zEI2nduvFq*`KsyT$aV6>Cs){ccprbc8HLGxSH!)pcq!@X%gu&j(VR`4_}qMl{noDY zfSo~pO8)8kybL(INj}&~+mGFMZf+^~XPW8T^>KBEg}2_w+)(vYQl z4Q);W4pGS1rQve9+>xgo7WebaB|F?gC1uk%X8v00HWxfegnVWF@OB+`*Y|b4H}~^= zyoX0ijR7Xy^!TvRSos*1mR6_NliB;>ZWTFl((|uw>-mv2mecFeqQd0sSh1u^M3>Ja zxl$@}+$3ePa?Cu%Q&;z}eNLn~S+t^ZtUI({l3$5`<>TWa1NTR6-R%C3E59w zv(U5^f%-wWbbW65_MV*qE==F!D$RO;+Dd3Fwtd z9EVP-DAWa$ITmk68%db49fKXEQ@TR{@fGfRgT-(dIiiw1N`3K(29{<2|?4nd<+zxF1U%FlI#ePd(vcDG_ zNp*m?h2>9^C^N0{{O9P6&KTQ#S{(C8>B^%F5~lX~{q-f0Z(|{oDuhWWU=;3Dmq=t~ z%HcAZS0ZQ}x>`e5V5b8YS8*CO_HSyHdv{*f}BK2Cukew&&r86eGvTPFtw0I>S-j@3Zu2paG3o5 zKN8hd^~+QB=w7Qo}TtE$F|{4LQExhA!RSlJRHfSaEg{3Hroyb zh9I{9?q)2ZJ>N z5So*k4Zc?vI@M$p=Ym=hQa~y52-vA#IV}kw;+r2@9jh)nc9M1COMBvc@Pj=!u>Y)ItY?It<{^(PR%u90V!o3~sA~7M_7Kv9 z+eWf1nv-cJk$`*vn2JLYd{6<7iW}%AT@M1o{PDzdaxY>vM#TqEaDr(0LkE4361v$^ zHcSo0de%U#LN%~+0i>pjn{)se@A4FJ;>f-+^(hhR5;9MNwOzy|RUb)Xu8{YvTOYti< zfPZ|lb%99D>FO&LO=B=&p|b`*Sd7T@vF1Sy{7SI=5X`m|f%Rl%3rJ}s#KfWfjPKf* z^g@quzJS85owclE4-h*>PKM`h71ccvqaO!_pC!ML>w$RvzTAhCM8Ow9%2CkDiDe_}=wgmkQnit( zp?TrC7%Jd5{$b}Kki5d}(ihWE4ysHJ{&-8v-LH+kCd5uE7n3Jlr!t2ZvJf+!xBLYp z-d`$1%T1%I)ONViQNIH6mM420lL0)(xng3^2nD9VcMZfGBhK)@`|$hMvOzJBl!0=y z+zty|i;%VPv9?^usM$A_+&t_!+^U#(-IH`6EHA66DeYvp&Ix0Wa*cN^$Oi9_@17Zd z4Bew2l-~ZjPgOoLtG(I#>TmHWq(EVJ`t=RcTGprsb+ZrJ&Ca0GTa|N6*uqQxO7joz zc;<% zv`9|;{4WaSkHR#U;w-WkY}K89ttcY-Q*88q2s?*hQGhi`AKSKV+qP}nwsDVb+qQL& zZQHihx1;C9#LT8Q6}7EZRsEUyrJs=TqKu6O4;vp9<3kL9iNO&qOO=GZ9Rm7g8)Z4n zV!v%QgX3Wn?jd?a#`w`)(#zP?JzEeC@U1aLm`tl4*9b>O%0Y&QBp?p9u+70wyDsuF zC$c%x}zP&&tN94LnVcSS~bnNeJez@O3xm!nxYv}Q$6NUOcGW|r_(rM zDe&x)o&H=#?2{TubCCtb84Pl;?w>#lsM+`AH<)E1CB$8}b0HZj6#;N~{F5gpfs%tN z&6=b)d>hPk&Cn^BiwoMqibTj#H>uzW#8_DX21Eez$?KZi(kWyZ>nx5^87a8MVJ5LP zz02gq*G$it>LbZ040^0vCI&v_4)(8nkz#vu`3w2rDkFzWQcZZdInCd~`PTI3 zUN*?_=w6I#3B2v?uKhcR0~6t+azxd6V!p5suZC33+LVR%}o+&Ub!Y+ zASEC70N3Y$uG}eCLra*VGQW*tSAV&H=MN7)a8JfMA%&A+YI>f@5|hMWpgJlQqn_Wp zW%J>#c1M85p>qsZ7zUgh#Kp{-Py1T#SYcdZy+uH(dBO!e8JbEAkbg=b*UP^9yXl@ zG^ML}6PZ#&MGLX<6wfVcm=pv$5zk0PZ^0N#`#v*|aIBvMl{(xNnr=(7ZXe3PUP zP-bcyTDd3I>)6(U>eq#O5zPS^hmNMig<+7-HnZ3kX<8iMu?p{c(3f>-iYZwD<1Sd{ zZGCHGS@+)F;}dV6#p{TtN--cxh;K_#?fXWqbiqoz#UFvp={F%eI@*1@(TWeVKLnf&ld}(i z%=cYUBs5`55QTJ;yQ_ZHScA4y28y2g#i~NpY67J}L*?YYaLujW6}?NJ_eMT#^EE+c zD4&~4OE`dP;tYk*5e64A9r#kft|ogp!vmZ)^G`JNNg- z#)nWeF1};0qJ07QFD8L6Zv_btQ-OLJQo<@zUcq`;D zWL)2Dp=OkK0$O$lQu8BZ8o4~(K-J;wY^jjIKB{Bz6-*IfZZ8; zA5PG2xM!o084_p$e>bU`GR|s$9p{)@S|(^LI|#QKRfNu>OP+#;V=d8J%C>mm+}oF% z@R<|NxVzdo)6hTxl6JO3yo9FX+vHrX?YeQHmITxeovgS0Sm-j@_BJW0DTvUvu}?%r zKNMj_(syS$2TB=~bK9=fa&_u*C||gMUEwx`4cFiJyB7v##sF0n%zkU{U2;$n$+{~# zp`$n|SDfpGiKl$Lc(%uU$pUIYD9_cR9ngH5w!6>o!cDfgN`=_vLx|u?vy9f8;_7 zAqaH&gu|Ln*-`~ip#6Q9y5$8uS5&ja!ISsZy(l=?l4elk9_-i!uSK9kAE}sOMJhmf zpR;|lZi5MFI^8z=+Ks!h+C^GCFL2sR{A=*TdV-EZT>s0yIqXk1xYiaBcYO$~6~&7&0RS)d#W zMy%wnJ;^5xgM^i-y09|5PO9?>(|uoD#dR}vf){qW);yxQdM(V73>7Df+sxp;qUs;0 zR9EJq^enJ=o;@gsUb%U)6O~T>EUmo<5Cp2GxMeU1*U~pz4tu7NO>RM|oBg|)_;1P|^)j2>Mj4Z@QRBO9Grs#P8?QCMe zA(x~%9BS%^Yz^d@k~ocHsMRRSBN%S97-vVNi(G;b7b^6$IMnK+ODEH!+It>wao#@9 z4VjBz<>3?k6;@~3(wTY_o4Wpid1XKQKv;6UxoxVPC#^R2ak`2n>+C(ewEBv@@Kh{J zN@Y#Q6$~O&WpF9heJ2$HJn8#56oqcAUv7m+vX6mg17J{wozaese;vxFjX4{can7uG z>AvJ|(UN5PQb%WFIy$FI?(kzBrdm_Z$EsFBiv+gQhFz%DAWKE&JR!8I^9(I6YvX7E z;FfbN$U2;c#cj4drqK{<)09*?1j(Cb(}?0Al~@WIcoBpiVNf)1LDVJH`P0FqqfR1NOKfh- zhVyU>dxjym+(&RKKrHzuM!KFW3D>MMRa6Os=JZ>76~>R z?dL|6yFaLMJvD`?9P8~hgJTrgkrNE%4A&I_;JHsobRQiVdnrM6J|xyuMv#Ez@4K6+ zkmwVeo7zXqQ-xN!yd+*Vi?usfS6tfn*_;ddJ=k)1vxAU9eeydkAKO z5GG;&)MPn8hciGIIl=dT&<$;~aOvYpbJY#<+{5IHRk`}NTD;f{2hnF(*k7?a`SzU5 z?d)&zW~%DJ)(uWs>Jj%x1hJW zhNqIY&5-hQE?Heuth!+|F^UTDtwi5y?C0dY#HRFk(K2%<`(QGycQZ70@q{!ua0~+3 z*RhNfb$%B^ML)lQZL=H8Oq<#}xp>X>Z6E`&o@vuU9 ze3YGZOZmAB6?j;sEsmgft;e?7kg0LAhA?gwyoTa)6ny$hqrq9o!c2Tn;0g&r_-ybhEah3`w^bUp-0xWvJq|+s|tie`-A*0 zVa!}79q8_-ZP`Wcn9#q^YMl7Y3Sf;H-tK3ROn~;QL6oVTe;YT>|&xa`K(v@|j zm})-5oSkS^!#8CdU|cwHd5{@n`btB7Li&U!s`F3=vqorT4ydpnh7 z7To+f4DMIeU#7M>n3d&y5yN|(lfd#=*Y}fLj-UO@xy_R?$u3*{r~Q;wSG>dG5&+Wd zhb7^9)42vZ5f%r2NK--s9t($kG8`5z~9!*0&xRm zs@uUmoaJKU9DQzRw(tEL>!+O3B@h146ZIQU;b)MMX z46Y;ByOimTe&DSrs6pFQCFe|wMM|M`;zf~WBMs>V84fmT05mI<67PZ=^L?Ma1H{hQi{Gf+O784Ze1aie4&b7q<>4~(RpI2mzD8FA5*oAGnkzK2&@ z!SQbT4e_}%^tzLah@!P!GYP@|=aSopDw$ap+8Z-+S@py=<}LtbvTLZVHt{HBvK^F| z-yd>s*UjTif$LdI(q~5JeqnHQ?C`YWEy&9vGG&X4Y@jT9al~?5I6t@^;ebV4y14^^YA7!-;T|?+$eZ)ArjYPfXTQHQ8@mU8Lh{S4of+(U1xNVy&m z|GgM_;$B=vrEv=tU=^Dyc>3NA?+swM+4?-j?Zlsv>*|WV7VV2)>3E9aH&cz|PAdY+ zKRxKacU2_Z>O$yCvi!mP&O7^Z`8^Pd?($`NEcVzM$;Akn1tBPniM0iP5*q;;VB8Ej z{6WLfkd25q%K|QL2}J~=^ouiN6)ITh_LF3kfx|nj85?oLz>fY6biHFsA%?>?T@%FL zsS_bG@~^Zbx-~vbsQwOX97FYxFCGq@(~aM{X!wYo2N%#2p|D+n=|dzXPEk(v@rktf z)_3vk;TP6- z9;vh%-=;QVuH5eYBhf?bxv3`Xc$K-}{lUL?b0ty!@QgXdzD|MZ-&5v>544$s`-$PL zmdb4{_S4^DdRT1LQ6T)8A@HWVK6^6W7`oL;=V?a$DE+Z;Hi*(6n*3E<%4&xvH4o%% zv=C5PIWXp&*JQy}&Y~-gM3u{+;kim9{`?Li-QI9&M}lj7*vsK7+Z!m!UJKZu;Yfts zt$@VtC-B-xNv2>ZHjewGi%&crqlMx{4X9DtP;CN%A%%6LlhkELx<>bhZ*(Yg+NJUA z+MF1%GRD&(5z&)TxsKw28^w}GB>&2Ha*z&huylA>swI|R4;K5a{OxqMPS59i`<0Lj zbr$efQv`j-_#vb{Y{*w&Ms+{>kM*uaxBKf2;=7h>=#o3>qmC)#^yB<@QR%qs4x@vf zdZ>x=q+cBR9`>9hxFU%E#(e7wrR_19fBLK%PxChs^XGQ-GrwuIZ#odTAN`vtXDbfP ztTH`PI{n}UdL704kthSTfQQN3DM9+XG1>SCEEU4sbWDx#@G<%gwGb6%AT(Frdoi`v zHXgC&V-L58tk7!v$Q%-~m22ik6mm^BwxN~S&&R2W$cS!vWFN+bCJhAGuPY8Po1y#Y zaBjn88UR~zl+>o*yga@!{a|5&43{5l8+wA|qpM6agxKN7>9(gQbs0YW4$|=t`xa)Q z@*;brUAtC z&WZf(fTR0C$^8y?;G*dK@zh`HH*?LB@uXky|0|^ax89b;4c>793IO1X@W1G7%>Sde zm8efTEpec1&#G@dM2e5fN`OHm!J&3y&Rv2Ip^O63AkZ z2G~W)XNbmk+NnkE)eTHN&1)DUaBWTZS&0rIh z?Y5_{8%cGb;W6%?dOP%H(yI(c@Y1|Nm9|)aMYkMUy)2_pr9C|{;=Xu3kNDEdru(|4 zBnc`JvJxq%Nkt8Iz8CnllsfWre%#((PO@VL)pSwzsOwGlVq-}Y=gj2<`S%D8+BrSJ zs7?2xTiKjfi@9M5FGub_sc^BAo)2B&f1SvIPOg(&MMsq)#OmdCm+t>dZ&IQ&IsXY! zHK93DSwKV6PR4U%ix2+2IOmh?+DEwPQmf8c8V9BGN%F^pmWb;Dc;VojUq=Zi(?ei5{2UqB2T z-88!%fMp!bEElShUeo}^I^~SH-6>J>Ni0@9QOGWL=};bfluN;F)YPk`6&m$;65v!L zb4?w*_Z!i>vdFLX+*0$yk?t-33m87s1gPw*U|XONivojB^u6~c_Zn2&efDw-en?#AiEg$*Y; zKX&*tnw(q1F`!|s-$gShJVF6F0KnoGNR}R9aVju>l?4ywumh2h<;0|;!4%!rO_0)C+m zfwhwl5It3b9-U4q!g=@7SkO_`$1tT8T$G^OLWU78R7F4kv#i461TrPiWdPYyCmOsG zoj|Dh(D{(wN4?z!0w^8;-&Ic%SU@#qCYy3Ngo{L%cQ;-d2SJAm5hyE7SW;EL-I3#F z)>P!ZE6VZqPJdRHwKaGE4~<=ere;AjZ*9mb<^m`XHnG3x)C=j z7u(UHZN?DO$2R82=gT6aLvb=L@fTZarOQXSp%&9O<@`J|NP{~F_RujE#C(l#*N3dp zD!Z=rIhnJ2`K$;^7|J-p1W7y}Q{3+*M(TL-n8M}`jgr!YyPm)+i^qQdoRrTt9>d$S zlQHb_T;g0rR0}Y|2mox2^fUoblgglM)QgzB9Ke#ameBkRT5i*>_VUjjrM&k$YyUS% zDC^N8%;b%gjA*6piz1sbtr%SGU&?c>2Z+ta^VYK+;c6rLD2~e7je*txUOkpyJ#qnZ zpmMq^AFjP_NZygBt2CBRvu2BMGkG-4sH3y<;6VkSK*+BYre{(g{D`k-$;J5NY(Us3 z++NNSeth2aSvK<)OUm8)$Pu|SP1Pwe>8bnBJLe3a{VZ*7)@~S1owOWIF%~iJ@A;k| zi#~oY4DyT_Pf%jWjRM;K6KHJaC4>)BG8?)onK#Z7dOMPPp+bkyKdOkl_L;MHm8*~z zv8&-`bjD~mih85o!`+zlF)C&+_O+(M|4^Eaw0x~$FR67>m#?*@Vo_t$*1_h?^Q`Q} zUYtw0S`IHv;tagV(3xZx|wM{;%@8XyP-MM3J50Fk51 z`=)L9W~M2Mgv?yVR3|e3vHi7NI32?D?=Z)i&+m)q>*Y+-_U^R|i%f6@5i}Qa&0?9h z_UY+q&tsjJQcN2jzvqL=CD5shn>$&wSQmHZWxDP44T+30l2k#)oS=9UbWiAGt0YGO zl`&U63k1=1<0~gWG?$&1y1ep=X8%1?Suf1Nq=VWK6C%e!n!=s0U@!s{P+x-P}bIJ7iB525I0&NYOQ#Kv11}p;1Q97um@a zK-^A=|JtCanI=Tf@@C5);(U(sX2^NWZc1oXS>7HzLIx6O%3)E9Zoi_8xYP&x3_Z|f zNcV0(+V(`ND##1TrE)*hz*$n(Us^vcr5C6f9X#H~ey|F%?RB*fqS9dWl6vu{)3I5B zfx{6R_aduRt1mj3^F_gKr79Sj%76jHj~#Xcb9eaHBc(kD!Hy_A7mct7L}%2Bm7Z1Q zM+R|n_##;}NY5AZ z--QJ>>oX}Zuk8Q0B2rUu!uR-ETZ5zC1WR$iqcPIuxdG=``BLR>s?S@UQ!F$Da&lSs zuVxxYo1s4I(<+X03G8jv}LuI0)0XQp~ zQF5ubSNH1fu1}sgfafL~nzzVRM-D)n818tLIxWG3)-P0f{TpwN6{hf(v)t$V&eXEN ziBjhCWKmaqi^8c>!6CS1!x_8bOIDnH@T@w&@4*rFDAifF8Ecl@wWO6_VFH)AVH_Jf z5-p;t+SP-QOo|ixIU4QMO3>l(t(GPd)(N1X8lRL2Wg%vqzF=h8+8zF-t zHW>bKN>ib-vaOp{^4<~c&hd5Ntp@IN?H9wXR|U9fNotemt5)_FNOB3htm4`W4>fII z^M}6sw+vKnSKKG(OPMA(n0)H;{0!=Y0>?*53RHGkc$y31AR$h_T)hBw@SRK2UfLe%5-U8r}d2|;ZOJCAm zZQEUyT5-3out-0Gu%32QW2`20yE!u7D%V(|+3iW{(GkA8%nzS*XfVw(yY&zmmnhTS zOia>psyStI%9`Y+=!0&k-$(AEgZP4dxpuj(LDAanbfp~mTFbO>s{R>==)1Jm^l{4b zML|?0F(#ST{5v(CJO?EpBhYLOCVT%i9yH};a_h_Y3DQ+b$zp?|89jaK_RFh#Frz0- z(?9siNgNbPbBOf@7&16h^tPV091GD;C81b}=Lss&xL#&Lfrx7~fJ_0k&=4=4sGu{> z-#yEzobVkTi!ZMq^%&IxZl{k-d-(hdMlL9(^QIDuY=n zu*q}4RKWW{s{#DVP=bJ%tEFK>KrB9)%V;=*!sI`Z7#a!BNpJuaC*jZ+ENAd_cv95F zw9htPiorG(fT%+PwqsGn)W9U0sfBASi$nUNF0`>kY?J&M4hdC0iH17H$S$Hb?3C@?dH109lH`&6w|`T zjq!x<20m+G@V)Na_&&Y!GcdnX8O`UBC*9NI=Cjpx@oS(Dc8UEm@OKVx1Fa6N- zVKVNw`{Q`jKcin&Y0t_TjW&X{qM1LdG&W<79cd)2Ta7H!cOXe&hzKlEo`l4m;8aPF zf^b?`RN>^`p}5DuqX0+A0kn(h>fK7;&YX%0Nf@7Bsw&yC)qXMXXhMQ zkDJA*>wI)>(l+V7eMJK;O4rR(j!xF}1+irAp=0mkf5R0Pw)ruHu-aytI+I()fhq;nd{Hvd&byc$PS@qv!0x8HV1PSF96Z8$ur~OK8Qrkk_Kr1% z8Uibf80C%;WYHn8{8?)$E)0taqg9X*AyRevnjn9#{RT;C|ECcX1K1 zNOgph(`f+5Niuw6@7Q87o2TI48BUa#HI&RU{=9p$$0IPr0Q8d(aeZR8PcX)$zeQiu z<}goblXd%kdP}$1{UZ^hX!ikZrewG5$Y!Y4Yr)AEaQ@}xCuu(C^&cO!<~M>F6U~Lm zuIpEBYmOom#r*CKBtbAH{W zvRu^jY@$RBdxz-6GNjubF8OL*LY3IMQsNX|{1C8y3EY?&ZB^3!3}#1~tjP}@sQuff z4Vele%B;Va%B)V2bAV|nN~9CI3l!h(V2l1%IG6q^oIB@Ht75y4PSL$rndI@>_y5j9 zOgFA+8JlvvIboA4-E}51bdo z^YQR5?Wc0_w$+k_x+hDiq1r{MD%Ap=M(((MuaIY zie!40uj^l>`zZd;$Bh5a7ytK3ci8COeD}xIjHfO=J`SGW>$W@iuCI?mvU&LHKQHp) z(CXV%&aA&Po#?~6{XgjD(f(-nL?#zeZi^!^{R&pREYqw|a(o#n^12>QiCrr1RUEJ5XTiaSjDK^!qyQ{L-mt z#O`XniRDlDS$A?--Zm!(NA-m&8TIpQNAk0vj;ed1l3Ct%1O83~0u(4GAHXHf1KO!* zW8{I1iUZl(Bk$Uml7Br)$r}b=c`88W2aJE%Y^Xi#1l*4L?_F8jnbH;=M^;j;%`!9k4<9TiOYgdp)`}K%`{P_ ziX#CXKr6y9p36tBf(*QVgH@?YCg-n(I@)--u_k6{F|lRisGL5Hk(H%E zF7wk>1t6y@NY6F4&|h}7PKezHy!0OMT<|U*#gRg+$25K z8Z?VCck4sYad3skJa%1LM5jta3Sy`Agbfn=C;Jej#A?TVjJ;pZiMgotOJd2lg#rY@ z^6)p};-Ywyrn)NgUk|b=Bcd&iDbpxUm5TZWYB_oUK>c2dodL{Mmah&G9=YxOgHcio z_gS|@xh6({+(;SgD8_FS-ggiTb#?(A1Cub`U#hhZAsAO> z&F97y{C}5!1fPg>`&$75A^5gP1M*NJf9LgB|7CK$sLMn<@|lI!)%I=-`+fkcuQddV z-J-P#N2=snOo+hHps+-9QZaES!2N9^KMMT#tNHW+xliRYj9b;zR|CuFZU} z|Dxwz2d+e zSpN1$bp6G9If>~$JLt%VWkG6HLWg7kK{**#`miFtmZFSp|1|oEbYE|1Dnq_GAeufT z6Rsfu>Z%GzTPDEJv>LRW4ooN&g{=e$a(yS0Pi_^)Y5d&FYgHlHdN|(H8SLu|;C>@% zeCWPHaJUdMPLM#sp&6YD66+}hHhrc>2A?+uASAAD>vJd#owEdFsVBN6`yee6IEbJ6 zFyxuQ$%r1D2vD9&dW%oDMx0yt5(-ok zx&N;~@ws*?-}_3(4!kodLMfM0cw)E!b%#Bj)Ib^0?s2{1c&>lYole2BMq_(|_vzgO z45K+HSo~lW2T;`&pkBljN|8FPo-0Tu07G}&Kxd%ewE*u@q5K5<67>zjLi|FvDTV{& zRBQ}kWi^?Xqv<0vaAFZQ%$QcHZIK0I=~;>a_YTWsK=5J0{e~nPJNAu zZiVI?2<51~auy_7ZEZnuy&F(;rcAlH18i&pA;*rb!!t1V7GH!u23D3JscJ9l@KnC7 zr%Z`%h~DSILlvRx+_YFi-7#ZE+4rnG$4Vc$alR1*yJRdWS%+48-40)Lc7LL^W%JEx zKL8>;bw(;cP;GbyG;{5*!bGwTumu|Obbu{XnKxl$p$PhXg1}9hq{&HWu=179!D(^{ z7A|WDf1|CR^~-GmYj6M>0s=FJJH-%AgX}E;7%15q^?tp;stFp}KwLtG_a>_!dhq$i zkO>Z6x1q2^{^rt{W&~|ehn9&!BNO2{aQR&KA{^dNjY!#I&^UwgX+fF{lx!x%k%l)A zsZb|J@bbm%4G;Iv!F$w@3*n5(@b6Za`|ZyF6Mt7xpR-m_sl%EY{ zf{V9JcM%&NJ;S=xq&^z#1TrnR{30_8WQ-36HN+-8s856>uVf#1Ao(N+BMl%UVqO%j z;`}P$neD_0Ni4vLM5U;0X*Tc0AZ{nagISmoHIi-g3I2-LeXow*~)BzBI<}**t8!F|VgT(!@wxE!&;?kM!iXDQ>YbnzA zV4`7Ak`9}cN(tvxhgl8yyKaHprW15kU&ZW{TO<>&FsaK}ua4t!PlONqBv@U=*;ivb z!uzYuACczECNk3+8Q_Qba@~#qDYg5`+S(xHkOthr9zlzN!5i>|MZj24xD96xCgxm6o9<;_)rjd za_Y|dd7(vjhJ%OE?of-!hL+eF?=fz1VP?V@imBMK822!HL|kx84fJ-Iywqb`Alzq3Ls3}$S34?EgL>|4$LZB4Zphp z6C?omG*X_w=LeC1?+)+$7RCwbz(w{Kg|h=y!vdvoe|?lI0^X0~pvBCDV77P|g~I4b z+i&=zRg#OHp>^B&4WLV=6ijRzK)#uoF{ff{LHopP)NjxrL@spV7ytMG?6%z6>Ef<*vN6>v$Ds0*K`WaBRa zP{DhIgVAxw9h;-xdZ3K&Jd%Kg`ce|z2zJ3-p*7Po06?EwTx1~&io<>qvl1lI4}MT2 zbjG|6>BRp&?)%jjsqX1=L2`dR5ANzOyoo?)YrY0@O z^v6OT(h)8tIB4M+wp4<8Z<{uMTWT}d_o^*hol)8;-o~K-n+8dvJp&kzV!2>UQk(6i zL_E6W=nrKTP+exFnLUnV&UMLe^|60M~7s2wkky>LfJ4f_ix!gs;c{^dl;`YA6+U}$=4wh z%eK`ZicsveEXp^BO-MtATvo7aA&Ch=KVjDMa_OA`>%lwO6zXTajTo+9zJTde3`po{5wCYksv(DO`i{M*{PhmAfV%=Np8grC z7%a*-OoqWl?`akP9{ciPk_8Hr(Vb2GF^&+ooF6#EN)f?N6~#n_8>FvPZ{Gn5#ZI%w zW1{OQ?eW*=ys)qcKP7_nX6r(E6Ne;gjbDPx9tA#@(?HTEnpR?rb3L?2L%py(j&@mA z2T;?#-IiH7G?}j$qd)@2k;04|!x&o@6bx+Cq-t{@N|UAZB8KZP>E-!3*xUuvbxKhQ zZ1Z2>=k>_%d!wJ{V+I0+%Jx19cMZHueS(g(F12_t8>AD&7d%|#xd4L27*ZlyNFWgZ zhq)ffrd{*UOe7!(wf=^J@QsXJ#3TO|q~lj6Xv?WI9%jWm2Bc9NDfL7&&eDWHqc0(uwcnucZP`9*1p zqGTds$Whx{a1)ifaXuUwiu2`L# zGx$!7RR;2)*o+QTaQdv)0{lYKn5-LAj0CC%OWz5PLkt+o8?0+u{>E!-{*^AV(0|u1 zHk2DoGFy2XJg?ThlVp^#ZNu7R2e)KyV^=pQ+J#d^hWR0^G8Py_9g4ahxb-aS$x3UY zZY6A|u%iSC`AxdlMX^bE1`aYsa7~{sRmEdE^R9R`&o$PmFg*5SBpViqw)?^_q9akyt52s9EA`zI!P~E}e+a{jld?&}1=|^g0ktCPtw0TPaZS%CsRKY0lzkH*|YhOrXBk`dFgZXr8<(0ilnbetDu1tunHnp=)3Pn&%VdB-d!q}~I^J@S>v?N2g$O4w@JvsQZULA5VqY-11q=pcBC zl{7=`SOJp@2tbWkzH_BYqkh<>#JdLMHA9PY=dJh0Yx?h>TJMpgqCyo$l~J_3m?UNd ztIFL~mQD?^=E(sWh8Av?GoPgE?5z^!I#vg2auT`K>K?-V^lKU5>&Tc_8JAMuOwT=e z9O}?JCYG(&n~tcaqO@kC&xA}wk26LDA|a+_$E~Z?pAnVz7$?WH(`YLAt`GTI8$#7P zEj*j?#-JMQsu>|czLX@zrcw;7g|=1eWv4tu8*v3?=cn<<3yKip(d`9q3W1J`;k0b$ zFX4UFCV5vqv8j+E&)g|uGLf9CLgJB9T)Mk6;4Lh-YjDl8a_LaOsS#dkUht0UlP>?E`|lZqBI*=sQLgRnW$PFxO-w6Pkzu3 zmojkl$$RF~G*@>?!)0u;$X!K$Q*q&feTQd^;3d}hdz5nC8p^&J)bH&9{XN3K-?k5? zR=}Pe+j6a4^^g2FFnlx7)O&+?e_(3CSpX?F?jTu!J6;Pz1h#>k{`N9_KmKSR8<*?* z{58IKNH3r3d+$CfP9K~Am10bZsjpbq(|<-B3{uMIz)$t23JE7C12+Er5Y8bk54Tt_ z)YqdCvUzG?R^uZJW;(e>1ZOmjI|NkOni5`T)0mmB9{4s^Yi;wxMlVSO+HCXXEf`!laLo-*!x z%_Om^d&(8ITun*+O$q9|Y_fGclAP(6rHm5&1cnMFjNE;2SRdL2oKIG<+bSUDjTx)m zGH;B^T$vMkSquj@_9SbL_GB90<;$Ns=Z*XiX}QL3ofwV~4<{{4wo=Yj9jH;)!0%&3O*`~e8ru$dJ>vhk4HM7@uN z!u)*k9f)tt=54GGoi%p|e2bNA@4Qq%Z4U$olG_!5@6JTR&Kb!P=bvn7?E;BZ(k?Jp zuHyvstw$!?v7Ok4KJA&HOylrCXOiGzH|<1MD~sJiN2EAPeE3z?_Y98uj{YXyWjx_* zv3WdVPknu0Zj_2K|Ya&=*eErcvwq5qScli?C@0Quz_7MGLj2l&|WB)-(e%85eD zP3$VB1MFcs+H=p6c|T7-i$(3A!Z#+xX7{#aeq#2t(>vL1e_=+W8QVpB>uT|0Oz@?z zoGdxci2)96Khk5Q#v7{cbaUU7-C6}>ix?wm^M)9Y&Jwo@z;mvvIS9#740J8$hJvq% zsp#e!mQcI)UA^Cug33@UQ|8Cwy8s;T8DvSQOAr~0%tQ(N7P$$nOjtEIC~Z!7es z5hzWJe|CfIU;59Hw=J%j-~Ak1Zzj#UzxM;=>K?S+h_;Ol)L#cu^gVsk)cknItA%!b__ieEZ;#SS zqv~4}h^oK$me%;VTks_{^VlO^i?O`$SSvG$&XA%6NHOF8_*@Z;aw-`Br}&|FpLMdQBeHjh*YTz5+dz;@uk_C7uUQoMy5#q-aOeFVqd|Q*vv#(<*mFsC1g1E17Aoa19k++)YGV zW5&9W5)T*W>;3PITss%Jh zHO1dctBY7O$#0sTKHss~W-C(J_zTwFiWda4)lRqKgCzbIm#qPKh>uu0x#G1SgmOR1 zhSTgKqu|pnOrM|4;FC4|)zcJrmaZPJK5wT^vT020?$o~f9lVU^XYHk)XSY?c;uVe( z{>L#&#~SV|g;hyUX5jON6#}1+fs+$?%mv~#D7VDuFSu2ubQSz5im*_fSNK!l8x z=dNfx88Pp4ZuPgeWsQ4B|a)1n&K5JGTt+HP7|=-Ygp>kIUop zeq#E_nl1EBYE+};+0y_?mu+91->L6Q$+*5^p;VEaHwZdyH8>6^Q3lPkH5};=QGea> zGR8I$Lf342K1sHFMs$EL<(tEr?njvTV+$fiG9dICR2|tut2#C}(D;F2q%;-Wb64kN z!YsG!%DrR*PNKNR;Es?BQZS6Vhd1q%-jQ$1l{*G zTBpzV5spji_XR&H&aL%PB`%-G$Ia#WbvC|;8}NN}yvF)#D^xUSYdqkxmlP{+G5j`? z6H+F4f6v-_sI|V}LW0rfDrHLM8_&J}5WZ^3tF-#6$PF>u)J`ewL0>{m%<#8{R6bOC z>I_xORMk4i7tb!g>M+j^U{ z=i#f~z|Y^yW~f_@&;acu=%>={NM4l+XrF|Gu8R@vNiSb$2OR>Y`I{e1u82Yvi=f2u8$B%Ur~Up-yj@qaxBW#rla1%5z*zq@&Cwq;wG!B>yl(;vtnpb~tx zsP&LZawNeOP)BDh40`iA#VCMo9;Vx&@XGMp)>!25!QeqW7Fh-;1Y6?H4rWgaxhS}M zh1vNU-dEfMLMP9;{r|SRyC)$P^Fj0klNg0*<*S?WP-3c6xSned0YMErFq4OddBY{J ztRBA%Uo+NMYiRspRj#jQtRbK_pU0+-uYzj-FaIRaD!`Y-Ye;Dbf3Qppdkl2zR9ypS zM=^IJhb@ll=qQc9`77q8dx*}4qQoW~_|_g{V6KV7lG+S*v2M;!}hc+oTO_PE63Y zW2xq%0+F>p^Yag#KyRfo6jh|U?;1dXsN-#-iBnE>R52cvTk7OFjwCD}C8w^Lx5HW| zZ;G*-j&g1-WLE%Fm3T!YanK4lbwTGQ>}IVERh*2STOGv?`mtiNpmrYIkjPFPfRnoXA=|3;U_hL3 zMlnEiT8c9>c5kh&H;d+%Kc3RODxEo+>EY>X8v8X7hibcuV=(8D``_+)hCD;@D=;`=@!0fVa4+WB6QfL-MeKPgGsZm+&2ahgT|-)^F97I zv^LlJsdP{>8;4#MhGNsY3D&izY`S8}fO^_ttx6p@k z>R5R}iE;_c1XKG@kq#QT2bWkfm*lxEj7TV;$GsBa)RduQ>COx9 z8gkw}LA+S6QtYcVK8U(@lhf^&!nnGo*_B%!>9iG>)+^kT)@UMyp||`K7Aw9mO;y@K z)o4X*6_fD`%F3U4v(`QF3wl|Fi7JV8#oC;Jp(i}nC995;2M`R0RDBLRmFkZIoDYC{6=#JS41%lzXI8NwH7=YfW#rhiEgTvll^|tzNzurCYmm0mPq=hPNH z4^}~@Ol5b55a>zHWDjt!E4coO1@OQV?!{PTBW#}IrtY29ag&%%0tI#cNi_bc{V7&= z^%5c5c)NSIyyG1?O*0v4w>jyw7d0?BvqQ!FPLjTDIVA_2aYN{OJ$_V4SB2?_^l!ML zcQk5a3^yI!ZPeQ|PIs4iI}qXYZ6Ig?^i%P@n@O>vgt)E>%9)$KW~(H~t`6nJ70a-) z&g#u(1zowRavJqoYCuP353n|kivEUu^L=fELKoK)hg36#T3;_QCq@l3!8vC1yK2b8 zV}_j@!Wj1Jv_iY7pFWVvhpW3oLdFA!IV9X71D9z@Tm zY)O5uvR}kXR&?3Z_)$C3AsJJVH&C;BK}i_}mN+J28_!4I-T1O&Ed_}>5oOJpP?=32 z`)uSxqq=90DKm6tdShZPEF~jjll0t6{HXP*jC$X za6RoWU)3jXj~{6{U)Hv77z?QLnBZF|!%`igJ!aujDH%(_7s>NpErGHW$_ zU=$^rk_Ir*XmT0*2Tp?{C*L}~dgj8Jq}XoNOlS!MP3;y7QmJuNOSrYr_%jQv_Vu?< zLkajhWKBaN;z|SZgWAq%DxFHTb&IKm>Ge6YRmkp^18vEHd?VC#O9XQgu1d0dG-`F? zOf3-X)a|$nKRJ(apM;9)$G11;VOxW8 zgXpMx5EA`@V3X5)E}ou5F$0yg#;-V&VaWa4C>zW9Mm(so8q8@Y5VIgSVG zrXyFqYaM5W%U)tSINrjQ_PgTYzp$lOIKW!nLrP(}-O3mY6%XxkpgdIoT!zjlY8dPu z?6n9NU1VWke@_KWoB#7>*Ak7COV2RKR(tp4YElZ>z~*;#1b}P^!^V;90;DI_}xvd!x z-5IX~`}73iF{SsIBavwDNyj9X-C;ZCjbDV_R#{3DZryZDi`>2slOJs-Zw}eTRx@i6 z^!HRQjKTTstq_g&=HAv@Oibk>fY&UrIGP)xSLsTS9xy*X5TlSiDCAZyQP(Be#%O&u!^tw>{|F^F2BptDrn78iwDzFeh8lRtVj;? z-Sb4P+o&!6R5}X`vvgh6LS?$xMr7@*Ca%hw>iRmzvjuIo-sy^cZ&Xf5TY9%P@B#mf ztEfWnT&3M(gWd)R&-Q&^KU{p*RnB9#)VUBr6S|8y18as?yMDq1cy8&^rOVCpO?z)| z2XxuR1m1nX(%ZhopTeigU%_P?Kpo)mUqyq&iX6u9+o%zn7iCrHZn*D6< zFY-PR=P1`#e{Yd?*u8blovdJu{yWe^_t?4ubYmF7c6GDkVkWX)$i6|dYcUh-;hD*} zH3`){Fg?M+)!w_adyik-a{^dLf3aI`k2{E%-h5G&c!@n^pMC!FI`{3PY}G~9(&=MiT{1} z(~pWWPoMYa7Kv#D!-`-n4yk<0_AJ@n{tfp_>%rAM9js$>xu_^j%p9$%6|7j8g-5UN z4$6IXmG0?VwL+R!KE3Q`&sju!$?;}CyuUxpQZgKZZZu8Su5q0A<3)<6?M`{9nz;s0 zH6*u#5A16kKtcvu+BZpS1gKsO7blvVD^R`!4fy@8+EnGGxdN)LY*##$)e!>X-i#&z ztEeYzF|%x{bL=OB?DQVj9R~IsEFpZ7SGwqKEjV?r#>#Kc6=7~+R)e0RwK6H z@_qh&ELy|%JycZ;@0DJwCa1=%1&gj1pAeGc4uqU+dDT}_H^l_8@ z69=m`&afsNKD@8my~dn7vR!xRQC_Oi>Z{|VGEw1hZqNIo!B)2#>{t!fQ7{H7u|BG) zj%7DalO?=!cgA$!cEGpo);iUb5AS!Vnci`=Gq!m}r$Nfvk{=zYs+hK#;;ie%UQ90{ z#RgrSFH^VF@%mGoyMoz%V>#1{W?5iMzr?ijvKwq^RDrv>KTMXIqv4_nH<9g1(PFcl zcgjuPy1l?VbSJ<@&igy?&fKQWNqhdTZ=J~YZI6W`((+vi1AO8_e#qcq zJGSLNt)KY6M4$D6zJ;cZadXnM>5$46ZaZ_qbRM!|xz@r&HUK{sWr7{?sL1OIw6EHj z`e#B_$5w@$kpqJUjPN9(O6kv)t3c~a<($+h?Dtf{6Qp&6#Ex+QkXrbnRx;pIV5baL)Ntbo&oe`d z`MSk0g!H%(86SYQsMatZ-wN^>Q2krHBKf`11rp)gT(j=)JIM@g#o_g&&V$e*ShkFJ zD$N3WpvURb_Ibc?4~`;~V3c=YH2wX$g){B*J$3b5nI)J@Yp$au62D3(&01{nTXR@Z zSv4+7^$5;~lQ%NbN21&U8tFw+wji#Hg@%{@N+_-#H?qGUe*Br<2CM-7ICH)`(CN_= zyXyjy*$cb%=62H{}`Q4i^4`eDd5x@$5;zgQoc>J$~-Y1&lr7#F6~0_xfc zQ%irdomo|%_t`=$g`aGpur4XoWEzWnn8{zYJn@-L zoEedq!Pd-$Y=6x;H0(y@&TiP8x^^VyCY!D_Q?F=wy%(`YE~sA!zfRs93rAQ$MOPuZ z)u085A9fr(rz#z&nT$?^*PSovYB<9>7S8J?II(EfR%nK(+~-A`#M%+(wy^L3anHkhTV94df8%0~3CD7H0B z9-?SQIpp;pP5*jQKX=4HVeON1Q4Qgr+J_9xaE=OMN+oSL_oJN%d+of_*+m!Yyycwl zh;zPR9HDOf)@Mm8fmTwr(BH*p zZn1%rlAB29d8~zU)9i3pfSG@~I_)&Dxbt`{?---P8Ai#-e6|YQV}W zy&x?WHZ0(tFC^A=@zz;jQuF}}11cKYi51Rv-_>=hbj}^$Ds^Lwp24+BPL?WgAbq1w zqm>tZ#Ik`t{tDSqA7v}QHxr^cO6S%FGM;OtzuSQFJEOhbBJ0qBA3mLL^kcMf^c{>y zaFBKvW3zA0xE!U^$XrJgC(t{HtvKEs0<)lS@#iy)n9{oF>$i3Yt?C_B9(`c`y zLvf+qel#uY^pd(M^SwTD8@+UJ*7tURvP4rQhg09-Bc)IyR!hG!nRRg+dGfH(5Jz8A zzbkB8O?kgTS3lJx_v4B=7G_zLMJ$19!O7;8I@<~xe`vL;Rfvz)xAIXsUhP)FW5I3y zXpFS;*V9H7SXEsAP%zgM^&>(7s{mT)>O##5bjtN zOwEi`$?GhFlcob+(3BfI56Gj?JyGX z$27nEQRw1)#tA`AVQdstu~S!FJ4&8XYi1bjnZoTbi*WdG1rpJ8PI>o^0pkRT$>i_8 z4vsvdx7O+O<%OAD(kdl}u5_vJui$&1?lM{hC>8$!HVWENFmET~DsK+n+PP=2CD=m& zyqEfUTZ~)*j=?t*ZpNyfa?~BHwZQgoRRc(#vWNdVYyRAA`^H#YfF}7q=(s^+jCR@c z##W%7FOF{-PYy_4%?a`zy4AT+eKT&wu|_tDIfc=@DL-*)X;X){F;snP3k( zP+FZy5alZTZI|)gs;5fExK!MFA~mqmbk!S%6#XW1X9JkPiecEP#~#J&Z>F)tQ|qjqk$1lA@nb&t0ccH<~4uP^X&eqt0x9g9fwZPx6S&!t) zz9qvOM~3)dofi2|h7RrMubWSQ*GpvjDsQQ5D=LeACst978LoI^mBFKD(jMN+JOu%v)w8O_=zz?e(Tc+^Q zPo4?%?P8});HSs~=;K=+aO3o6wYMAYDH=eL12%F?lr5svXLd`MH;yjnt6JW0F^NgK z_6iD|+toSMA-LC`Z9bfkWVdX%eZy#$PHdM1I|fVp#=gFLBpo0*dNy$@HCh;m=XEPF zZk)vE8HM|kAjQ7vjJK5NQ6e1IEg{}GLc}`Q`sQbqX)M(j)8r}FDc(9T+jPb^dP{1P zliHY}(CRkoV#nF)&(uH>nfbj}+%fILW^WJZ3cg00PUlC!I-BaLd;0smO>(ZfxAnV4 zS<2WtcJZqR{=B4?-A0v{Y5;KtxbZ_>BtZn^^WP6`3%MFqp-*=AR5?wTzw1oun|b?A zqOaoEMRb}Kwcz6FAWnc#iR-j(5{nT#AW57|{#SP`S0TzrQIa}s&3d#7qPn1*RSV-% z=7dTK1d|uTmhWft!BY)G=k*wNFVTXSscGs(&#UI)cTI-eSck~iz3Ym^n~B`GYbo-U z{4iQ-Ubr@$epn5r%t4c^Q#I{M#EmQyZupr|d(1QZhe4?{Wz?&sJi%qKv5DzJ!l`St zUZsiaoLU4RBE@1cPvtsrlZ!mUfa{fc*h8m|V%Y3m#=_m_THj1OH0k$2MC?e`Uw^cP zn^Fy%rRRfKS4z29X2NtL_a?uY<5BMsT{agZzkZj70-J0+HJ|eSYwn`q8#Pr50F*#% zvc%qiyd2J#gxiea!!XPIKmd>r|M?#O8?>z^CLD#d*GoFs2}Ti(wcPGTe`Q3Yt-v$v z)3x3f@%q$6=48&LYzkqZ1Bxr^PdtI6{TcC9tbu1!RP z-DdNC4_51SYW$I&h|20hW+p&3x@)Bom0P+qk?Eb~)DI9xk5t8aWC9ikZ6N_Ap`45< zyBFs<)X1n$C%8COtsLT~?;dA;cM|)V$_X~V=A{XpLoilwJ?GFiF0Azt-G#qx?)SUN zpUne`)}}FH0&j}i%sSS<5f688)NPzOg6~9iJIb3Z_};-9H(I+q zA(~s>E=8rrFDoqo-?S6i)N|!V84GD*J>)RO^%FD9&qy;3Nx-ov1ZJ06S7{;)Di5@) znpd(WJ7*Z81>aBVTMK#k(y=o+>4ghXq5x3C$SpWKawi}LoQ5!fCNX0#--CmL@d&U+ z{=A&*HjYQovjVF}nmcstyqG*j*zQ(Y1GRizhvmF>MNI{oc{>6q>lEIN!%}JPnwfuO zd=09drlVsx125Kt!~!fBRJJor#IwEWSMCv1^6c`*oD_Cyxr^!r&gN=WRCY5MgkB*4qI<8NXU2s*0PN4gcU0nhx&jPB?(LsXi2_5& znWm}gKhZDufXeE5k*wgKQvanazI$o@nCMSqnPv3x{a@W_z2R5goFQ>RI;@k<)jn!3 z_UmrKf6OPqJWXkUh*PNJqL~(_3+jOkSF8eB6zO~F0-q=aLulp7FRtfRqO5RSmfDxA}2dxKBx?1r6~d<|4i@wc0NYSr}Q zDM7#!fihpe!JChFxcNp6FgAMG4L*nE4$pxG1Q<`KGCOYYS^R9uvpBA>yLnP*deAER zw%Ws9mFAAJFr5H9RPz6j6oLU-IGi4?E~5J%Jpc`_ipz9qa}XSThE=>FdQ(fi8ETPS zIi=DuR(ceF;P#-lm#yaWWYOh`Ah*m>xRN%_>(ihXyF{tuu8zgDMg}XES|Ko{%!C@?BJF00W!_Tp8F}YQjrt@Yz+I zLe89C3gR#jeB^?@3kMe%&CSTl#;`ZT7~*PDjt&}LC1Th&C~$`^U)9sd>n=8j50PA> zQ$Db~S;Cg9t&a?Srfz$Y!TTNI5$ccZIQh_qYac~U;{yh679JX;&Z7TyPNpW~i?dPv z${k(kdJ7$UqgS}ZjzKQN?s1g=Y}7?&YcTENNa-)#4$>Uty8dLI6D;{@5#7zwEux;z zN#h^n$YUNsE(rDj6fPEa(vJtxhzo_2=y_9y4#t*dDnJa*o4V+D`A%-QRoX#+y9*y( zh3B$@RsH5@tNxRwfQB~rz*K)7GN0rdgjpNN_pMI9YPU!q2&vU5=p$YfkI zlrod3!m@u(DFz9DkJ`oH#|vTo>O3$orF^@~KZ(q^t8v_u+TM)xkEUwS16@%ZE~iDz zP{9<06S2@VVK+2BM(~2&1plQ;r;{oUCNR>zBnJ-Z| zd5(h`sI|p%Eg>OHyWHG8vaJ3E-3>QIBmS-h2PJq)2QU>Et@#BzCt%11f|m zsZD(VE>VeBBsS=4eLKU*lXHi!WZbBs$d4aCA)^fr`tpZzSxOufS7aBGQp%l)mTc); zjJKgQz#RFCSCec6uH12?X^z!tLN8?>X zy(K11%Y~{Q0EG~E6a8f@a|hO1Z}lR|KtP8LawD8No5B?@MaImDI8`Wz>{poI5gKqj z(`gQ%CNxxurFe7M1YEwn>|uCmx^ZU71-DV?nEC8+a>~6y?#Dxh``#b)h;arDxs+I8 z_B>Wqtq1h-3}^2{_V_DEk7%5-xfGQK;y%p@pXL!6wKsK~>wCj0_iU;ys%-&48djF5 zX=#|S#|zOvoQcxmjcR_i*-W(8D#~h{m?-*3FW&-<7yDZBQ9(>Bvbf=c5n!DGr>}8> zHK#~uX7D>vox?d=kO91!f)MzZ(d-#sFUt5F{YHWF`%3&lp2CInxY>LxEyd;A?^V%Z zvBFQ=Sn8s}`i_wgyZ5`I7>ZFE)L>{!<=&w5O=NNG+D?H|gn^p|!}+W!mGCs^i}XT9 z+JZg_321mnkf%6XA_`Q@E~U*XtP8L_Rnmmz3^8g8YWA5=DU{b_o-rAoxhB7C_z80ssyWm|1SZ9I zsYIXN`TW~Tv7H`_y?@_3gb~WlkQ4spAR*3PrOw0V57$qdDBeb1?LMaqf!0NlRfkFk ziaso&53>4UQq?C*QJ;TsRzIWj zfnU4S%stu$y1^7xSvYmKP9LrC03o$;vg=9Q9FBc1JikpqLPq~E#?w^q|uRv zJyB?kZrB)|9IT4~Wmj#|4}#W1N-1g&wXj+TS#6oG4eQKbQ8`}UtH~NKmEGdUI{qk4 zEUXF5u8PuB)=>qVs{@I&-F$=GxFwas)td{kJn2&* z%vN{C^7J{un@&ZO)e%rMvN-kY;T)Z|CxBk32j>&9IN<9hdm_;tzNE|FT^^*kV4wnT z*ll;Sw(zoW7GW=X2$A^!Cv$>;#Q(-SlF_bd%s?@Y)pNAl@`O#*rv86>6O9WuQj%jC{C&p_i^E08ZmYfgz#l+|X!+0*Xm^oFmNaHZqW`6V7*vkJ0l26Ne%cB*^0OL5y)q3~Cum zn~eINBj5ACXE7#hbno_b0}B3T|Hz`K6)tABvkr=R47Er~LqsY-yTpVz923Rre)%BD z%%bcZ&L8WPO#7-X^?WLU^tVbIQ%QaY2ZtI@K=hoPrmtmk^7{4bgLD4-L?Y-#$~l*W zB6Ntz8qlA1n&ys6!BML)#9dv!Re|XlMo;JI(Jz{%Vs5w)1XCxmEx@0+ejjsl9FAAngTsnUTzB?Q+XxND5b+q0wGR*R-*f4 z%`^GJal18KpzQQAGLrsNXk>#J~=26;j&oWK#B^u!!=t&dZN+vleJ@hYFx`hEjP z#9WS-@Ht+mN=xdJ+AZAzaHz$+2p6w=*WlL(bzKIZyMH0-07Jk93=q#|rhY(dEmbnHjf(Tq)s{h{Oqic1D7oxXz5FEy*+F1J0j_ z(6PjVG1Z7Z3NDlzIFh$C$%d8KY%d0gSF>MGBMyRYF6&pS4L8%Qw6Z#n8~G)k+zk;E zwULZeQ9^I9i?1Ij$K9IB79csQmaBGDW8!gSq~Le);m>mrVp_!@oEU#ik3)FPc!=2-`F8Yfew zoH|O8$aTL@HVMu#SK%xx=HVRcg;j;%mQJYpGRSyer0}A}T$E>k4I(>hu)m)6kyN@0 zi<4RxO?<9twv{lTtU6sQg=fwFF>6ig#R0%qO|CMz)hQ4MbI!(6iDe6(oq#a;Oaz~v zAw@BM(9tbHe@RqAw$2X5jK~brJ6Il)+!5c?glmG(xf->3&7dpk8V{Ay8($!epNXNFhE>m=T%LY78|`YP|%RpZ?l2OqT&;0UaplmOAHIK z6bge#-nMK0FfB2sMlNtJY+)2jjQt?z$qQ@sZ@i$?I6pOH>&h_-;z}{h>H^u=E1}&! zumD|MlIE9h7KZaR`5H-U8-$z}oXs=SX6YIu@H4pgyx!ihuZ&wXzg1>*lXo9|PI4S= zC3b-%r1EN9&{!}77DGp=wc;eK7%`nz52Ej+_(O=P?p+`OUcLdzFc+_ik>PdnYJ9R0 z5cu;^OWaN9)c{KOyfP(Qp_@G$zKH>*SBfOx6;gjn{jbU^-&>i~#+6*l zjT3ES$8T}w*f%c3G{(b>>k|a;WG=xn3Aud-t|Rj#w92>?jUIGZ#|9=4@v5n6 zWqE;)Rg2dtyXGnOSyPV1zsu<}SpvoR(4=UKt$vEih3UjUVGhp1bS zwKG}Ve6{3v0XkugWwa-1u4DuwDf-v3_=#`c%mP8bl;z23Dzl^-yYjzHf#hn#J?<50 zN0PL!aOO0;3p4wm3n-K+gTHP2We`zKIJq`lNh3-y6oO_#;M)!s^&fDzAGK59AT=5` z5`@5_ZodP~WNqofUC!I>WD3-=#1!~?bm(lvJg~AgCi*jSH<(8=_gSYT#rd40&?*Tm zDL72W9m7_XQ8J^~P!+1(LFc#d>8j=0?>>N#ei|1``9PTsV0^S34VrmYucz*90X;;f+! zFvXTkDWGz~Uyxi}U(&k06jqA6B*FliO;CoWR86g*=uB)Tx>b*KlkLjdj2$F%gegC) zfhfLje6)>S*wCQ^%-nYu$h@V`Y?I_ZBy0KCy{VQuR4iYkkDcA6U|?X4jJ|i_baLub zP%83QNN)m-$g$M9O2G)$qp{TC3ofsr`75EtjTBh5zS*uDV*LoEwQ{?x)JJ^3C$Q9s zt4S%FqNDsMC{`4M+%Ah|1fByP3aJJ~VREiMNZUA8ZQv9D&(fMxGi?PP?PjfrE7wkP z+c$}n*OWYaRe^-iR@{5k+vD2%6-U5 z%#lN!|5 zQ<;wR8`f~s4<{gpqP@3-KC_v}*R7(2Sxi1zXQh1nhK%r_$Q zjrOrwc+d1l!3I8nPl+Z8?Ah@HD&J|fuZ*hoq6qJOmGrVe`Sm72l-bb{U3fCMF@e$s z6IJr8R|E43wOpg9D|?w^^vU|(?Sr(p43na&*_yuJX?9m4(@q7pAXeUeWsd#exd8OX zor`i%Y5`W&F^wL~H7u&25L188#3l<)102*&x{&R$Z4}#qaFh`CAmVmT-wUG}ff9&; zhv=-K%ffIK8d_(Kiim2H2p@w}h0nbB}LTJ>6ga{eOjYk^pi2<=_7| zhj`h3vB^^&{F4LzY{{*aq|(aawP%zRGh=AN8~S;8L$jW*f7o*#tDf&;?I`}g4+>ew zqgz64F1RvW-!aIoi#Ay+AwUT*693sT8raqYjG{X!qig**tiMW)me?2-bF)~(FV)P| zG7kS0oB&X&&Ma$LM4Sy503$T}E$Gt;gRKk1Q|hs&iwxVT%?@{|EJMtVR>*0(?yjPz zerxNzSx6^Q+Dni(O^Bt}^wbP=$-I0t_4;wdjD11TX3#hh>V=1G&S~$uHHm3NCVR_f`=0O~sL>5wv;I<$<#9Q`m`h5^Sa{#t&P4hpjZO`A*nH5cW9Sk} zd_OeSZO|o!$F+_u1SJ1Wy+<%ybt79yS9o_A*#fdPZ2!@>Leg{WG10Kk0q4}Og=lF< z^Fjw56FxcqoKOI}ue#;~Q_YblIWjGe)XoB{4dZhJ+K3a?@4wm+av+5jV>2Ux_!1B9 z%tULRPLq2HE-K+Tkz-4ijN^Hr02@r}#tSr1yo7x+;l?Thg^PnNf;Zx)k?66EM#E_h zadoyvUo;|k^pSHO$S%%Yi@rgp-kXjx`LR13DATZxICj0e?N2_&{GyW)x_>VRTGy_I zVY~t4de46$ma?ER6{hY*RdvN^-oay+Z!5Ccq*L<{tQ)(J+rn-wu=di?!>{N)cy7v& ztl+x3UzTfEF+!*lQa9F8b&u?9EIEX_Y+?xEM@1^T0baWHF#Nv#TNM zyCJ#_1-Z6Jg^HObEm6T0#}}wL?K47-gYW^lK9@G`aiYBq*}0V$rqMPd)q1Ij#VV%; z(p?U=SWqpL)%mLt;kJY5QRZXK1c%U-EU-B`sexaYX9ax-vV)Zava%Nq##%s{baO!^wQ35GSee!w9(UhV#lUnt)dMN!^i+>M zSQBT0Q=BTZ4fD^iCXS0vR3aK-)FGqj)H!HZPZryp#T6D))~j-a9*YSZMLqYWwarJ| z_y$v#+K*8IbnuW(^(Jbkbty(|eWzDSn&HM(pkOaknTUkv$>Qr1Q5hDc_26)YSZ{?v zc${K5`#)?@_r00bV3EZlkAr$}*S(pH8dm_Q2{FO5C#nm9wdZv&DA+}*p$xALOamlS z*tk)^UbTQ@Fib4#0&4~5{|u{d>MZGj|G5%|NOfjY9Yqc|nJ#p#0oWNhErWZ5m`O-Z z@8gYCOqLIjbTZ|-CK4$1tedJc)Xr1xrjg*SOiom(0}8t{D_FH1bj9xWSqDLqCYccO z(or4BW`@bzTho>~6Fk@}e=1?hF815p?%~T{M{f5}t>7#6I#1g`a-%p7xb^IxhL3x= zQaS2WGY?g~Vm2+fW+WX~REH*6G%u0{`wEc4M)>DP>oKIkyvn`0w3!u7{C9{>olNRX^z zTN>|0k8TnK5}Ap7e3|(CcP}=HxK??gv-H8)-Q}G#q0%Ueb-I3V_RZISc>j~L-#z@7 z&o4`O3?5C32WOXMx&7??{Q2|e%jX{~vwVGi_tQ^5J%54EoIU*fQpxz?=cO(ab^h@4 zjVh&xvb0ob`QWTnFUoU#?!JgFWnQTA0e?f_pzo{iD}DXo%sl>nx!bC%G@3jZf~PW}J| z{0;o6-FrA?;12jBucETbr9WqUHCAc1(P`t6dX%MjRHZcM_85ux7?NdE?Zj&Ts?d?- z+18KKT>o39Cr!m4mdk=#?u8ytg!qho5h=97!U@waj%FnNT$H zETO%i*Wn{M(vdnDA0 zNNt&uV&)T=0+0a~meJ_R{&lL5z!?&v%<`0f9?3kk z;qtC{hRY^(RcMs@Nn?COW56i>(SrM=UH}1#;6c-KqCD-=RrPQnD6lcPh8b_|7PocL z2KF4(nE$37NEUjXnrUY3UnU8t(wJ3Um9n-He=boW`%jig?)?v`m9-1h%Xv-6!f++* zRH=a#Vb1VTeE~cc!?u0}n+PWp&^lYt0aC9mphWJzcQ2qt_ym^TW)hEpDhItHTk{bq zSUmfmfVnPIRKkpqnM^Rqo?2}U6f;Z__b=bbJZT^P zG3umincyiyXLb@=rw*~CMCPWWWd&adj3NW0Aagbsz~_=#q3FXP8?oZim~6Yc^U-y=A33#(=8_ zFz%Dl%3utFHjlHx8MF+!xi)e|8yUf$_fF7<-r2F)|C9h_fEj1nxJTkzMQF?>&Q*#* z=2;AC8Xu6b+pgr@->MXCK=8AGy2_Z1D2W}a$hy0E2D)WK9$_TGgp4ybcRr8B2>!g;xo@Y>#>OX zqcCm4b{(9%(A$Q>f%m(47Z(QqSM*$iS@zW;oi)z4hFz zGJRi|UA#Y&2z>)Q#J;I9OJJYD;9yS~SnUV&Ds*AgTY}0@za$kLqn1lVy8mf|EDHnz z`r;|~=hd~ACRPVSUCN!v8qbdaxfW?wyX1GmlJIThlXs)qZ zf$#kqmL_3XI5P77*=88ajM;MZOz8!N4l<78_}^g*yX}^y*=CjVQEg36m}AS1qc1sA zEXIJOMz#t*R#Yp{U$KtVtXv~jzTltAF?4`-5Q(YRM|mW6*7ji1jMa?`oz#aZ1!LC~ zDRktiRW^I#@IBy_5+f{ZC&^ugoZupjvdD@BM_ojU#snI0ePJLg%KqBO`UalDkY!8< z4aHa~Y9OpNi6Pc$;Tscrx!0@h;DO&K87SPT5twiK0}-FJ$Lv(1YzIYIq9R9kV=DXP z{|2L)nX{ZgQAQxOsuAO~VNo`{WE8<)IeBA6EjTbfXjqL(n|a3!3wCswGwYb2>_9vU z6p{D&2QZ5-LAPwG=o0oNsX%|@a9J8RL+|G4&e(UzKfVZ_)1$|EeyNiX$=gHOql-;h zRYqio9(XF89E)?bZz{JLQk1#8-v3}+Nn~uwj>tr=FcbzOT&q?XtER9aS)4fmv=OOe z=`@!b(-%S)e+KJ)R>v~}C82KJo^?zPGI3Y|C>!en{-rT}2HOf&F}NN;VE+B&FT;k< z7HTT|z#r{*Z9U%uM*09*4D9Bz+9{947AD%w1}XS7U^0NDl4aP*ZAbG?*ckLk(e>`F zW^mTaak)&Ni?#-1x8W($(E>h3LwDWAL}&BJF{ZPTGnU=86fM8i=*^n$o@8IkX#X0d z)zheyx2U~W`=tE>g^Lg3Yc!4|a|_LQFiSvrnxqRU$x0@4Zo}ybW8i7rIC*Jyn3~ns z@E@KCncX?e%d!YLF+ltam1{gS10;k^k|}0)fIQ|9@s&QE@2t5C1qU_A5}X>2RQ!F= z{5V(4(ilSTUx6v=kApAc%ym(ckq-ZEf6@G#NCW@1aT%7p3 zlN!u%)SJPUDw-%}pI~H|EcpGH&BM?D9#=Pg_Cp-hpA{IGbwD*ccF* z5A%V~`D$sUK(Fp!f$4}OwwV(5AX$2tG3g33n;bgtH$`N?T&!I}dN)DWmh$M~ z)qU(Qu4_LyWtc{CTT}^W6Roho=4UA`vZ0k+!p8-!{V6~7(?$GTV$9Oukvo0j0c&zK zXibje!LdR2C+3_<0vcu1w2aD5e2q!ET9;_!v%%Hecw-v%+EmAL#wn*9aTT8?ps<}; z+)lfMcnRDiZS=pBl*Y=@vDcsq$$2AG&HxmoH(%ZF?!d2WcJ|Kdsp{eoK;zjsN9)oi z$i~klH7Mfaa=bN|Fft|$OjNB4w$y+<^kA4QJD&R$XUE2=0YX6#QZIhkSp%%*^yWX4V*8WnR@Ay1Ml*VaN4)`H>qq+-O> zkj7A9c|ri*m_ddW568?5X2DOMp0-mu6%3*b;d<4e3eZ&2B!Z!m;butpvkTql&&$83ZLmPdr(%7cm?{iF<&jxhq z>5FhgmpW&Jonvz)T-c?9j&0kvZQHhOJ0066M#px?)`@M~?l_s}t(mH+`80oF*Isw+ zUH4V%(tG%$bff#|^g-~);3=Ebe~iy_v{^z3D$@*%=W{&}&T|TkIZDT#4$a#h0X~+* zzW)Rn;iyBTv9n38K#JoE+vYQ+87`p{iYP0xO)U=~mGxYFq@BK!h0JT8Qbp}1xI?#7 z+0KCZ5&f#=qQvh_e6yv0g&uF2qi-&D9S@~Y@cI{F)bBCFK!b_JPv3gqLfogb0Gl0` zN#u%oIV$FtgDU5HvH;Y|l`UpkA~7oktp6WW;NOaV<|X*N8&irpOJ@4zU}5}gHTmNY zD_o7=DWL(H{C4A=#Gk^ABag-TL8Jj%MMzA-|$b_ET{vozk0JK_YKG6CtW~BV?kmtyVcnwQH zmZfc-KL2O+Ns()r;L1HZstQwWaz0yr?%(awnMv~A9{9_xHCh*<2sbQ_{p~0~{`Kxl zNxytFWo+OVqSa~I)#H8zoMe}Nb><$Mz2=7TCbEVTJdxSJor!FDCQp@Kxewh#vh+(2 zW&}K&3G3*mdG!|U0JiK5B(ljqoPnj7)FFHIzY(EyjmwFLcqKIP2L|RoB9-52`fw`X z(mlxP_$h3}NekiO>?PtPb|~f}{CGxN52V!79-^zNv{jxQW?kguWx;J(r$J^{gYGDa(1$2kaq2y!xu5PM1Gs)*KPlm!oSJe1Z_M?-I)&x{mmH2N4%Vc_ixCaftDAsGpO9qU*ybQVd$Hq33 zZN|Nu;*DWYeCQ}=B4Knq&vxEV#*gTLq~8>FewC8+jU|$JPZ<)(j*Q-SN__W0*%f1I znVb49N)Ur|ON9H-CxkIua&{MhM$9FvV{?GZoQx_nzR-_VyL_Tu*E@wpUbdxD`NX6plOzk5+ni%stsyAQ7;%Nb8 zHOb5@^zf42eH#`2jsTC4{qZg=KH7*?7cuKy4Xio0Zfy3@IRi?H>2>5-gX5ck%Mci) za(GLQ|J-=qiOmaXc_!6`9b}8CZFz@Y;qD)Q1{(@DE7=9d()8IQp}zRm{*6Lr74DwP z*hdOiYDWqQ2K_f{;jkV^qJnDVfr|n8NdTBKYo%z|SC8R<<)0frD#?Q{NEa8&Dg~QH zFgVY}7#U%T*;ULj=<2=*gC#@VWv1<-U_Ku~IHD^aJ<>FFVG$XF%xY#2T*QJCXNM;< zC|z@J*Vu502#Yq>kY{6!eHgvfYIWa6AW?V&@S0KBBdmJ|Dc&(l!py}bo-8{ON)f3V zqH?`ZO``5%@K*GmN{vRh03DIzJj_!e?`6OmGkFhb9a6oZ>2(bVzN&6VkCv>)>K|qV zVqyG5u^&wZPf!*h;8BlOY$5y*=&EWRBhmt3c;-llV~LZcYCu9iaOhTvY)_MSUFxv%rwq zEyZgp!phjIa>N2<$k!xrLlEORXipv1nQq~j6Vgfok-EPS=FZKd{Gdrv#$tAZOv^}S z^OoV?}3YSA+w`r@7Du+%qh|z)g9dI!pLvy`q4i4#(3!SL1h$Ck9 zneKVTvd#nn|Mk``ZL@k!ZzCc}9E(v^V4QqE{}$nLlP9|Bl&$U2;fQ%HmLwivxu8i= zq;%RoE1Q~&wbtz|L!-u@dbb$E4WLFRD~P8`{ag015CuyhDw9#?p)*qJ(*7)J70VDy zX4(eR{j@5nw*v9gYWvA_(D&_kao0j38tawv&?}wsJJ5&iT0f=l;wRrr|4$j_?e8wv zZF}@A(&j1kb>I`Sbt5e^4!6@Kd6b|0pcPSq4epETLk=6$A?eHj;mDRX(G~3GT>J_c z9CBGC?spsn7(*PL(G;XgsTfgvyx6<=opoq3Y$K)W%@QgBXTF5F?}8^mD;&woPm)W+ zJ?s?e5;SUUQL4-^5c#pH!zNudi_v&VtFbMVevAWVoFw#}rnzmKKYIhGhy!+8ttTSY zI@Rdk6Vh?vS9{rSL6w zgaAjcMShi0|L;A+%0atypv|sjJP$%> z3D%p@ma@w0#sFQfH@Q5we6B7(%38)M!sk;BL^Yh(=v~cvBYdT0){2s6$odJGEjL&9 ztpyOo?IoHvk!wwZ%o=@)x(yl!e*5gMy;cOka%Q0A@6lsT%5nzz@1s%+L%2mfUCfqZ|hX;e<|zbCv7WI z>OiX0Yq3hO2|p3kqW{C7M2j%~!Y#mgM6@}&TC0~VIdq?Zy=6e>vAqXWA0)|a0bbPj zC&OUk#WiMjDodmnJ|kz19JN7s8ArT`>t&S@3eVC5@!*Mbl(T$pvm?Vu4(3ZtCbiY; z^UDs}z$iT3{3AxgK{?u#Fa}+gko14j?h_GdC%J=#mELIeEii$z~~n@&12&7Yf2PAtn*Y86vn%{S=f$)DeUn&IW_M){R|$Yd(db2)I`yMBE-{E%Wy7HEFj+!(YHk!M!|oYPbVsg7qY~wUwND!v;KM#wN85Z-Qbf zh;X1Esww)&HDJ}oj~gK(P2=aqVMeRo(L zFXz87L+7t9`V#1!X-tGhxna8GSR$_yyQ|IDVE+SxlN4zgXu4{<9biy-)S1V7cVhn0 z-=$?wIDnMCk~tM>(fb2BL_V#u(fF*XMdo%WFu&VNgpR=R=a;cSTeCPpHcaahrxHY$ zZI0@XuP`f<16&^qo6>*`te^VfXh+&ezj7ZjRrW-j$*}IM^U zgKkgM(rlgd#Ry;4{w4eW&?`v67GRV31p8LW_3Ibz4n3Cb)dq(WsJp!qT{Nppdzt;R zIil61n4#(|TwHV~-l*kV%h%iBJu52xCr-1|Z#P1P3(Oi~t#gy{pd`x)e!Br-i0j6r zf7Ujza?50Gt$rn^kxmE-)y;U!&!2Oat`4o&FeY(Ag=655Tknbil3xjt(RhPBJ zoA<8h9fdp_kNL?3lg_T(?-A^5MrOD3{Gd0P&Vo$p@7md1TJtR6jPSCHux+k zhdhL+-SC1WA(h*&OG66W%!uL|e<)zy-fX#h%g&zD#yTdpla4Si7-gpu+{!z zG+;{W)KzQ(qz@%&1b@&a8cwK*Ncr!jxpJGLLGT!DdF{US5mZn;q{ci9k148@v8aAI zu;Zw&EwAe7NfnZtB0A600W@FkHG#;7TO`P)^B*}5XAp1A)@e-xM1JbHTcdm5PUSUq z3_4G4%zbPClsRMie9CDh{`SGaTQ0+uPMp`WOl&Bi)VxQffBI^Yxa1!STWZ7Hn)fQV z>I4YDGoJKj+`X;+`0YcBM!Tj;@DuiK=DJG?{W`pkG0(N6h$oBcWvq~0T#WG(8d;aG zHF|?aR4}2d%B(cxj_ANoA4NBvlb>6jzF*SpuEZt^f2FPc(Ci-npGHnx0A&WolRluz zDm?<8K3{~qeSvE-c=br+zLVun0G~f4>T|ubY`2`(YpeR=VvNUFCenfWE7r#9&xwMu zgJAYD_dJ$1L^tEDP!`TG8+B8kGO}ZfP1y*znl6K7Bw>$=Tb#Hxiy3;}5t_w|nIqO- z`#C^Bo08LY3u8SS=oQ6j z(h`&|{zTxdAHos~EgZr2mTIkzgDNku!V?ok<3aD9z3ytA@RC!#?y85v*6Cy)7MchD zS-O?XthTZ-IPhln3%-~~sSnESY^Vq*QrGAmR*?I^8bK06*0;gfj<2^b$gh`xu^B(y z&|VAWwbd&eEU&SaFzwy)A>E0q*yxaW40$I$_9^&JIrbNn%|n|P_|ATK#bj{L*TKXw@V!T~C zE_sfLi#gw%39?N)s+yqqtuHG*hd}ygqnO@#Q**68fJ^XKi5PU3z&Sk98D-4 z8KeIkO6#bt>xjb9J7q%n!0atdkS;xeznN>%w-Z-!>{Z8Bo%QvCOlQm8)@2XtgP+xj zWM1mmD#US=GuG6l7TI^gP03CTxBo3qQ1u}=g5>N{W$tfga%?|tPXNB7h;~#Tyn%#X zfC=jA2g-%7&ulRy>cE}}UN%JS4xNYo`2Q_+8=-JnqR4t@L58^Pk?~N*fKLm+V9l~5_{d*`kx6^n6 z&H_pR z>m&j{?ClYE&D4iWgL|#EA;i!LaMSs~8(ST&MK=qSIx zwla_Pz=W!!mj0^t3jf}W>-V5OkKDn^u1KU5aYt1{B}E&*7_y~}9}O8fQfX@2+*0Nn z>G?H};lLJ%vF;=2bg=agSybD(Xj0L%w)@I3zqy%${OdB)uJRrKt)6G4n zSt_0TtKzqLyo;7`fBc#E^V_d)_j$8Eo%}*wH$zRf&jS05|Hib;KaQW-AT&nZKUkI> zb1mfTlWP8$TWj+;d^SJz-&+gsPqJs4YkR)0p(Go(+2EwkYeFeIHo6$A?~x;fL_CHh zU4_(?>;aERKq$%jM6==+==NTy=pHH?q{KBVq8g@Zd_05e1i*1(P!%+BNxKzCKz6Bc zLT-;_nSdk1sli0S8n#7j0|0nKBw?C99SQ)K0_qZcYtHdhsD~*?V%&)M=LfU?(&R;O zn8ZD+Q>$jWPtuI+6vx*hFqwKJ8LC@Ottl=8T(V7VsIB?%X0SbvP@j*w?`-)am>vQYdRuO%!aq&OyWn}+Rie-U$N&G zy60d*oQkmdp_|u3c+N&2Y;?sHtKPA9P&bj6{)*RvH%&Vn@XFO;m@%)6{&m`V8`G>N zV6a2zmsz8pqi-xvUo(1-ON8mSbCW9#GHjbM<`tUWw-Gc~_BjDV$vh(oXQ|YL_d4W= z`WIJ!`*SFc(&e94HUJfjDbiuZ4vTa0{Z;^r;L#=rV+l~;(Nnmy9Lu= z5!9u`8IDKIXf~E$@u=y@v-FeheU@M?#Wj6|@0G5-Z=(6ssLN>dUwN`D>ihlnZhmX; z-6mnKJ1DDRpdU#qmgSgFZl=rW_{%7K93TVkntluput&mqdiQgpSLRM*+m}ds{WW>{&gK%}C ze?`R3$J!<~kZV@H&Lml2pbNy~cFWg>LfKrNzQ`-+Dxqomg>lX=jyy*t zEon+AF@jfu&Ly+c4-!$24N(qpx?dMrB8ORWrl@?;;M^in*9?S^Oy`q#s>#}2z9gOG zEo-KBv^OZuwCPx!nI`pT{esZ`tHx~B`D@4gWM_Ek$*!0p5niTo+~FnPh~)ygnx+5d zqW1;OE?bqAcCH^h`KVXH)9O-&=#azg@Id#WnXZ`(0Z;5%BQ5Euym!u@bAwc2zb-$N zI?LVMYz{OjxBJ>y0Agq=XhEUH6Qv^T?2R(ds77alCfvENe!;4ul|$i}H!(}#+P|+m zK|OoAo8}-Tb>F>bz};tmEsb;2ZT;JQ5 z9moGB?zROc67Z!wy@Dhfq)`8&S9f);Z~ZCjPqy|0NuZWSzY3AYRneGVma($Pa4lLx zmC7plLgL)xS%5?W-~LsgA5_eAuSZHs)?P7nQA6mAXzrzDG5T;YvYDwQ7|;VhLYMwW z1V8UeVHCPb<}Q9AwWpb0Z+mz5=lkP!Y?mnh z(7aKo!|QhE+s@zec7V!Cc81751wyCdACZ5PIsmpU^cV%(m(Uv$HKyPWqDx={! z=mw4dRQAq@WSDn#KIUY3O4q7|cSz)l6CI?gf<10cGBdIY(9Ii=`k{82r(H)&)~`wx z09aYMgx=<~hKoGaAJD6mQ~4d<2WIC*(k=_lqya~p*|*W6VU_;HAieym6RrOr=I)Y_Jl9`LUkvE~= zlW#gTKWln+`9H1nb*F2A*S?>spsf~a?z=o>ncYwE%(SVtR};W?2!unAMHVTQo~AdNw=)m+@OLn=3(gX zP%X`l(DFl?++Nu|2JRwuBsOo!3N6;DdkK`z$Apm*cC{HdW?5_?1wZ&-#v$&3x9a+E zPaI!hTKOT?AaNMe5Q;zPehGQfqVl~F`;-1bR=JP39|lW6>dB&MOtSL2Jw4&%(p2o2 z)<&ar*fA`!lDR7n!ip1F*AFxa7Xm4u|Czo=2}Hah;-XZ3?BLQE2V@Gg#hKMKW0F4F zCkCev#BMg@vR#Kc6~r_cERJJ{#uD_JBu>ps=0Sa$HB>)$k9Q9SlFum(L}z1O+aJ;@ zWyF+b7Sy>iR{ z`gQcY?2&co2gv`l3jBh@Xh|@&7Z5OH_LAkElxBDuc-UItdPyf#W5pglFd-1d9k}o0 z=x1<>z|&u4*A^e3sX?I;=~Qig?)t9?-kvPgJ2n^V)V8#^gLH{Z@qss1p#R1G{p3WU z{L*XE27lBS$=gg0`J+~wj%rD*_x=c)wqLf zcWK~VHyPzlbmFZ5UivfNsqEDC4IA)rEH=q%fw=6gv)MQ^iqM2WO2a+oF zmt6PA@uTR*FXCN)I}`9&vNE=ki5=8krcqcBC0fdI%GIo*87>NQl9zl;Gg<79*C0qVYy6tc!F zx#r3Wtgjn`n)_t>0paXaQOKJp3MIfEkQGiX?=PukII{_9bSgRU2XPdVFdt~vQV4YM zo2?WsQ3-@Z~eziJ4r-M0gn$iQyTLU~b)M3IE+Icx7hO zs1euwDBZ5Xi$VnA9IZ3$5F(UW zwopJN>j%7zJW9o>POvM>b=ebQwX`p)H`rY6IBH@jSl%Nuu{;i2t3M#6!G|&5U&9{^ zi9zJpMpTL06WK}CblgTJi%UCZiG>`0CF;GRrrCNOb%q21L_NC7o?Uc&KS$6WFzN!m zI3ma|Qj>SAYZ&ZgB7uW!6^zNhsu=0Wv6xJS69sCMgfmmt$ZU^kbx5O644|Kz3i%*8 z2ZK`owT=D+F zf;X%Vh2W^5m2Q4UJ2=6BILRleCbSVF)YOTjW_dOcJNW~lg zTV`_$XR-TU0In0p|C!@pV}H%AKSOGHv9f-RB#M5cjP47v?aR$kvZ94QKP;(A+*4!& zDr{j~TRn~rIC|i~JH50rmJn!3b!~RH)W>_oYJ~caVDDPQY!Y|{HFK^7W?X>)BZowF z{6D&y@qA(V5trxq2fqUG%t34lPY;l8 z*^+J%VUDoGz+MXq{3Z6%Z}}FxxyYk-uOK4}x@SQcyHUl2z4^Pz>o9;i_|xWP#rx0s za*?lvwv=u%ueage6klGf)a~RYWEHPu4ng7$LYM=jQc{zC0mxyt#Z*)Wz{21k0x|D! z#P&W2Yow~E6|#m1kT;?@x|<%zr^1+%91*}tY99;;Qk6m=?aght71&TN6gn{uBFq)% zwzX6tp=PzXuM6o;ZWI>PU_};{<`{mOuh6jc!2WLxrq`EN6aNDGV*>szFXn~B&w`hc zLt#EQK5>M9QLcUMFMB!k&|x?+&J$PiMTe=PALa>l?w%65P-46zEuNc+K9pSPiGuZuqy$s=&i_B z(ZddruGz-?P$6uwrx-6=){Dkxg+*6LII7BFEhxMoEy>WN2`XY1PyQRL@Q0h;vf|t95i-o8cynEty6U=nw9!To?0CLA-1dSJk+rg* zLBM+?sqfcFkscQ>Ue!xQ$(1gGb4n?DH*4=qms<}5a+7a}4il}YEo@ZMf^>A-n4+E2 zs2-C2u(^50TRE_WLhHlu4T50MF;S#DV#fcZ=fbZ$)AAJnJxUs~^^o z#fil=3~r^vQW(>V6ZI?bOr*`CrXF{H_gz?Y#@K5*!gh$inqtKQ``ldoqLnbeu_Q1{ zDUHyHoSN}?rmIbrmsL{k$`vVc$2k8)4r$SWHd>PLMCD>YbUsF@SKF9ISN$Bv_Z} zkx2PQHVnv>aL2WgC8Kc#Nm1q_SaP+cYD1cuXRD#@-jo!suX{6o=mN+jk^tV%d->!B ze8LJ$6}At5o<_aMcqpLOU78XJq?=R`RZnD6tdEiLVEGrd&jpNp*p3LCn8Rm2Xv_vo zj4O0J+#P{gR$ICzj-=Ax2lvku+g}h~P|_4i^bf67QBqRO)|K?=j`To&_H?~~Jo;hL z-iJV8V%2*xJ8pX2anfdnG1)8@=09J-%3^6RCwBzM`7Y&EeAx^>28!%92vSh zp`mbczO!)kfrK=YsU-Nx9-82utb|jg>m=m^bz)l&E@|DY>BmvDE?q#p_TiPjV}xQK zj^7{sBck$rJex|>|Y5B#!#-?UjY^iDKf zDnaZZZ*!unI}67Sv~i$z{SdG(No}hRHPq)l02`SdNAb&lVz>^3z8@aHH|t|BN!n0Q zoYHe6Vz@bE#$O@vD}gi)i>u?2atOujsn}_Y>StnO@@WS?8E4PlIV0wwV88=QDn3_o zyf=f?-Eod_mw7}zUpkUs?hOf5)TT!Zm~E3%=oDyeyYboQFZCq!7qL><$&lD`qJlX3 zr*f?8BoX#O&)tH#3fMP6Z=zmyLwQ61>D<4_My-Z_Zd04e4S49Dg#iXu>h4w#u(6{L5VC0fE*iBB)+meK1$sunR z;k!(Rg*02MOwtec3~YtdUOfT#qa_b8^N)iGwMVS8GU@yn>6(=Ek5|;%t*+?S0(?*Q zswddCTPv3)IKsgzcKbj6R(DUZ>9^qdTuzK=v|5l5K&<6=5HYY*Amf$G*o(n!E(t04 z`XM#-V7deR2&gPO>%c6=ER&s_1)l!MU^*_ERu^Cjowm2ar>1^wsq>J^=y|;%@@?^= zd#VpjosnHEO!yjSHgpGTxk1AHKNWwSTEw>4@s!Zw17fMvNP)3%g8s0XrBQrv1b#j8YqO^nESC4C^9NPO^6%=e7{mGG!@=r=h352#097FJrVq>N z8Y;d0DQ7f=Ia?KBAO5b>IbtB2{_9FG?$ z0i_5bs$!712~MgiVo}DI7)<}F46U>=FydJel5pVQza^&J@fe&{e9$V|VouZcOzFN< zlU1ztE9}YAkcr#&_;*T>)2(mzjg!rXOM;jI_@9$cfY*DSreUb>S9yGS${$t?synpa zx58c?a3VaeNtFPVXOcRl5lT?*TrI|6PUpvrM#oZ?3Ue>=corC zgYe#9`R_$!7jOfUd4sWQ*u-M#@i)hoEs+D-&cX7W&`l!Fq3XYxuo+lkp~o;a0hlK= z8BSFo5oyp>?Tn-Htivj(dPdZ$e# z!>~K2_PvEcbo%ln%6k4=Hic3|Nw94TF%*|G!wcvSW4{r)AqOLt+T_WMH*?E8kvArv z((!<|IN&uZ-s>q+{YsP|eXuqg<@+1Mw)u6{fcz1o+(@`ioNO7PMdqR=U+0ju&6ZRz z0VT5esvwHN;QFRY)CsTB$B$qcvW;pZ&z2ft#OG$P+){L`AL4vclZuF7Tz5f^p2LM& zgy@xUTG~K>;#uxp>Zg&Op>$5)tl#LB{v@0-w`hkYYfTHYzp-@i_}AgAbQHYBQ+>#; z`uTTE#?U44eh!!p?ef4m>Fz1rtv1qR3`$4cqDBoJ$)CERbzSs{)vIak4RbYjUV29X z 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 EKL}aMc>n+a literal 0 HcmV?d00001 diff --git a/es_es/berry_rm_es_es.odt b/es_es/berry_rm_es_es.odt new file mode 100644 index 0000000000000000000000000000000000000000..0e8e100de961f8c3016ae1d60f7b4d25c1946014 GIT binary patch literal 156328 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 x{4jPyo*JY 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⪻a}m&Fb5M2%>>LTh?mqE98>`+FcG&>s>( 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

kvT@H1RG3wr2NOZs`*ipEh938^-98P_c<1%2 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

X9#e2OhVD?xtU?Qexo%A8I%p1Mz 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 R;hz|+6AWODGZ<~yKLP5_(+vOs literal 0 HcmV?d00001 diff --git a/es_es/berryrmeses-img001.png b/es_es/berryrmeses-img001.png new file mode 100644 index 0000000000000000000000000000000000000000..309f8b13d95a9f4a3613131c24f1171b7055d9e0 GIT binary patch literal 13072 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 Date: Fri, 26 Aug 2022 19:54:55 -0300 Subject: [PATCH 2/2] Update README.md --- es_es/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/es_es/README.md b/es_es/README.md index e69de29..67201e2 100644 --- a/es_es/README.md +++ b/es_es/README.md @@ -0,0 +1 @@ +The composition of the texts was made from the ODT file in LibreOffice Writer and then exported from that program to Latex, PDF and EPUB