From 5b64f0229b2a5f850726028a9b93f1499f656c3d Mon Sep 17 00:00:00 2001 From: Danilo Pedraza Date: Tue, 11 Feb 2025 10:27:59 -0500 Subject: [PATCH] #86 - add numeric tower section, allow precedence table to split --- report/ref.bib | 28 ++++++++++++- report/report.typ | 102 +++++++++++++++++++++++++++++++++------------- 2 files changed, 101 insertions(+), 29 deletions(-) diff --git a/report/ref.bib b/report/ref.bib index ba907e8..cb676f7 100644 --- a/report/ref.bib +++ b/report/ref.bib @@ -41,7 +41,7 @@ @online{perlregex urldate = {01-08-2025} } -@ARTICLE{softwarevocab2010, +@article{softwarevocab2010, author={}, journal={ISO/IEC/IEEE 24765:2010(E)}, title={ISO/IEC/IEEE International Standard - Systems and software engineering -- Vocabulary}, @@ -109,3 +109,29 @@ @online{mpfr url = {https://www.mpfr.org/}, urldate = {01-31-2025} } + +@article{schemereport, + author = {Adams, N. I. and Bartley, D. H. and Brooks, G. and Dybvig, R. K. and Friedman, D. P. and Halstead, R. and Hanson, C. and Haynes, C. T. and Kohlbecker, E. and Oxley, D. and Pitman, K. M. and Rozas, G. J. and Steele, G. L. and Sussman, G. J. and Wand, M. and Abelson, H.}, + title = {Revised5 report on the algorithmic language scheme}, + year = {1998}, + issue_date = {Sept. 1, 1998}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + volume = {33}, + number = {9}, + issn = {0362-1340}, + url = {https://doi.org/10.1145/290229.290234}, + doi = {10.1145/290229.290234}, + journal = {SIGPLAN Not.}, + month = sep, + pages = {26-76}, + numpages = {51} +} + +@online{pep3141, + title = {PEP 3141 - A Type Hierarchy for Numbers}, + editor = {Jeffrey Yasskin}, + year = 2007, + url = {https://peps.python.org/pep-3141/}, + urldate = {02-11-2025} +} diff --git a/report/report.typ b/report/report.typ index 719dbb3..c2c41be 100644 --- a/report/report.typ +++ b/report/report.typ @@ -1394,6 +1394,49 @@ Se planea implementar una estrategia de _mark-and-sweep_, donde de manera perió == Conversiones implícitas de valores +Komodo realiza conversiones de valores sin intervención del usuario, pero con reglas simples. Estas conversiones en dos grupos de tipos. + +=== Números + +Cuando dos números de diferente tipo son las entradas de una operación aritmética, una de las entradas es convertida al tipo de la otra. + +Los tipos numéricos son `Integer`, `Fraction` y `Float`. Cuando se realiza una operación permitida entre cualesquiera dos valores con estos tipos, y los tipos son diferentes, se realiza una conversión de acuerdo a las siguientes reglas, verificadas en orden: + +- Si uno de los valores es de tipo `Float`, el otro es convertido a `Float`. + +- Si uno de los valores es de tipo `Fraction`, el otro es convertido a `Fraction`. + +Estas reglas abarcan todos los casos donde los operandos son de un tipo numérico distinto. Las reglas implícitamente implementan la noción de una torre numérica @schemereport[p.~19] @pep3141, donde los tipos numéricos respetan la siguiente jerarquía (en orden descendente): + +- `Float` +- `Fraction` +- `Integer` + +Aunque realmente el tipo `Fraction` es el que puede expresar más números de todos los tipos numéricos, operar con números de punto flotante es usualmente más esperado y menos sorprendente que con fracciones. En efecto, así lo hacen las jerarquías en @schemereport y @pep3141. Esta es la razón de que `Float` esté al tope de la jerarquía. + +=== Caracteres y cadenas + +Cualquier concatenación que involucre un caracter tendrá como resultado una cadena. Es decir: + +#figure( + ``` + assert({"ab"} = {'a' + 'b', 'a' + "b", "a" + 'b'}) + + + ```, + caption: "Conversión de caracteres." +) + +Esta regla también aplica para la concatenación de un caracter consigo mismo, usando el operador `*`: + +#figure( + ``` + assert({"aaa"} = {'a'*3, 3*'a'}) + + + ```, + caption: "Conversión de caracteres." +) = Aspectos periféricos @@ -1947,33 +1990,36 @@ La gramática mostrada es una referencia para describir la sintaxis de Komodo, p Esta lista tiene todos los operadores infijos de Komodo, con su respectiva precedencia. Un operador con cierta precedencia va a ser agrupado antes que otro operador con menor precedencia. -#figure( - table( - columns: 2, - [Operador], [Precedencia], - [`:=`], [1], - [`in`], [2], - [`..`], [3], - [`||`], [4], - [`&&`], [5], - [`>`], [6], - [`>=`], [6], - [`<`], [6], - [`<=`], [6], - [`/=`], [6], - [`=`], [6], - [`^`], [7], - [`&`], [8], - [`<<`], [9], - [`>>`], [9], - [`-`], [10], - [`+`], [10], - [`/`], [11], - [`%`], [11], - [`*`], [11], - [`**`], [12], - ), - caption: "Tabla de precedencias de Komodo.", -) +#{ + show figure: set block(breakable: true) + figure( + table( + columns: 2, + [Operador], [Precedencia], + [`:=`], [1], + [`in`], [2], + [`..`], [3], + [`||`], [4], + [`&&`], [5], + [`>`], [6], + [`>=`], [6], + [`<`], [6], + [`<=`], [6], + [`/=`], [6], + [`=`], [6], + [`^`], [7], + [`&`], [8], + [`<<`], [9], + [`>>`], [9], + [`-`], [10], + [`+`], [10], + [`/`], [11], + [`%`], [11], + [`*`], [11], + [`**`], [12], + ), + caption: "Tabla de precedencias de Komodo.", + ) +} #bibliography("ref.bib", title: "Referencias")