├── example.md ├── .gitignore ├── cinca_reglas.md ├── README.md ├── diez_mandamientos.md ├── guida_para_lectora.md ├── capitulo_03.md ├── capitulo_01.md ├── capitulo_02.md └── pequeno_schemedor.txt /example.md: -------------------------------------------------------------------------------- 1 | i -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | .#* 3 | \#* -------------------------------------------------------------------------------- /cinca_reglas.md: -------------------------------------------------------------------------------- 1 | Las Cinca Reglas 2 | =============== 3 | 4 | La Regla de Car 5 | La primitiva `car` tiene definición solo para listas que no son vacias. 6 | 7 | La Regla de Cdr 8 | La primitiva `cdr` tiene definición solo para listas que no son vacias. El `cdr` de una lista que no es vacia siempre es otra lista. 9 | 10 | La Regla de Cons 11 | La primitiva `cons` toma dos argumentos. La segunda argumento por `cons` debe ser una lista. El resulto es una lista. 12 | 13 | La Regla de Null? 14 | La primitiva `null?` tiene definition solo para listas. 15 | 16 | La Regla de Eq? 17 | La primitiva `eq?` toma dos argumentos. Cada necesita ser un atom, y no pueden ser numero. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | El Piqueño Schemedor 2 | =============== 3 | 4 | por: Daniel P. Friedman y Matthias Felleisen 5 | 6 | Eso es un libro sobre los basicos de la idioma por computadoras se llama Scheme. 7 | Originalmente fue en Inglés, [puedes leer el original aca](https://7chan.org/pr/src/The_Little_Schemer_4th_2.pdf) 8 | 9 | Eso proyecto es para traducir el libro hasta castellano. 10 | 11 | 12 | Table de contentos 13 | =============== 14 | 15 | [Los Diez Mandamientos](diez_mandamientos.md) 16 | 17 | [Las Cinca Reglas](cinca_reglas.md) 18 | 19 | [Guida para la lectora](guida_para_lectora.md) 20 | 21 | [Capitulo 1: Jugetes](capitulo_01.md) 22 | 23 | [Capitulo 2: Hacelo, Hacelo otra vez, y otra vez, y otra vez...](capitulo_02.md) 24 | 25 | [Capitulo 3: Cons lo Magnífico](capitulo_03.md) 26 | 27 | -------------------------------------------------------------------------------- /diez_mandamientos.md: -------------------------------------------------------------------------------- 1 | Diez Mandamientos 2 | =========== 3 | 4 | 1- 5 | Cuando estas usando recursion en una lista de atomos, `lat`, preguntas dos cosas sobre eso: `(null? lat)` y `else`. 6 | Cuando estas usando recursion en un numero, `n`, preguntas dos cosas sobre eso: `(zero? n)` y `else`. 7 | Cuando estas usando recusion en una lista de expresiones-S, `l`, preguntas tres cosas sobre eso: `(null? l)`, `(atom? (car l))` y `else`. 8 | 9 | 2- 10 | Usas `cons` para construir listas. 11 | 12 | 3- 13 | Cuando estas construyendo listas, descrubes la primer elemento typical, y `cons` eso con lo recusion natural. 14 | 15 | 4- 16 | Cuando estas usando recusion, debes cambiar por lo menos un argumento cada vez. 17 | Cuando estas usando recusion en un lista de atomos, `lat`, usas `(cdr lat)` 18 | Cuando estas usando recusion en un numero, `n`, usas `(sub1 n)`. 19 | Y cuando estas usando recusion en una lista de expresiones-S, `l`, usas `(car l)` y `(cdr l)` sino `(null? l)` tampoco `(atom? (car l))` son verdad. 20 | 21 | Cada vez es necesario que eso es cambiando mas cerca el terminación. 22 | Necesitas probar lo argumento cambiando cada vez por lo condicion de terminación: 23 | cuando usando `cdr`, el condicion de terminación es `null?` y 24 | cuando usando `sub1`, el condicion de terminación es `zero?`. 25 | 26 | 5- 27 | Cuando construyendo un valor con `+`, siempre usas 0 por el valor de la linea de terminación, porque agregando con 0 no cambia el valor. 28 | Cuando construyendo un valor con `*`, siempre usas 1 por el valor de la linea de terminación, porque multiplicando con 1 no cambia el valor. 29 | Cuando construyendo un valor con `cons`, siempre considerar `()` por el valor de la linea de terminación. 30 | 31 | 6- 32 | Simplificar un función solo despues de es correcto. 33 | 34 | 7- 35 | Usas recursion en los partes de tiene mismo forma. 36 | * en las sublistas de listas. 37 | * en los subexpresiónes de un expresión. 38 | 39 | 8- 40 | Usas mas funciónes to abstractar desde representaciónes. 41 | 42 | 9- 43 | Usas nuevas funciónes para abstractar los patrones comones. 44 | 45 | 10- 46 | Creas funciónes para recoger mas de uno valor en una vez. -------------------------------------------------------------------------------- /guida_para_lectora.md: -------------------------------------------------------------------------------- 1 | Guida para la lectora 2 | ================= 3 | 4 | Debe leer despacio, y con cuidado. Debe tener por los menos dos descansos durante leyendo, no leas todo en un vez. Lee los capitulos en lo correcto orden. Si no entiende un capitulo entera, va a entender lo siguiente menos. Cada pregunta es mas dificil. Debe tener poder responder a las mas facil antes de hace los mas dificiles. 5 | Eso libro es una conversacion sobre programas interesantes. Si puedes, debes hacer los ejemplos durante leyendo. Software para hacer la idoma Scheme es muy disponible. Son pocos diferencias en cada Scheme, pero todos son basicamente mismo en todo mundo. Para usar Scheme por eso libro, necesita definar los functiones `atom?`, `sub1`, y `add1`. Aca es un definición por `atom?`. 6 | ``` 7 | (define atom? 8 | (lambda (x) 9 | (and (not (pair? x)) (not (null? x ))))) 10 | ``` 11 | Para saber si tu Scheme tiene lo corecto definición de `atom?`, proba `(atom? (quote ()))`. debe resultar en `#f`. Eso libro tambien puede funciar con un lisp mas moderna, como Common Lisp. Para funciar con Lisp, puede crear la función `atom?` como asi: 12 | ``` 13 | (defun atom? (x) 14 | (not (listp x))) 15 | ``` 16 | y las porgramas quizas necesita estar modificada un poco. 17 | En capitulo 4 creamos los basicos de aritmetico usando los operaciónes `add1`, `sub1`, y `zero?`. Necesitas crear `add1` y `sub1` porque no existe por defaulto en scheme. 18 | Eso Libro no tiene definiciónes formales. Puedes crear su proprio definición, y como asi es mas facil recuerdar y entender. Pero debes saber y entender los Reglas Y Mandamientos antes de pasar por ellos. La estrategia para aprender Scheme es en saber los patrones. Los Mandamientos son patrones que ya veaste. En el principio del libro los conceptos son sincilla, y mas tarde expandimos en ellos. Deben saber tambien que todo en eso libro si es Scheme, pero tambien Scheme tiene mas que pueden explicar en eso libro introductoria. Despues de estas maestro de eso libro, puedes leer y entender otro libros mas comprehensivos sobre Scheme. 19 | Estas lista iniciar. Buena suerte! Esperamos que puedes disfrutar los desafíos en los siguente paginas. 20 | 21 | 22 | -------------------------------------------------------------------------------- /capitulo_03.md: -------------------------------------------------------------------------------- 1 | Capitulo 3. Cons lo Magnífico 2 | ============== 3 | 4 | Que es `(rembro a lat)` cuando `a` es menta y `lat` es `(cordero picante y gelatina de menta)` 5 | 6 | `(cordero picante y gelatina de)` 7 | "rembro" significa 'rem'over un miem'bro'. 8 | 9 | ----------------- 10 | 11 | `(rembro a lat)` cuando `a` es menta y 12 | `lat` es `(cordero picante y gelatina de menta de sabor menta)` 13 | 14 | `(cordero picante y gelatina de de sabor menta)`. 15 | 16 | ----------------- 17 | 18 | `(rembro a lat)` cuando `a` es `pan` y `lat` es `(panzeta lechuga y tomate)` 19 | 20 | `(panzeta lechuga y tomate)`. 21 | 22 | ----------------- 23 | 24 | `(rembro a lat)` cuando a es `taza` y 25 | `lat` es `(taza de cafe y taza de té)` 26 | 27 | `(de cafe y taza de té)`. 28 | 29 | ----------------- 30 | 31 | Que hace `(rembro a lat)`? 32 | 33 | Toma un átomo y una lat por su argumentos, y crea nueva lat. El nuevo lat es similar a lo original, pero saqué lo primer ocurrencia de el átomo. 34 | 35 | ----------------- 36 | 37 | Que hacemos para calcular rembro? 38 | 39 | Primera vamos a hacer `(null? lat)`-- el Primer Mandamiento. 40 | 41 | ----------------- 42 | 43 | Y si `(null? lat)` es verdad? 44 | 45 | El resulto es (). 46 | 47 | ----------------- 48 | 49 | Que sabemos si `(null? lat)` no es verdad? 50 | 51 | Sabemos que debe ser por lo menos un átomo en la lat. 52 | 53 | ----------------- 54 | 55 | Hay unas otras preguntas debemos preguntar sobre la lat? 56 | 57 | No. Una lat puede ser vacio, o puede contener por lo menos un átomo. 58 | 59 | ----------------- 60 | 61 | Que hacemos si sabemos que la lat tiene por lo menos un atomo? 62 | 63 | Preguntamos si `a` es igual a `(car lat)` 64 | 65 | ----------------- 66 | 67 | Como preguntamos? 68 | 69 | Usando 70 | ``` 71 | (cond 72 | (____ ____) 73 | (____ ____)) 74 | ``` 75 | 76 | ----------------- 77 | 78 | Como preguntamos si `a` es igual a `(car lat)` 79 | 80 | `(eq? (car lat) a)` 81 | 82 | ----------------- 83 | 84 | Que sería el valor de `(rembro a lat)` si `a` fue igual a `(car lat)`. 85 | 86 | `(cdr lat)`. 87 | 88 | ----------------- 89 | 90 | Que hacemos si `a` no es igual a `(car lat)` 91 | 92 | Quieremos guardar `(car lat)`, pero tambien realizar si `a` es adentro el resto de lat. 93 | 94 | ----------------- 95 | 96 | Como removemos la primera ocurrencia de `a` en el resto de `lat`. 97 | 98 | `(rembro a (cdr lat))` 99 | 100 | ----------------- 101 | 102 | Hay otros preguntas debemos preguntar? 103 | 104 | No. 105 | 106 | ----------------- 107 | 108 | Ahora, vamos a escribir que tenemos hasta ahora. 109 | ``` 110 | (define rembro 111 | (lambda (a lat) 112 | (cond 113 | ((null? lat) (quote ())) 114 | (else 115 | (cond 116 | ((eq? (car lat) a) (cdr lat)) 117 | (else (rembro a 118 | (cdr lat))))))))) 119 | ``` 120 | Que es el valor de `(rembro a lat)` cuando `a` es `y` y `lat` es `(panzeta lechuga y tomate)`. 121 | 122 | `(panzeta lechuga tomate)`. 123 | (ayuda: Copia eso función con `cons` y los argumentos `a` y `lat` para tener referencia con las siguentes preguntas) 124 | 125 | ----------------- 126 | 127 | Ahora, vamos a ver si esa función funciona. Que es la primer pregunta? 128 | 129 | `(null? lat)`. 130 | 131 | ----------------- 132 | 133 | Que hacemos ahora? 134 | 135 | Va a la siguente linea y preguntar la siguente pregunta. 136 | 137 | ----------------- 138 | 139 | `else` 140 | 141 | Verdad. 142 | 143 | ----------------- 144 | 145 | ¿Que es siguente? 146 | 147 | Pregunta la siguente pregunta. 148 | 149 | ----------------- 150 | 151 | (ea? (car lat) a) 152 | 153 | Verdad, entonces el valor es `(cdr lat)`. En eso caso, es la lista `(lechuga y tomate)`. 154 | 155 | ----------------- 156 | 157 | Eso es el resultado correcto? 158 | 159 | Sí, poque es el original lista sin el atomo `panzeta`. 160 | 161 | ----------------- 162 | 163 | Pero, eso fue buen ejemplo? 164 | 165 | No sabemos. Vamos a probar otro ejemplo. 166 | 167 | ----------------- 168 | 169 | Que hace `rembro`? 170 | 171 | Se toma un atomo y un lat por su argumentos, y crea un nueva lat con la primera occurencia de el atomo en el viejo lat removido. 172 | 173 | ----------------- 174 | 175 | ¿Que hacemos ahora? 176 | 177 | Comparamos cada atomo de la lat con el atomo `a`, y si el comparación es falso construyemos una lista que inicia con el atomo comparando justo. 178 | 179 | ----------------- 180 | 181 | Que es el valor de `(rembro a lat)` cuando `a` es `y` y `lat` es `(panzeta lechuga y tomate)` 182 | 183 | `(panzeta lechuga tomate)`. 184 | 185 | ----------------- 186 | 187 | Vamos a ver si la funcion `rembro` funciona. 188 | Que es la primera pregunta de `rembro` 189 | 190 | `(null? lat)` 191 | 192 | ----------------- 193 | 194 | Que hacemos ahora? 195 | 196 | Vamos a la proxima pregunta. 197 | 198 | ----------------- 199 | 200 | `else` 201 | 202 | Bien, pregunta la proxima linea. 203 | 204 | ----------------- 205 | 206 | `(eq? (car lat) a)` 207 | 208 | No, entonces vamos a la proxima pregunta. 209 | 210 | ----------------- 211 | 212 | Que significa `(else (rembro a (cdr lat)))` 213 | 214 | `else` siempre es verdad. El resto de la linea dice que debemos hacer recursion con `a` y `(cdr lat)`, donde `a` es `y` y `(cdr lat)` es `(lechuga y tomate)`. 215 | 216 | ----------------- 217 | 218 | `(null? lat)` 219 | 220 | No, entonces vamos a la proxima linea. 221 | 222 | ----------------- 223 | 224 | `else` 225 | 226 | Verdad. 227 | 228 | ----------------- 229 | 230 | `(eq? (car lat) a)` 231 | 232 | No, entonces vamos a la proxima linea. 233 | 234 | ----------------- 235 | 236 | Que significa `(rembro a (cdr lat))` 237 | 238 | Hacemos recursion donde `a` es `y` y `(cdr lat)` es `(y tomate)`. 239 | 240 | ----------------- 241 | 242 | `(null? lat)` 243 | 244 | No, entonces vamos a la proxima linea, y preguntamos la proxima pregunta. 245 | 246 | ----------------- 247 | 248 | `else` 249 | 250 | Verdad. 251 | 252 | ----------------- 253 | 254 | `(eq? (car lat) a)` 255 | 256 | Sí. 257 | 258 | ----------------- 259 | 260 | Entonces, qué es el resultado? 261 | 262 | `(cdr lat)`--`(tomate)` 263 | 264 | ----------------- 265 | 266 | Es correcto? 267 | 268 | No, porque `(tomate)` no es la lista `(panzeta lechuga y tomate)` con la `y` removida. 269 | 270 | ----------------- 271 | 272 | ¿Qué hicimos mal? 273 | 274 | Perdimos la `y`, pero tambien perdimos todos los atomos anteriores de la `y`. 275 | 276 | ----------------- 277 | 278 | ¿Comó podemos mantener los atomos `panzete` y `lechuga`? 279 | 280 | Usamos Cons el Magnífico. ¿Recuerda `cons`, desde capitulo 1? 281 | 282 | ----------------- 283 | 284 | El Segundo mandamiento. 285 | 286 | Usas `cons` para construir listas. 287 | 288 | ----------------- 289 | 290 | Vamos a ver que pasa cuando usamos `cons` 291 | ``` 292 | (define rembro 293 | (lambda (a lat) 294 | (cond 295 | ((null? lat) (quote ()) 296 | (else (cond 297 | ((eq? (car lat) a) (cdr lat)) 298 | (else (cons (car lat) 299 | (rembro a 300 | (cdr lat)))))))))) 301 | ``` 302 | ¿Que es el valor de `(rembro a lat)` cuando `a` es `y` y `lat` es `(panzeta lecuga y tomate)`? 303 | 304 | `(panzeta lechuga tomate)` 305 | 306 | Aviso: Crea una copia de esta función con `cons` y los argumentos `a` y `lat` para ver durante las siguentes preguntas. 307 | 308 | ----------------- 309 | 310 | ¿Que es la primera pregunta? 311 | 312 | `(null? lat)`. 313 | 314 | ----------------- 315 | 316 | ¿Que hacemos ahora? 317 | 318 | Vamos a la siguente pregunta. 319 | 320 | ----------------- 321 | 322 | `else` 323 | 324 | Sí. 325 | 326 | ----------------- 327 | 328 | `(eq? (car lat) a)` 329 | 330 | No, entonces vamos a la proxima linea. 331 | 332 | ----------------- 333 | 334 | ¿Que es la significa de 335 | ``` 336 | (cons (car lat) 337 | (rembro a 338 | (cdr lat))) 339 | ``` 340 | cuando `a` es `y` y `lat` es `(panzeta lechuga y tomate)`? 341 | 342 | Dice que debemos `cons` la `car` de `lat`--panzete-- con el valor de `(rembro a (cdr lat))`. 343 | Pero, todavia no sabemos el valor de `(rember a (cdr lat))`. Necesitamos encontrar eso antes de podemos `cons` `(car lat)` con eso. 344 | 345 | ----------------- 346 | 347 | ¿Que es el significado de `(rembro a (cdr lat))`? 348 | 349 | El función con `lat` cambiada por `(cdr lat)`--`(lechuga y tomate)`. 350 | 351 | ----------------- 352 | 353 | `(null? lat)` 354 | 355 | No, entonces vamos a la proxima linea. 356 | 357 | ----------------- 358 | 359 | `else` 360 | 361 | Sí. Proxima pregunta. 362 | 363 | ----------------- 364 | 365 | `(eq? (car lat) a)` 366 | 367 | No, entonces vamos a la proxima linea. 368 | 369 | ----------------- 370 | 371 | ¿Que significa 372 | ``` 373 | (cons (car lat) 374 | (rembro a (cdr lat))) 375 | ```? 376 | 377 | Cons el car de `lat` --lechuga-- con el valor de `(rembro a (cdr lat))`. 378 | Pero, no sabemos el valor de `(rembro a (cdr lat))` todavia. Necesitamos realizar eso antes de podemos `cons` `(car lat)` con eso. 379 | 380 | ----------------- 381 | 382 | ¿Qué significa `(rembro a (cdr lat))`? 383 | 384 | Eso significa el mismo función pero con `lat` cambia hasta `(cdr lat)`, cual es `(y tomate)`. 385 | 386 | ----------------- 387 | 388 | `(null? lat)` 389 | 390 | No, entonces vamos a la proxima pregunta. 391 | 392 | ----------------- 393 | 394 | `else` 395 | 396 | Verdad. 397 | 398 | ----------------- 399 | 400 | `(eq? (car lat) a)` 401 | 402 | Sí. 403 | 404 | ----------------- 405 | 406 | ¿Qué es el valor de la linea `((eq? (car lat) a) (cdr lat))`? 407 | 408 | `(cdr lat)` -- `(tomate)` 409 | 410 | ----------------- 411 | 412 | ¿Ya terminamos? 413 | 414 | pagina 39 -------------------------------------------------------------------------------- /capitulo_01.md: -------------------------------------------------------------------------------- 1 | Capitulo 1: Jugetes 2 | =========== 3 | 4 | ----------------- 5 | 6 | Es verdad que eso es un átomo? 7 | `atom` 8 | 9 | Sí, 10 | porque `atom` es un hilo de caracteres iniciando con la letra `a`. 11 | 12 | ----------------- 13 | 14 | Es verdad que eso es un átomo? 15 | `pavo` 16 | 17 | Sí, 18 | porque `pavo` es un hilo de caracteres iniciando con un letra. 19 | 20 | ----------------- 21 | 22 | Es verdad que eso es un átomo? 23 | `1492` 24 | 25 | Sí, 26 | porque `1492` es un hilo de digitos. 27 | 28 | ----------------- 29 | 30 | Es verdad que eso es un átomo? 31 | `u` 32 | 33 | Sí, 34 | porque `u` es un hilo de un caracter, que es un letra. 35 | 36 | ----------------- 37 | 38 | Es verdad que eso es un átomo? 39 | `*abc$` 40 | 41 | Sí, 42 | porque `*abc$` es un hilo de caracteres, iniciando con un letra o caractere especial otro de izquierda "(" o derecho ")" parentesis. 43 | 44 | ----------------- 45 | 46 | Es verdad que eso es una lista? 47 | `(átomo)` 48 | 49 | Sí, 50 | porque `(átomo)` es un átomo adentro de parentesis. 51 | 52 | ----------------- 53 | 54 | Es verdad que eso es una lista? 55 | `(átomo pavo o)` 56 | 57 | Sí, 58 | porque eso es un coleccion de átomos adentro de parentesis. 59 | 60 | ----------------- 61 | 62 | Es verdad que eso es una lista? 63 | `(átomo pavo) o` 64 | 65 | No, 66 | porque eso es actualmente dos expresiones-S no adentro de parentesis. El primer es una lista de dos átomos, y la segunda es un átomo. 67 | 68 | ----------------- 69 | 70 | Es verdad que eso es una lista? 71 | `((átomo pavo) o)` 72 | 73 | Sí, 74 | porque los dos expressiones-S ahora son adentro de parentesis. 75 | 76 | ----------------- 77 | 78 | Es verdad que eso es un expresión-S? 79 | `xyz` 80 | 81 | Sí, 82 | porque todos átomos son expresiónes-S. 83 | 84 | ----------------- 85 | 86 | Es verdad que eso es un expresión-S? 87 | `(x y z)` 88 | 89 | Sí, 90 | porque es una lista. 91 | 92 | ----------------- 93 | 94 | Es verdad que eso es un expresión-S? 95 | `((x y) z)` 96 | 97 | Sí, 98 | porque todas listas son expresiónes-S. 99 | 100 | ----------------- 101 | 102 | Es verdad que eso es una lista? 103 | `(como estas haciendo hasta ahora)` 104 | 105 | Sí, 106 | porque eso es una colección de expresiónes-S adentro de parentesis. 107 | 108 | ----------------- 109 | 110 | Cuantos expresiónes-S son adentro la lista `(como estas haciendo hasta ahora)` y que son? 111 | 112 | Cinco, 113 | `como`, `estas`, `haciendo`, `hasta`, y, `ahora`. 114 | 115 | ----------------- 116 | 117 | Es verdad que eso es una lista? 118 | `(((como) estas) ((haciendo) (hasta)) ahora)` 119 | 120 | Sí, 121 | porque es un colección de expreciónes adentro de parentesis. 122 | 123 | ----------------- 124 | 125 | Cuantos expresiónes-S son adentro la lista 126 | `(((como) estas) ((haciendo) (hasta)) ahora)` 127 | y que son? 128 | 129 | Tres, 130 | `((como) estas)`, `((haciendo) (hasta))`, y `ahora`. 131 | 132 | ----------------- 133 | 134 | Es verdad que esa es una lista? 135 | `()` 136 | 137 | Sí, 138 | porque eso contiene cero expresiónes adentro de parentesis. Eso especial tipo de expresión-S se llama el null (o vacia) lista. 139 | 140 | ----------------- 141 | 142 | Es verdad que eso es un átomo? 143 | `()` 144 | 145 | No, 146 | porque `()` es una lista. 147 | 148 | ----------------- 149 | 150 | Es verdad que eso es una lista? 151 | `(()()()())` 152 | 153 | Sí, 154 | porque es un colección de expresiónes-S adentro de parentesis. 155 | 156 | ----------------- 157 | 158 | Que es el `car` de `l` cuando `l` es el argumento `(a b c)`? 159 | 160 | `a`, 161 | porque `a` es el primer átomo de esta lista. 162 | 163 | ----------------- 164 | 165 | Que es el `car` de `l` cuando `l` es `((a b c) x y z)`? 166 | 167 | `(a b c)`, 168 | porque `(a b c)` es el primer expresión-S de esa lista que no es vacia. 169 | 170 | ----------------- 171 | 172 | Que es el `car` de `l` cuando `l` es `salchicha`? 173 | 174 | no responde, 175 | porque no puede preguntar por el `car` de un átomo. 176 | 177 | ----------------- 178 | 179 | Que es el `car` de `l` cuando `l` es `()`? 180 | 181 | no responde, 182 | porque no puedes preguntar por el `car` de una lista vacia. 183 | 184 | ----------------- 185 | 186 | La Regla de Car 187 | La primitiva `car` tiene definición solo para listas que no son vacias. 188 | 189 | ----------------- 190 | 191 | Que es el `car` de `l` cuando `l` es `(((salchichas))(y)(pickle) repollo)` 192 | 193 | ((salchichas)), 194 | leer como: "la lista de la lista de salchichas" 195 | `((salchichas))` es la pirmera expreción-S de `l`. 196 | 197 | ----------------- 198 | 199 | Que es `(car l)` cuando `l` es `(((salchichas))(y)(pickle) repollo)` 200 | 201 | `((salchichas))`, 202 | porque `(car l)` es otro forma para preguntar "el `car` de la lista `l`." 203 | 204 | ----------------- 205 | 206 | Que es `(car (car l))` cuando `l` es `(((salchichas))(y))` 207 | 208 | `(salchichas)`. 209 | 210 | ----------------- 211 | 212 | Que es el `cdr` of `l` cuando `l` es `(a b c)` 213 | 214 | `(b c)` 215 | porque `(b c)` es la list `l` sin `(car l)`. 216 | 217 | "cdr" se llama cuder 218 | 219 | ----------------- 220 | 221 | Que es el `cdr` de `l` cuando `l` es `(hamberguesa)` 222 | 223 | (). 224 | 225 | ----------------- 226 | 227 | que es `(cdr l)` cuando `l` es `((x) t r)` 228 | 229 | `(t r)` 230 | porque `(cdr l)` es solo otra forma de preguntar por "el `cdr` de la lista `l`". 231 | 232 | ----------------- 233 | 234 | Que es `(cdr a)` cuando `a` es `salchichas` 235 | 236 | No responde, 237 | no puede preguntar por el `cdr` de un átomo. 238 | 239 | ----------------- 240 | 241 | Que es `(cdr l)` cuando `l` is `()` 242 | 243 | No responde. 244 | no puede preguntar por el `cdr` de la lista null. 245 | 246 | ----------------- 247 | 248 | La Regla de Cdr 249 | La primitiva `cdr` tiene definición solo para listas que no son vacias. El `cdr` de una lista que no es vacia siempre es otra lista. 250 | 251 | ----------------- 252 | 253 | Que es `(car (cdr l))` cuando `l` es `((b)(x y)((c)))` 254 | 255 | `(x y)`, 256 | porque `((x y)((c)))` es `(cdr l)`, y `(x y)` es el `car` de `(cdr l). 257 | 258 | ----------------- 259 | 260 | Que es `(cdr (cdr l))` cuando `l` es `((b)(x y)((c)))` 261 | 262 | `(((c)))`, 263 | porque `((x y)((c)))` es `(cdr l)`, y `(((c)))` es el `cdr` de `(cdr l)`. 264 | 265 | ----------------- 266 | 267 | Que es `(cdr (car l))` cuand `l` es `(a (b (c)) d)` 268 | 269 | No responde, 270 | porque `(car l)` es un átomo, y `cdr` solo tiene definicion por listas. Veas La Regla de Cdr. 271 | 272 | ----------------- 273 | 274 | Que acepta `car` por un argumento? 275 | 276 | `car` acepta cualquier lista que no es vacia. 277 | 278 | ----------------- 279 | 280 | Que acepta `cdr` por un argumento? 281 | 282 | `cdr` acepta cualquier lista que no es vacia. 283 | 284 | ----------------- 285 | 286 | Que es el `cons` de el átomo `a` y la lista `l` cuando `a` es `mani` y `l` es `(manteca y marmelada)`. Eso puede ser escrito "(cons a l)". leas como "cons el átomo a encima la lista l". 287 | 288 | `(mani manteca y marmelada)` 289 | porque `cons` construye una lista. El primer argumento es en el frente de nueva lista. 290 | 291 | ----------------- 292 | 293 | Que es el `cons` of `s` y `l` cuando `s` es `(banana y)` y `l` es `(mani manteca y marmelada)` 294 | 295 | `((banana y) mani manteca y marmelada)` 296 | porque `cons` construye nueva lista, y puede hacer cualquier expreción-S en el frente de la nueva lista. 297 | 298 | ----------------- 299 | 300 | Que es `(cons s l)` cuando `s` es `((ayudame) eso)` y `l` es `(es muy ((dificil) para aprender))` 301 | 302 | `(((ayudame) eso) es muy ((dificil) para aprender))`. 303 | 304 | ----------------- 305 | 306 | Que acepta `cons` por su argumentos? 307 | 308 | `cons` acepta dos argumentos. El primer es cualquier expresión-S, y la segunda es cualquir lista. 309 | 310 | ----------------- 311 | 312 | Que es `(cons s l)` cuando `s` es `(a b (c))` y `l` es () 313 | 314 | `((a b (c)))` 315 | porque `()` es una lista. 316 | 317 | ----------------- 318 | 319 | Que es `(cons s l)` cuando `s` is `a` y `l` es `()` 320 | 321 | `(a)`. 322 | 323 | ----------------- 324 | 325 | Que es `(cons s l)` cuando `s` es `((a b c))` y `l` es `b` 326 | 327 | No responde, 328 | porque el secundo argumento `l` necesita ser una lista. 329 | 330 | ----------------- 331 | 332 | Que es `(cons s l)` cuando `s` is `a` y `l` es `b` 333 | 334 | No responde. Porque? 335 | 336 | ----------------- 337 | 338 | La Regla de Cons 339 | 340 | La primitiva `cons` toma dos argumentos. La segunda argumento por `cons` debe ser una lista. El resulto es una lista. 341 | 342 | ----------------- 343 | 344 | Que es `(cons s (car l))` cuando `s` es `a` y `l` es `((b) c d)` 345 | 346 | `(a b)`. 347 | porque? 348 | 349 | ----------------- 350 | 351 | Que es `(cons s (cdr l))` cuando `s` es `a` y `l` es `((b) c d)` 352 | 353 | `(a c d)`. 354 | porque? 355 | 356 | ----------------- 357 | 358 | Es verdad que la lista `l` es la lista null cuando `l` es `()` 359 | 360 | Sí, 361 | porque eso es la lista con cero expreciónes'S. Eso pregunta tambien pueden estar escrito `(null? l)`. 362 | 363 | ----------------- 364 | 365 | Que es `(null? (quote ()))` 366 | 367 | Verdad, 368 | porque `(quote ())` es un forma para escribir la lista null. 369 | 370 | ----------------- 371 | 372 | Es `(null? l)` verdad o falso cuando `l` es `(a b c)` 373 | 374 | Falso, 375 | porque `l` es un lista que no es vacia. 376 | 377 | ----------------- 378 | 379 | Es `(null? a)` verdad o falso cuando `a` es `spaghetti` 380 | 381 | No responde, 382 | porque no puedes preguntar `null?` de un átomo. 383 | 384 | ----------------- 385 | 386 | La Regla de Null? 387 | La primitiva `null?` tiene definition solo para listas. 388 | 389 | ----------------- 390 | 391 | Es verdad o falso que `s` es un átomo cuando `s` es `Harry` 392 | 393 | Verdad, 394 | porque `Harry` es un hilo de caracteres iniciando con una letra. 395 | 396 | ----------------- 397 | 398 | Es `(atom? s)` verdad o falso cuando `s` es `Harry` 399 | 400 | Verdad, 401 | porque `(atom? s)` es otra forma de preguntar "Es `s` un átomo?" 402 | 403 | ----------------- 404 | 405 | Es `(atom? s)` verdad o falso cuando `s` es `(Harry tiene una pila de manzanas)` 406 | 407 | Falso, 408 | porque `s` es una lista. 409 | 410 | ----------------- 411 | 412 | Cuantos argumentos acepta `atom?` y que son? 413 | 414 | Acepta un argumento. El argumento puede ser cualquier expresión-S. 415 | 416 | ----------------- 417 | 418 | Es `(atom? (car l))` verdad o falso cuando `l` es `(Harry tiene una pila de manzanas)` 419 | 420 | Verdad, 421 | porque `(car l)` es `Harry`, y `Harry` es un átomo. 422 | 423 | ----------------- 424 | 425 | Es `(atom? (cdr l))` verdad o falso cuando `l` es `(Harry tiene una pila de manzanas)` 426 | 427 | Falso. 428 | 429 | ----------------- 430 | 431 | Es `(atom? (cdr l))` verdad o falso cuando `l` es `(Harry)` 432 | 433 | Falso, 434 | porque la lista `()` no es un átomo. 435 | 436 | ----------------- 437 | 438 | Es `(atom? (car (cdr l)))` verdad o falso cuando `l` es `(uno dos tres cuatro)` 439 | 440 | Verdad, 441 | porque `(cdr l)` es `(dos tres cuatro)` y `(car (cdr l))` es `dos`. `dos` es un átomo. 442 | 443 | ----------------- 444 | 445 | Es `(atom? (car (cdr l)))` verdad o falso cuando `l` es `(uno (dos tres) cuatro)` 446 | 447 | Falso, 448 | porque `(cdr l)` es `((dos tres) cuatro)`, y `(car (cdr l))` es `(dos tres)`. `(dos tres)` es una lista, no un átomo. 449 | 450 | ----------------- 451 | 452 | Verdad o falso, `a1` y `a2` son lo mismo átomo cuando `a1` es `Harry` y `a2` es `Harry` 453 | 454 | Verdad, 455 | porque `a1` es el átomo `Harry` y `a2` es el átomo `Harry`. 456 | 457 | ----------------- 458 | 459 | Is `(eq? a1 a2)` verdad o falso cuando `a1` es `Harry` y `a2` es `Harry` 460 | 461 | Verdad, 462 | porque `(eq? a1 a2)` es otra forma de preguntar, "`a1` y `a2` son lo mismo non-numero átomo?" 463 | 464 | ----------------- 465 | 466 | Es `(eq? a1 a2)` verdad o falso cuando `a1` es `margarina` y `a2` es `mantequilla`? 467 | 468 | False, 469 | porque `a1` y `a2` son átomos diferentes. 470 | 471 | ----------------- 472 | 473 | Cuantos argumentos acepta `eq?` y que son? 474 | 475 | Acepta dos argumentos. Los dos necesita ser átomos, y no pueden ser numeros. 476 | 477 | ----------------- 478 | 479 | Es `(eq? l1 l2)` verdad o falso cuando `l1` es `()` y `l2` es `(fresa)` 480 | 481 | No responde, 482 | `()` y `(fresa)` son listas. 483 | 484 | ----------------- 485 | 486 | Es `(eq? n1 n2)` verdad o falso cuando `n1` es `6` y `n2` es `7` 487 | 488 | No responde, 489 | `6` y `7` son numeros. 490 | 491 | ----------------- 492 | 493 | La Regla de Eq? 494 | La primitiva `eq?` toma dos argumentos. Cada necesita ser un atom, y no pueden ser numero. 495 | 496 | ----------------- 497 | 498 | Es `(eq? (car l) a)` verdad o falso cuando `l` es `(Mary tiene carne de vaca)` y `a` es `Mary` 499 | 500 | Verdad, 501 | porque `(car l)` es el átomo `Mary`, y el argumento `a` es tambien el átomo `Mary`. 502 | 503 | ----------------- 504 | 505 | Es `(eq? (cdr l) a)` verdad o falso cuando `l` es `(acido lactico)` y `a` es `lactico` 506 | 507 | No responde, 508 | Miras La Reglas de Eq? y Cdr. 509 | 510 | ----------------- 511 | 512 | Es `(eq? (car l) (car (cdr l)))` verdad o falso cuano `l` es `(frijoles frijoles necesitamos frijoles dulces)` 513 | 514 | Verdad, 515 | porque es un comparación de el primer y segundo átomos en la lista. 516 | 517 | ----------------- 518 | 519 | -------------------------------------------------------------------------------- /capitulo_02.md: -------------------------------------------------------------------------------- 1 | Capitulo 2: Hacelo, Hacelo otra vez, y otra vez, y otra vez... 2 | ============== 3 | 4 | ----------------- 5 | 6 | Verdad o falso: `(lat? l)` cuando `l` es `(Juan Rollo no puede comer mas pollo)` 7 | 8 | Verdad, 9 | porque cada expreción-S en `l` es un átomo. 10 | 11 | ----------------- 12 | 13 | Verdad o falso: `(lat? l)` cuando `l` es `((Juan) Rollo no puede comer mas pollo)` 14 | 15 | Falso, 16 | porque `(car l)` es una lista. 17 | 18 | ----------------- 19 | 20 | Verdad o falso: `(lat? l)` cuando `l` es `(Juan (Rollo no) puede comer mas pollo)` 21 | 22 | Falso, 23 | porque uno d los expreciónes-S en `l` es una lista. 24 | 25 | ----------------- 26 | 27 | Verdad o falso: `(lat? l)` cuando `l` es `()` 28 | 29 | Verdad, 30 | porque no hay lista adentro 31 | 32 | ----------------- 33 | 34 | Verdad o falso: una lat es una lista de átomos? 35 | 36 | Verdad! 37 | Cada lat es una lista de átomos! 38 | 39 | ----------------- 40 | 41 | Escribe el función `lat?` usando unos, pero no necesariamente todo, de esos funciónes: `car` `cdr` `cons` `null?` `atom?` y `eq?` 42 | 43 | No tenemos expectacion que puedes hacer eso todavia. Porque faltas unos ingredientes. Haces los siguentes preguntas. Buena suerte. 44 | 45 | ----------------- 46 | 47 | Estas descansado? 48 | 49 | ----------------- 50 | 51 | ``` 52 | (define lat? 53 | (lambda (l) 54 | (cond 55 | ((null? l) #t) 56 | ((atom? (car l)) (lat? (cdr l))) 57 | (else #f)))) 58 | ``` 59 | Que es el valor de `(lat? l)` cuando `l` es el argumento `(panzeta y huevos)` 60 | 61 | `#t`. 62 | Eso aplicación `(lat? l)` cuando `l` es `(panzeta y huevos)` tiene el valor `#t` -- verdad -- porque `l` es un lat. 63 | 64 | ----------------- 65 | 66 | Como podemos saber es `#t` por la aplicación `(lat? l)` 67 | 68 | No tenemos expectacion que puedes hacer eso tampoco. 69 | Sabemos porque podemos ver que preguntas lat?. 70 | Estrategia: Escribe la definición del función `lat?` y ver eso por las siguentes preguntas. 71 | 72 | ----------------- 73 | 74 | Que es la primera pregunta de `(lat? l)` 75 | 76 | `(null ?)` 77 | 78 | recuerda: 79 | `(cond ...)` para iniciar las preguntas; 80 | `(lambda ...)` crea una función; y 81 | `(define ...)` da una nombre. 82 | 83 | ----------------- 84 | 85 | Que significa la linea 86 | `((null? l) #t)` 87 | cuando 88 | `l` es `(panzeta y huevos)` 89 | 90 | `(null? l)` pregunta si el argumento `l` es la lista null. Si es, el valor de el aplicación es verdad `#t`. Si no, preguntamos la proxima pregunta. En eso caso, `l` no es la lista null, entonces preguntamos la proxima pregunta. 91 | 92 | ----------------- 93 | 94 | Que es la proxima pregunta? 95 | 96 | `(atom? (car l))` 97 | 98 | ----------------- 99 | 100 | Que significa la linea 101 | `((atom? (car l)) (lat? (cdr l)))` 102 | cuando 103 | `l` es `(y huevos)` 104 | 105 | `(atom? (car l))` pregunta si `(car l)` es un átomo. Si es un átomo, el valor de la aplicación es `(lat? (cdr l))`. Si no, preguntamos la proxima pregunta. en eso caso `(car l)` es un átomo, entonces queiremos saber si el resto de la lista `l` es solo átomos. 106 | 107 | ----------------- 108 | 109 | Que significa `(lat? (cdr l))` 110 | 111 | `(lat? (cdr l))` es para saber si el resto de la lista `l` solo tiene átomos. Estamos usando el funcion `lat?` otra vez, pero eso ves, con el argumento `(cdr l)`, cual es `(huevos)`. 112 | 113 | ----------------- 114 | 115 | Que es la proxima pregunta? 116 | 117 | `(null? l). 118 | 119 | ----------------- 120 | 121 | Que es la significa de la linea 122 | `((null? l) #t)` 123 | cuando 124 | `l` es ahora `(huevos)` 125 | 126 | `(null? l)` pregunta si el argumento `l` es la lista null. Si es, el valor de el aplicación es `#t` -- verdad. Si no, vamos a la proxima pregunta. En eso caso, `l` no es null, entonces vamos a la proxima pregunta. 127 | 128 | ----------------- 129 | 130 | Que es la proxima pregunta? 131 | 132 | `(atom? (car l))`. 133 | 134 | ----------------- 135 | 136 | Que significa la linea 137 | `((atom? (car l)) (lat? (cdr l)))` 138 | cuando 139 | `l` es `(huevos)` 140 | 141 | `(atom? (car l))` pregunta si `(car l)` es un átomo. Si es un átomo, el valor de la aplicación es `(lat? (cdr l))`. Si `(car l)` no es un átomo, preguntamos la proxima pregunta. En eso caso, `(car l)` es un átomo, entonces, otro vez vamos a ver `(lat? (cdr l))` 142 | 143 | ----------------- 144 | 145 | Que significa `(lat? (cdr l))` 146 | 147 | `(lat? (cdr l))` pregunta si el resto de la lista `l` solo tiene átomos. Usa el función `lat?`, con `l` transformando hasta el valor de `(cdr l)`. 148 | 149 | ----------------- 150 | 151 | Ahora, que es el argumento por `lat?` 152 | 153 | `()`. 154 | 155 | ----------------- 156 | 157 | Que significa la linea 158 | `((null? l) #t)` 159 | cuando 160 | `l` es ahora `()` 161 | 162 | `(null? l)` pregunta si `l` es la lista null. Si es, el valor de el aplicación es el valor #t. Si no, preguntamos la proxima pregunta. En eso caso, () es la lista null. Entonces, el valor de la aplicación `(lat? l)` cuando 163 | `l` es `(panzeta y huevos)`, es #t --- verdad. 164 | 165 | ----------------- 166 | 167 | Recuerdas la preguntas sobre `(lat? l)` 168 | 169 | Problamente no. La aplicación `(lat? l)` tiene el valor de #t cuando la lista `l` es una lista de átomos cuando `l` es `(panzeta y huevos)`. 170 | 171 | ----------------- 172 | 173 | Puedes usar tu proprio palabras para explicar que hace `lat?`? 174 | 175 | Aca son nuestro palabras: 176 | "`lat?` vea cada expresión-S en la lista. Pregunta si cada es un átomo, hasta que no hay mas. Si todo son átomos, el resulto es `#t`. Si encuentra una lista, el resulto es `#f` --- falso." 177 | Ahora vamos a ver un ejemplo que resulto en falso. 178 | 179 | ----------------- 180 | 181 | Aca es el función `lat?` otra vez: 182 | ``` 183 | (define lat? 184 | (lambda (l) 185 | (cond 186 | ((null? l) #t) 187 | ((atom? (car l)) (lat? (cdr l))) 188 | (else #f)))) 189 | ``` 190 | Que es el valor de `(lat? l)` cuando 191 | `l` es `(panzeta (y huevos))` 192 | 193 | #f, 194 | porque la lista `l` tiene un expresión-S adentro que es una lista. 195 | 196 | ----------------- 197 | 198 | que es la primer pregunto? 199 | 200 | `(null? l)`. 201 | 202 | ----------------- 203 | 204 | Que es la significa de la linea 205 | `((null? l) #t)` 206 | cuando `l` es `(panzeta (y huevos))` 207 | 208 | `(null? l)` pregunta si `l` es la lista null. Si eso es la lista null, el valor es `#t`. Si `l` no es la lista null, vamos a la proxima pregunta. En ese caso, no es null, entonces, preguntamos la proxima pregunta. 209 | 210 | ----------------- 211 | 212 | Que es la proxima pregunta? 213 | 214 | `(atom? (car l))` 215 | 216 | ----------------- 217 | 218 | Que es la significa de la linea 219 | `((atom? (car l)) (lat? (cdr l)))` 220 | cuando 221 | `l` es `(panzeta (y huevos))` 222 | 223 | `(atom? (car l))` preguntas si `(car l)` es un átomo. Si es un átomo, el valor es `(lat? (cdr l))`. Si no es un átomo, vamos a la proxima pregunta. En ese caso, `(car l)` es un átomo, entonces vamos a ver si el resto de la lista `l` solo tiene átomos adrentro. 224 | 225 | ----------------- 226 | 227 | Que significa `(lat? (cdr l))` 228 | 229 | `(lat? (cdr l))` ver para saber si el resto de la lista `l` solo tiene átomos adrentro, eso vez usamos `(cdr l)` in lugar de `l`. 230 | 231 | ----------------- 232 | 233 | Que significa la linea `((null? l) #t)` cuando `l` ahora es `((y huevos))` 234 | 235 | `(null? l)` pregunta si `l` es la lista null. Si es null, el resulto es `#t`. Si no es null, vamos a la proxima pregunta. En eso caso, `l` no es null, entonces vamos a la proxima pregunta. 236 | 237 | ----------------- 238 | 239 | Que es la proxima pregunta? 240 | 241 | `(atom? (car l))` 242 | 243 | ----------------- 244 | 245 | Que significa de la linea `((atom? (car l)) (lat? (cdr l)))` cuando `l` es ahora `((y huevos))` 246 | 247 | `(atom? (car l))` pregunta si `(car l)` es un átomo. Si es un átomo, el valor es `(lat? (cdr l))`. Si no es, vamos a la proxima pregunta. En eso caso, `(car l)` no es un átomo, entonces vamos la proxima pregunta. 248 | 249 | ----------------- 250 | 251 | Que es la proxima pregunta? 252 | 253 | `else`. 254 | 255 | ----------------- 256 | 257 | Que significa la pregunta `else`? 258 | 259 | `else` significa verdad. 260 | 261 | ----------------- 262 | 263 | `else` significa verdad? 264 | 265 | Sí, porque la pregunta `else` es siempre verdad! 266 | 267 | ----------------- 268 | 269 | `else` 270 | 271 | verdad. 272 | 273 | ----------------- 274 | 275 | Porqué `else` es la ultima pregunta? 276 | 277 | Porque no necisitamos nada mas preguntas. 278 | 279 | ----------------- 280 | 281 | Porqué no necesitams nada mas preguntas? 282 | 283 | Porque una lista puede estar vacio, puede tener un átomo en la primera posición, o puede tener una lista en la primera posición. 284 | 285 | ----------------- 286 | 287 | que significa la linea `(else #f)` 288 | 289 | `else` es siempre verdad, entonces el resulto es `#f`. 290 | 291 | ----------------- 292 | 293 | Que es `)))` 294 | 295 | Son parentesis para cerrar `(cond`, `(lambda`, y `(define`. Ellos son en el inicio de la definición. 296 | 297 | ----------------- 298 | 299 | Puede explicar como determinamos el valor `#f` por `(lat? l)` cuando `l` es `(panzeta (y huevos))` 300 | 301 | Aca es una forma decir eso: 302 | "`(lat? l) mira cada argumento en `l` para saber si es un átomo. Si ya miró cada argumento, y no encontra un lista, `(lat? l)` es `#t`. Si encontra una lista, como pasa en ejemplo `(panzeta (y huevos))`, el valor de `(lat? l)` es `#f`. 303 | 304 | ----------------- 305 | 306 | "or" es la palabra en inglés por "o". 307 | 308 | Es `(or (null? l1) (atom? l2))` verdad o falso cuando `l1` es `()` y `l2` es `(d e f g)` 309 | 310 | Verdad, 311 | porque `(null? l1)` es verdad cuando `l1` es `()`. 312 | 313 | ----------------- 314 | 315 | Es `(or (null? l1) (null? l2))` verdad o false cuando `l1` es `(a b c)` y `l2` es `()` 316 | 317 | Verdad, 318 | porque `(null? l2)` es verdad cuando `l2` es `()`. 319 | 320 | ----------------- 321 | 322 | Es `(or (null? l1) (null? l2))` verdad o false cuando `l1` es `(a b c)` y `l2` es `(atom)` 323 | 324 | Falso, 325 | porque `(null? l1)` y `(null? l2)` no son verdades cuando `l1` es `(a b c)` y `l2` es `(atom)`. 326 | 327 | ----------------- 328 | 329 | Que hace `(or ...)`? 330 | 331 | Hace dos preguntas, uno y despues el otro. Si uno es verdad, termina y el resultado es verdad. Si la primer no es verdad, vamos a la segunda pregunta y el resultado es el resultado de la seguda pregunta. 332 | 333 | ----------------- 334 | 335 | Es verdad o falso que `a` es un miembro de `lat` cuando `a` es `té` y `lat` es `(café té o leche)` 336 | 337 | Verdad, 338 | porque uno de los átomos de `lat`, `(café té o leche) es lo mismo de átomo `a`--`té`. 339 | 340 | ----------------- 341 | 342 | Es `(miembro? a lat)` verdad o falso cuando `a` es `poché` y `lat` es `(huevos frito y huevos revueltos)` 343 | 344 | Verdad, 345 | porque `a` no es uno de los átomos de `lat`. 346 | 347 | ----------------- 348 | 349 | ( eq? es abreviatura en Ingles por "equal", significa igual ). 350 | 351 | Esa es la función `miembro?` 352 | ``` 353 | (define miembro? 354 | (lambda (a lat) 355 | (cond 356 | ((null? lat) #f) 357 | (else (or (eq? (car lat) a) 358 | (miembro? a (cdr lat))))))) 359 | ``` 360 | Que es el valor de `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(papa puré y carne asada)` 361 | 362 | #t, 363 | porque el átomo `carne` es uno de los átomos de `lat`, `(papa puré y carne asada)`. 364 | 365 | ----------------- 366 | 367 | Como determinamos el valor `#t` por esa aplicación? 368 | 369 | El valor es determinado por haciendo las preguntas sobre `(miembro? a lat)`. 370 | ayuda: escribe la definición de la función `miembro?` y ver eso durante estas trabajando en las proximas preguntas. 371 | 372 | ----------------- 373 | 374 | Que es la primera pregunta de `(miembro? a lat)` 375 | 376 | `(null? lat)`. 377 | Eso tambien es la primera pregunta de `lat?`. 378 | 379 | ----------------- 380 | 381 | El Primer Mandamiento 382 | (preliminario) 383 | 384 | Siempre pregunta `null?` por la primera pregunta en cualquier función. 385 | 386 | ----------------- 387 | 388 | Que significa la linea `((null? lat) #f)` cuando `lat` es `(papa puré y carne asada)` 389 | 390 | `(null? lat)` pregunta si `lat` es la lista null. Si es la lista null, el valor es `#f`, porque el átomo `carne` no esta en `lat`. Si no es la lista null, vamos a la proxima pregunta. En eso caso, no es null, entonces vamos a la proxima pregunta. 391 | 392 | ----------------- 393 | 394 | Que es la proxima pregunta? 395 | 396 | `else`. 397 | 398 | ----------------- 399 | 400 | Por qué `else` es la proxima pregunta? 401 | 402 | Porque no necesitamos preguntar nada mas. 403 | 404 | ----------------- 405 | 406 | `else` es una pregunta, en serio? 407 | 408 | Si, `else` es un pregunta que siempre tiene el valor verdad. 409 | 410 | ----------------- 411 | 412 | ¿Qué significa la linea `(else (or (eq? (car lat) a) (member? a (cdr lat))))` 413 | 414 | Ahora sabemos que `lat` no es null, tenemos que encontrar si el `car` de `lat` es el mismo átomo de `a`, o si `a` es adentro el resto de `lat`. La repuesta `(or (eq? (car lat) a) (miembro? a (cdr lat)))` hace eso. 415 | 416 | ----------------- 417 | 418 | Verdad o falso: 419 | ``` 420 | (or (eq? (car lat) a) 421 | (member? a (cdr lat))) 422 | ``` 423 | cuando `a` es carne y `lat` es `(papa puré y carne asada)` 424 | 425 | Vamos a ir viendo cada pregunta para saber. 426 | 427 | ----------------- 428 | 429 | Que es la sengunda pregunta de `(or ...)` 430 | 431 | `(member? a (cdr lat))`. 432 | Esa es una referencia a la función con el argumento `lat` cambiada por `(cdr lat)`. 433 | 434 | ----------------- 435 | 436 | Ahora que son los argumentos de `miembro?` 437 | 438 | `a` es `carne` y `lat` es ahora `(cdr lat), especificamente `(puré y carne asada)`. 439 | 440 | ----------------- 441 | 442 | Que es la proxima pregunta? 443 | 444 | `(null? lat)`. 445 | Recuerda el Primer Mandaminto. 446 | 447 | ----------------- 448 | 449 | Es `(null? lat)` verdad o valso cuando `lat` es `(puré y carne asada)` 450 | 451 | #f--falso. 452 | 453 | ----------------- 454 | 455 | Que hacemos ahora? 456 | 457 | Hacemos la proxima pregunta. 458 | 459 | ----------------- 460 | 461 | Que es la poxima pregunta? 462 | 463 | `else`. 464 | 465 | ----------------- 466 | 467 | Que es la significa de 468 | ``` 469 | (or (eq? (car lat) a) 470 | (member? a (cdr lat))) 471 | ``` 472 | 473 | ``` 474 | (or (eq? (car lat) a) 475 | (member? a (cdr lat))) 476 | ``` 477 | Realiza si `a` es `eq?` a la `car` de `lat` o si `a` es un miembro de la `cdr` de `lat` por referencia de la función. 478 | 479 | ----------------- 480 | 481 | Es a `eq?` a el `car` de `lat` 482 | 483 | No, porque `a` es `carne` y la `car` de `lat` es `puré`. 484 | 485 | ----------------- 486 | 487 | Entonces, que hacemos siguente? 488 | 489 | Preguntamos `(miembro? a (cdr lat))` 490 | 491 | ----------------- 492 | 493 | Ahora, que son los argumentos de `miembro?` 494 | 495 | `a` es `carne`, y `lat` es `(y carne asada)`. 496 | 497 | ----------------- 498 | 499 | Que es la siguente pregunta? 500 | 501 | `(null? lat)`. 502 | 503 | ----------------- 504 | 505 | Que hacemos ahora? 506 | 507 | Pasamos a la proxima pregunta, porque `(null? lat)` es falso. 508 | 509 | ----------------- 510 | 511 | Que es la siguente pregunta? 512 | 513 | `else`. 514 | 515 | ----------------- 516 | 517 | Que es el valor de 518 | ``` 519 | (or (eq? (car lat) a) 520 | (miembro? a (cdr lat))) 521 | ``` 522 | 523 | El valor de `(miembro? a (cdr lat))`. 524 | 525 | ----------------- 526 | 527 | Por qué? 528 | 529 | Porque `(eq? (car lat) a)` es falso. 530 | 531 | ----------------- 532 | 533 | Que hacemos ahora? 534 | 535 | Recursion con referencia a la función con nuevos argumentos. 536 | 537 | ----------------- 538 | 539 | Que son los nuevos argumentos? 540 | 541 | `a` es `carne`, y `lat` es `(carne asada)`. 542 | 543 | ----------------- 544 | 545 | Que es la siguente pregunta? 546 | 547 | `(null? lat)`. 548 | 549 | ----------------- 550 | 551 | Que hacemos ahora? 552 | 553 | Porque `(null? lat)` es falso, vamos a la proxima pregunta. 554 | 555 | ----------------- 556 | 557 | Que es la proxima pregunta? 558 | 559 | `else`. 560 | 561 | ----------------- 562 | 563 | Que es el valor de 564 | ``` 565 | (or (eq? (car lat) a) 566 | (miembro? a (cdr lat))) 567 | ``` 568 | 569 | #t, 570 | porque `(car lat)` es `carne`, y `a` es `carne`. Son lo mismo átomo. Entonces, `(or ...)` resulta en `#t`. 571 | 572 | ----------------- 573 | 574 | Que es el valor de el aplicación `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(carne asada)` 575 | 576 | `#t`, 577 | porque `carne` es tambien un miembro de `(carne asada)`. 578 | 579 | ----------------- 580 | 581 | Que es el valor de el aplicación `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(y carne asada)` 582 | 583 | `#t`, 584 | porque `carne` es tambien un miembro de la `lat` `(y carne asada)`. 585 | 586 | ----------------- 587 | 588 | Que es el valor de el aplicación `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(puré y carne asada)` 589 | 590 | `#t`, 591 | porque `carne` es tambien un miembro de la `lat` `(puré y carne asada)`. 592 | 593 | ----------------- 594 | 595 | Que es el valor de el aplicación `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(papa puré y carne asada)` 596 | 597 | `#t`, 598 | porque `carne` es tambien un miembro de la `lat` `(papa puré y carne asada)`. Y eso es nuestro `lat` original. 599 | 600 | ----------------- 601 | 602 | Solo para estar seguta que entendiste correcto, vamos a hacerlo rapidamente otra vez. Que es el valor de `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(papa puré y carne asada)` 603 | 604 | `#t` 605 | Puede ayudar si ves la definición de `miembro?` y su argumentos en mismo tiempo con responder en la siguente preguntas. 606 | 607 | ----------------- 608 | 609 | `(null? lat)` 610 | 611 | No. Vamos a la proxima linea. 612 | 613 | ----------------- 614 | 615 | else 616 | 617 | Sí. 618 | 619 | ----------------- 620 | 621 | `(or (eq? (cat lat) a) 622 | (miembro? a (cdr lat)))` 623 | 624 | Posiblemente 625 | 626 | ----------------- 627 | 628 | `(eq? (car lat) a)` 629 | 630 | No. Vamos a proxima pregunta. 631 | 632 | ----------------- 633 | 634 | Que siguente? 635 | 636 | Recursion con `a` y `(cdr lat)` cuando `a` es `carne` y `(cdr lat)` es `(papa puré y carne asada)` 637 | 638 | ----------------- 639 | 640 | `(null? lat)` 641 | 642 | No. Vamos a la proxima linea. 643 | 644 | ----------------- 645 | 646 | `else` 647 | 648 | Sí, pero `(eq? (cat lat) a)` es falso. 649 | Hace recursion con `a` y `(cdr lat)` cuando `a` es `carne` y `(cdr lat)` es `(y carne asada)`. 650 | 651 | ----------------- 652 | 653 | `(null? lat)` 654 | 655 | No. Vamos a la proxima linea. 656 | 657 | ----------------- 658 | 659 | `else` 660 | 661 | Sí, pero `(eq? (car lat) a)` es falso. Hace recusion con `a` y `(cdr lat)`. Eso vez `a` es `carne` y `(cdr lat)` es `(carne asada)`. 662 | 663 | ----------------- 664 | 665 | `(null? lat)` 666 | 667 | No. Vamos a la proxima linea. 668 | 669 | ----------------- 670 | 671 | `(eq? (car lat) a)` 672 | 673 | Sí, el valor es #t. 674 | 675 | ----------------- 676 | 677 | `(or (eq? (car lat) a) 678 | (miembro? a (cdr lat)))` 679 | 680 | #t 681 | 682 | ----------------- 683 | 684 | Que es el valor de `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(carne asada)`? 685 | 686 | #t 687 | 688 | ----------------- 689 | 690 | Que es el valor de `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(y carne asada)`? 691 | 692 | #t 693 | 694 | ----------------- 695 | 696 | Que es el valor de `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(puré y carne asada)`? 697 | 698 | #t 699 | 700 | ----------------- 701 | 702 | Que es el valor de `(miembro? a lat)` cuando `a` es `carne` y `lat` es `(papa puré y carne asada)`? 703 | 704 | #t 705 | 706 | ----------------- 707 | 708 | Que es el valor de `(miembro? a lat)` cuando `a` es `hígado` y `lat` es `(pan y salmon)` 709 | 710 | #f. 711 | 712 | ----------------- 713 | 714 | Vamos a ver porque es #f. Que es la primer pregunta de `miembro?`? 715 | 716 | `(null? lat)`. 717 | 718 | ----------------- 719 | 720 | `(null? lat)` 721 | 722 | No. Vamos a la proxima linea. 723 | 724 | ----------------- 725 | 726 | `else` 727 | 728 | Sí, pero `(eq? (car lat) a)` es falso. Hace recusión con `a` y `(cdr lat)`. Esa vez `a` es `hígado` y `(cdr lat)` es `(y salmon)`. 729 | 730 | ----------------- 731 | 732 | `(null? lat)` 733 | 734 | No. Vamos a la proxima linea. 735 | 736 | ----------------- 737 | 738 | `else` 739 | 740 | Sí, pero `(eq? (car lat) a)` es falso. Hace recursión con `a` y `(cdr lat)`. Esa vez `a` es `hígado` y `(cdr lat)` es `(salmon)`. 741 | 742 | ----------------- 743 | 744 | `(null? lat)` 745 | 746 | No. Vamos a la proxima linea. 747 | 748 | ----------------- 749 | 750 | `else` 751 | 752 | Sí, pero `(eq? (car lat) a)` es todavia falso. Hace recursión con `a` y `(cdr lat)`. Esa vez `a` es `hígado` y `(cdr lat)` es `()`. 753 | 754 | ----------------- 755 | 756 | `(null? lat)` 757 | 758 | Sí. 759 | 760 | ----------------- 761 | 762 | Que es el valor de `(miembro? a lat)` cuando `a` es `hígado` y `lat` es `()`. 763 | 764 | `#f` 765 | 766 | ----------------- 767 | 768 | Que es el valor de 769 | ``` 770 | (or (eq? (car lat) a) 771 | (miembro? a (cdr lat))) 772 | ``` 773 | cuando `a` es `hígado` y `lat` es `(salmon)` 774 | 775 | `#f` 776 | 777 | ----------------- 778 | 779 | 780 | Que es el valor de `(miembro? a lat)` cuando `a` es `hígado` y `lat` es `(salmon)`. 781 | 782 | `#f` 783 | 784 | ----------------- 785 | 786 | Que es el valor de 787 | ``` 788 | (or (eq? (car lat) a) 789 | (miembro? a (cdr lat))) 790 | ``` 791 | cuando `a` es `hígado` y `lat` es `(y salmon)` 792 | 793 | `#f` 794 | 795 | ----------------- 796 | 797 | Que es el valor de `(miembro? a lat)` cuando `a` es `hígado` y `lat` es `(y salmon)`. 798 | 799 | `#f` 800 | 801 | ----------------- 802 | 803 | Que es el valor de 804 | ``` 805 | (or (eq? (car lat) a) 806 | (miembro? a (cdr lat))) 807 | ``` 808 | cuando `a` es `hígado` y `lat` es `(pan y salmon)` 809 | 810 | `#f` 811 | 812 | ----------------- 813 | 814 | Que es el valor de `(miembro? a lat)` cuando `a` es `hígado` y `lat` es `(pan y salmon)`. 815 | 816 | `#f` 817 | 818 | ----------------- 819 | 820 | ¿Crees en todo eso? Entonces puedes descansar! 821 | -------------------------------------------------------------------------------- /pequeno_schemedor.txt: -------------------------------------------------------------------------------- 1 | El Piqueño Schemedor 2 | 3 | por: Daniel P. Friedman y Matthias Felleisen 4 | Traducido por: Zackary Hess 5 | 6 | 7 | 8 | 9 | Diez Mandamientos 10 | 11 | 1- 12 | Cuando estas usando recursion en una lista de atomos, `lat`, preguntas dos cosas sobre eso: `(null? lat)` y `else`. 13 | Cuando estas usando recursion en un numero, `n`, preguntas dos cosas sobre eso: `(zero? n)` y `else`. 14 | Cuando estas usando recusion en una lista de expresiones-S, `l`, preguntas tres cosas sobre eso: `(null? l)`, `(atom? (car l))` y `else`. 15 | 16 | 2- 17 | Usas `cons` para construir listas. 18 | 19 | 3- 20 | Cuando estas construyendo listas, descrubes la primer elemento typical, y `cons` eso con lo recusion natural. 21 | 22 | 4- 23 | Cuando estas usando recusion, debes cambiar por lo menos un argumento cada vez. 24 | Cuando estas usando recusion en un lista de atomos, `lat`, usas `(cdr lat)` 25 | Cuando estas usando recusion en un numero, `n`, usas `(sub1 n)`. 26 | Y cuando estas usando recusion en una lista de expresiones-S, `l`, usas `(car l)` y `(cdr l)` sino `(null? l)` tampoco `(atom? (car l))` son verdad. 27 | 28 | Cada vez es necesario que eso es cambiando mas cerca el terminación. 29 | Necesitas probar lo argumento cambiando cada vez por lo condicion de terminación: 30 | cuando usando `cdr`, el condicion de terminación es `null?` y 31 | cuando usando `sub1`, el condicion de terminación es `zero?`. 32 | 33 | 5- 34 | Cuando construyendo un valor con `+`, siempre usas 0 por el valor de la linea de terminación, porque agregando con 0 no cambia el valor. 35 | Cuando construyendo un valor con `*`, siempre usas 1 por el valor de la linea de terminación, porque multiplicando con 1 no cambia el valor. 36 | Cuando construyendo un valor con `cons`, siempre considerar `()` por el valor de la linea de terminación. 37 | 38 | 6- 39 | Simplificar un función solo despues de es correcto. 40 | 41 | 7- 42 | Usas recursion en los partes de tiene mismo forma. 43 | * en las sublistas de listas. 44 | * en los subexpresiónes de un expresión. 45 | 46 | 8- 47 | Usas mas funciónes to abstractar desde representaciónes. 48 | 49 | 9- 50 | Usas nuevas funciónes para abstractar los patrones comones. 51 | 52 | 10- 53 | Creas funciónes para recoger mas de uno valor en una vez. 54 | 55 | 56 | Las Cinca Reglas 57 | 58 | La Regla de Car 59 | La primitiva `car` tiene definición solo para listas que no son vacias. 60 | 61 | La Regla de Cdr 62 | La primitiva `cdr` tiene definición solo para listas que no son vacias. El `cdr` de una lista que no es vacia siempre es otra lista. 63 | 64 | La Regla de Cons 65 | La primitiva `cons` toma dos argumentos. La segunda argumento por `cons` debe ser una lista. El resulto es una lista. 66 | 67 | La Regla de Null? 68 | La primitiva `null?` tiene definition solo para listas. 69 | 70 | La Regla de Eq? 71 | La primitiva `eq?` toma dos argumentos. Cada necesita ser un atom, y no pueden ser numero. 72 | 73 | 74 | 75 | Guida para la lectora 76 | Debe leer despacio, y con cuidado. Debe tener por los menos dos descansos durante leyendo, no leas todo en un vez. Lee los capitulos en lo correcto orden. Si no entiende un capitulo entera, va a entender lo siguiente menos. Cada pregunta es mas dificil. Debe tener poder responder a las mas facil antes de hace los mas dificiles. 77 | Eso libro es una conversacion sobre programas interesantes. Si puedes, debes hacer los ejemplos durante leyendo. Software para hacer la idoma Scheme es muy disponible. Son pocos diferencias en cada Scheme, pero todos son basicamente mismo en todo mundo. Para usar Scheme por eso libro, necesita definar los functiones `atom?`, `sub1`, y `add1`. Aca es un definición por `atom?`. 78 | ``` 79 | (define atom? 80 | (lambda (x) 81 | (and (not (pair? x)) (not (null? x ))))) 82 | ``` 83 | Para saber si tu Scheme tiene lo corecto definición de `atom?`, proba `(atom? (quote ()))`. debe resultar en `#f`. Eso libro tambien puede funciar con un lisp mas moderna, como Common Lisp. Para funciar con Lisp, puede crear la función `atom?` como asi: 84 | ``` 85 | (defun atom? (x) 86 | (not (listp x))) 87 | ``` 88 | y las porgramas quizas necesita estar modificada un poco. 89 | En capitulo 4 creamos los basicos de aritmetico usando los operaciónes `add1`, `sub1`, y `zero?`. Necesitas crear `add1` y `sub1` porque no existe por defaulto en scheme. 90 | Eso Libro no tiene definiciónes formales. Puedes crear su proprio definición, y como asi es mas facil recuerdar y entender. Pero debes saber y entender los Reglas Y Mandamientos antes de pasar por ellos. La estrategia para aprender Scheme es en saber los patrones. Los Mandamientos son patrones que ya veaste. En el principio del libro los conceptos son sincilla, y mas tarde expandimos en ellos. Deben saber tambien que todo en eso libro si es Scheme, pero tambien Scheme tiene mas que pueden explicar en eso libro introductoria. Despues de estas maestro de eso libro, puedes leer y entender otro libros mas comprehensivos sobre Scheme. 91 | Estas lista iniciar. Buena suerte! Esperamos que puedes disfrutar los desafíos en los siguente paginas. 92 | 93 | 94 | 95 | 96 | 97 | Capitulo 1: Jugetes 98 | 99 | ----------------- 100 | 101 | Es verdad que eso es un atomo? 102 | `atom` 103 | 104 | Sí, 105 | porque `atom` es un hilo de caracteres iniciando con la letra `a`. 106 | 107 | ----------------- 108 | 109 | Es verdad que eso es un atomo? 110 | `pavo` 111 | 112 | Sí, 113 | porque `pavo` es un hilo de caracteres iniciando con un letra. 114 | 115 | ----------------- 116 | 117 | Es verdad que eso es un atomo? 118 | `1492` 119 | 120 | Sí, 121 | porque `1492` es un hilo de digitos. 122 | 123 | ----------------- 124 | 125 | Es verdad que eso es un atomo? 126 | `u` 127 | 128 | Sí, 129 | porque `u` es un hilo de un caracter, que es un letra. 130 | 131 | ----------------- 132 | 133 | Es verdad que eso es un atomo? 134 | `*abc$` 135 | 136 | Sí, 137 | porque `*abc$` es un hilo de caracteres, iniciando con un letra o caractere especial otro de izquierda "(" o derecho ")" parentesis. 138 | 139 | ----------------- 140 | 141 | Es verdad que eso es una lista? 142 | `(atomo)` 143 | 144 | Sí, 145 | porque `(atomo)` es un atomo adentro de parentesis. 146 | 147 | ----------------- 148 | 149 | Es verdad que eso es una lista? 150 | `(atomo pavo o)` 151 | 152 | Sí, 153 | porque eso es un coleccion de atomos adentro de parentesis. 154 | 155 | ----------------- 156 | 157 | Es verdad que eso es una lista? 158 | `(atomo pavo) o` 159 | 160 | No, 161 | porque eso es actualmente dos expresiones-S no adentro de parentesis. El primer es una lista de dos atomos, y la segunda es un atomo. 162 | 163 | ----------------- 164 | 165 | Es verdad que eso es una lista? 166 | `((atomo pavo) o)` 167 | 168 | Sí, 169 | porque los dos expressiones-S ahora son adentro de parentesis. 170 | 171 | ----------------- 172 | 173 | Es verdad que eso es un expresión-S? 174 | `xyz` 175 | 176 | Sí, 177 | porque todos atomos son expresiónes-S. 178 | 179 | ----------------- 180 | 181 | Es verdad que eso es un expresión-S? 182 | `(x y z)` 183 | 184 | Sí, 185 | porque es una lista. 186 | 187 | ----------------- 188 | 189 | Es verdad que eso es un expresión-S? 190 | `((x y) z)` 191 | 192 | Sí, 193 | porque todas listas son expresiónes-S. 194 | 195 | ----------------- 196 | 197 | Es verdad que eso es una lista? 198 | `(como estas haciendo hasta ahora)` 199 | 200 | Sí, 201 | porque eso es una colección de expresiónes-S adentro de parentesis. 202 | 203 | ----------------- 204 | 205 | Cuantos expresiónes-S son adentro la lista `(como estas haciendo hasta ahora)` y que son? 206 | 207 | Cinco, 208 | `como`, `estas`, `haciendo`, `hasta`, y, `ahora`. 209 | 210 | ----------------- 211 | 212 | Es verdad que eso es una lista? 213 | `(((como) estas) ((haciendo) (hasta)) ahora)` 214 | 215 | Sí, 216 | porque es un colección de expreciónes adentro de parentesis. 217 | 218 | ----------------- 219 | 220 | Cuantos expresiónes-S son adentro la lista 221 | `(((como) estas) ((haciendo) (hasta)) ahora)` 222 | y que son? 223 | 224 | Tres, 225 | `((como) estas)`, `((haciendo) (hasta))`, y `ahora`. 226 | 227 | ----------------- 228 | 229 | Es verdad que esa es una lista? 230 | `()` 231 | 232 | Sí, 233 | porque eso contiene cero expresiónes adentro de parentesis. Eso especial tipo de expresión-S se llama el null (o vacia) lista. 234 | 235 | ----------------- 236 | 237 | Es verdad que eso es un atomo? 238 | `()` 239 | 240 | No, 241 | porque `()` es una lista. 242 | 243 | ----------------- 244 | 245 | Es verdad que eso es una lista? 246 | `(()()()())` 247 | 248 | Sí, 249 | porque es un colección de expresiónes-S adentro de parentesis. 250 | 251 | ----------------- 252 | 253 | Que es el `car` de `l` cuando `l` es el argumento `(a b c)`? 254 | 255 | `a`, 256 | porque `a` es el primer atomo de esta lista. 257 | 258 | ----------------- 259 | 260 | Que es el `car` de `l` cuando `l` es `((a b c) x y z)`? 261 | 262 | `(a b c)`, 263 | porque `(a b c)` es el primer expresión-S de esa lista que no es vacia. 264 | 265 | ----------------- 266 | 267 | Que es el `car` de `l` cuando `l` es `salchicha`? 268 | 269 | no responde, 270 | porque no puede preguntar por el `car` de un atomo. 271 | 272 | ----------------- 273 | 274 | Que es el `car` de `l` cuando `l` es `()`? 275 | 276 | no responde, 277 | porque no puedes preguntar por el `car` de una lista vacia. 278 | 279 | ----------------- 280 | 281 | La Regla de Car 282 | La primitiva `car` tiene definición solo para listas que no son vacias. 283 | 284 | ----------------- 285 | 286 | Que es el `car` de `l` cuando `l` es `(((salchichas))(y)(pickle) repollo)` 287 | 288 | ((salchichas)), 289 | leer como: "la lista de la lista de salchichas" 290 | `((salchichas))` es la pirmera expreción-S de `l`. 291 | 292 | ----------------- 293 | 294 | Que es `(car l)` cuando `l` es `(((salchichas))(y)(pickle) repollo)` 295 | 296 | `((salchichas))`, 297 | porque `(car l)` es otro forma para preguntar "el `car` de la lista `l`." 298 | 299 | ----------------- 300 | 301 | Que es `(car (car l))` cuando `l` es `(((salchichas))(y))` 302 | 303 | `(salchichas)`. 304 | 305 | ----------------- 306 | 307 | Que es el `cdr` of `l` cuando `l` es `(a b c)` 308 | 309 | `(b c)` 310 | porque `(b c)` es la list `l` sin `(car l)`. 311 | 312 | "cdr" se llama cuder 313 | 314 | ----------------- 315 | 316 | Que es el `cdr` de `l` cuando `l` es `(hamberguesa)` 317 | 318 | (). 319 | 320 | ----------------- 321 | 322 | que es `(cdr l)` cuando `l` es `((x) t r)` 323 | 324 | `(t r)` 325 | porque `(cdr l)` es solo otra forma de preguntar por "el `cdr` de la lista `l`". 326 | 327 | ----------------- 328 | 329 | Que es `(cdr a)` cuando `a` es `salchichas` 330 | 331 | No responde, 332 | no puede preguntar por el `cdr` de un atomo. 333 | 334 | ----------------- 335 | 336 | Que es `(cdr l)` cuando `l` is `()` 337 | 338 | No responde. 339 | no puede preguntar por el `cdr` de la lista null. 340 | 341 | ----------------- 342 | 343 | La Regla de Cdr 344 | La primitiva `cdr` tiene definición solo para listas que no son vacias. El `cdr` de una lista que no es vacia siempre es otra lista. 345 | 346 | ----------------- 347 | 348 | Que es `(car (cdr l))` cuando `l` es `((b)(x y)((c)))` 349 | 350 | `(x y)`, 351 | porque `((x y)((c)))` es `(cdr l)`, y `(x y)` es el `car` de `(cdr l). 352 | 353 | ----------------- 354 | 355 | Que es `(cdr (cdr l))` cuando `l` es `((b)(x y)((c)))` 356 | 357 | `(((c)))`, 358 | porque `((x y)((c)))` es `(cdr l)`, y `(((c)))` es el `cdr` de `(cdr l)`. 359 | 360 | ----------------- 361 | 362 | Que es `(cdr (car l))` cuand `l` es `(a (b (c)) d)` 363 | 364 | No responde, 365 | porque `(car l)` es un atomo, y `cdr` solo tiene definicion por listas. Veas La Regla de Cdr. 366 | 367 | ----------------- 368 | 369 | Que acepta `car` por un argumento? 370 | 371 | `car` acepta cualquier lista que no es vacia. 372 | 373 | ----------------- 374 | 375 | Que acepta `cdr` por un argumento? 376 | 377 | `cdr` acepta cualquier lista que no es vacia. 378 | 379 | ----------------- 380 | 381 | Que es el `cons` de el atomo `a` y la lista `l` cuando `a` es `mani` y `l` es `(manteca y marmelada)`. Eso puede ser escrito "(cons a l)". leas como "cons el atomo a encima la lista l". 382 | 383 | `(mani manteca y marmelada)` 384 | porque `cons` construye una lista. El primer argumento es en el frente de nueva lista. 385 | 386 | ----------------- 387 | 388 | Que es el `cons` of `s` y `l` cuando `s` es `(banana y)` y `l` es `(mani manteca y marmelada)` 389 | 390 | `((banana y) mani manteca y marmelada)` 391 | porque `cons` construye nueva lista, y puede hacer cualquier expreción-S en el frente de la nueva lista. 392 | 393 | ----------------- 394 | 395 | Que es `(cons s l)` cuando `s` es `((ayudame) eso)` y `l` es `(es muy ((dificil) para aprender))` 396 | 397 | `(((ayudame) eso) es muy ((dificil) para aprender))`. 398 | 399 | ----------------- 400 | 401 | Que acepta `cons` por su argumentos? 402 | 403 | `cons` acepta dos argumentos. El primer es cualquier expresión-S, y la segunda es cualquir lista. 404 | 405 | ----------------- 406 | 407 | Que es `(cons s l)` cuando `s` es `(a b (c))` y `l` es () 408 | 409 | `((a b (c)))` 410 | porque `()` es una lista. 411 | 412 | ----------------- 413 | 414 | Que es `(cons s l)` cuando `s` is `a` y `l` es `()` 415 | 416 | `(a)`. 417 | 418 | ----------------- 419 | 420 | Que es `(cons s l)` cuando `s` es `((a b c))` y `l` es `b` 421 | 422 | No responde, 423 | porque el secundo argumento `l` necesita ser una lista. 424 | 425 | ----------------- 426 | 427 | Que es `(cons s l)` cuando `s` is `a` y `l` es `b` 428 | 429 | No responde. Porque? 430 | 431 | ----------------- 432 | 433 | La Regla de Cons 434 | 435 | La primitiva `cons` toma dos argumentos. La segunda argumento por `cons` debe ser una lista. El resulto es una lista. 436 | 437 | ----------------- 438 | 439 | Que es `(cons s (car l))` cuando `s` es `a` y `l` es `((b) c d)` 440 | 441 | `(a b)`. 442 | porque? 443 | 444 | ----------------- 445 | 446 | Que es `(cons s (cdr l))` cuando `s` es `a` y `l` es `((b) c d)` 447 | 448 | `(a c d)`. 449 | porque? 450 | 451 | ----------------- 452 | 453 | Es verdad que la lista `l` es la lista null cuando `l` es `()` 454 | 455 | Sí, 456 | porque eso es la lista con cero expreciónes'S. Eso pregunta tambien pueden estar escrito `(null? l)`. 457 | 458 | ----------------- 459 | 460 | Que es `(null? (quote ()))` 461 | 462 | Verdad, 463 | porque `(quote ())` es un forma para escribir la lista null. 464 | 465 | ----------------- 466 | 467 | Es `(null? l)` verdad o falso cuando `l` es `(a b c)` 468 | 469 | Falso, 470 | porque `l` es un lista que no es vacia. 471 | 472 | ----------------- 473 | 474 | Es `(null? a)` verdad o falso cuando `a` es `spaghetti` 475 | 476 | No responde, 477 | porque no puedes preguntar `null?` de un atomo. 478 | 479 | ----------------- 480 | 481 | La Regla de Null? 482 | La primitiva `null?` tiene definition solo para listas. 483 | 484 | ----------------- 485 | 486 | Es verdad o falso que `s` es un atomo cuando `s` es `Harry` 487 | 488 | Verdad, 489 | porque `Harry` es un hilo de caracteres iniciando con una letra. 490 | 491 | ----------------- 492 | 493 | Es `(atom? s)` verdad o falso cuando `s` es `Harry` 494 | 495 | Verdad, 496 | porque `(atom? s)` es otra forma de preguntar "Es `s` un atomo?" 497 | 498 | ----------------- 499 | 500 | Es `(atom? s)` verdad o falso cuando `s` es `(Harry tiene una pila de manzanas)` 501 | 502 | Falso, 503 | porque `s` es una lista. 504 | 505 | ----------------- 506 | 507 | Cuantos argumentos acepta `atom?` y que son? 508 | 509 | Acepta un argumento. El argumento puede ser cualquier expresión-S. 510 | 511 | ----------------- 512 | 513 | Es `(atom? (car l))` verdad o falso cuando `l` es `(Harry tiene una pila de manzanas)` 514 | 515 | Verdad, 516 | porque `(car l)` es `Harry`, y `Harry` es un atomo. 517 | 518 | ----------------- 519 | 520 | Es `(atom? (cdr l))` verdad o falso cuando `l` es `(Harry tiene una pila de manzanas)` 521 | 522 | Falso. 523 | 524 | ----------------- 525 | 526 | Es `(atom? (cdr l))` verdad o falso cuando `l` es `(Harry)` 527 | 528 | Falso, 529 | porque la lista `()` no es un atomo. 530 | 531 | ----------------- 532 | 533 | Es `(atom? (car (cdr l)))` verdad o falso cuando `l` es `(uno dos tres cuatro)` 534 | 535 | Verdad, 536 | porque `(cdr l)` es `(dos tres cuatro)` y `(car (cdr l))` es `dos`. `dos` es un atomo. 537 | 538 | ----------------- 539 | 540 | Es `(atom? (car (cdr l)))` verdad o falso cuando `l` es `(uno (dos tres) cuatro)` 541 | 542 | Falso, 543 | porque `(cdr l)` es `((dos tres) cuatro)`, y `(car (cdr l))` es `(dos tres)`. `(dos tres)` es una lista, no un atomo. 544 | 545 | ----------------- 546 | 547 | Verdad o falso, `a1` y `a2` son lo mismo atomo cuando `a1` es `Harry` y `a2` es `Harry` 548 | 549 | Verdad, 550 | porque `a1` es el atomo `Harry` y `a2` es el atomo `Harry`. 551 | 552 | ----------------- 553 | 554 | Is `(eq? a1 a2)` verdad o falso cuando `a1` es `Harry` y `a2` es `Harry` 555 | 556 | Verdad, 557 | porque `(eq? a1 a2)` es otra forma de preguntar, "`a1` y `a2` son lo mismo non-numero atomo?" 558 | 559 | ----------------- 560 | 561 | Es `(eq? a1 a2)` verdad o falso cuando `a1` es `margarina` y `a2` es `mantequilla`? 562 | 563 | False, 564 | porque `a1` y `a2` son atomos diferentes. 565 | 566 | ----------------- 567 | 568 | Cuantos argumentos acepta `eq?` y que son? 569 | 570 | Acepta dos argumentos. Los dos necesita ser atomos, y no pueden ser numeros. 571 | 572 | ----------------- 573 | 574 | Es `(eq? l1 l2)` verdad o falso cuando `l1` es `()` y `l2` es `(fresa)` 575 | 576 | No responde, 577 | `()` y `(fresa)` son listas. 578 | 579 | ----------------- 580 | 581 | Es `(eq? n1 n2)` verdad o falso cuando `n1` es `6` y `n2` es `7` 582 | 583 | No responde, 584 | `6` y `7` son numeros. 585 | 586 | ----------------- 587 | 588 | La Regla de Eq? 589 | La primitiva `eq?` toma dos argumentos. Cada necesita ser un atom, y no pueden ser numero. 590 | 591 | ----------------- 592 | 593 | Es `(eq? (car l) a)` verdad o falso cuando `l` es `(Mary tiene carne de vaca)` y `a` es `Mary` 594 | 595 | Verdad, 596 | porque `(car l)` es el atomo `Mary`, y el argumento `a` es tambien el atomo `Mary`. 597 | 598 | ----------------- 599 | 600 | Es `(eq? (cdr l) a)` verdad o falso cuando `l` es `(acido lactico)` y `a` es `lactico` 601 | 602 | No responde, 603 | Miras La Reglas de Eq? y Cdr. 604 | 605 | ----------------- 606 | 607 | Es `(eq? (car l) (car (cdr l)))` verdad o falso cuano `l` es `(frijoles frijoles necesitamos frijoles dulces)` 608 | 609 | Verdad, 610 | porque es un comparación de el primer y segundo atomos en la lista. 611 | 612 | ----------------- 613 | 614 | 615 | 616 | Capitulo 2. 617 | Hacelo, Hacelo otra vez, y otra vez, y otra vez... 618 | 619 | ----------------- 620 | 621 | Verdad o falso: `(lat? l)` cuando `l` es `(Juan Rollo no puede comer mas pollo)` 622 | 623 | Verdad, 624 | porque cada expreción-S en `l` es un atomo. 625 | 626 | ----------------- 627 | 628 | Verdad o falso: `(lat? l)` cuando `l` es `((Juan) Rollo no puede comer mas pollo)` 629 | 630 | Falso, 631 | porque `(car l)` es una lista. 632 | 633 | ----------------- 634 | 635 | Verdad o falso: `(lat? l)` cuando `l` es `(Juan (Rollo no) puede comer mas pollo)` 636 | 637 | Falso, 638 | porque uno d los expreciónes-S en `l` es una lista. 639 | 640 | ----------------- 641 | 642 | Verdad o falso: `(lat? l)` cuando `l` es `()` 643 | 644 | Verdad, 645 | porque no hay lista adentro 646 | 647 | ----------------- 648 | 649 | Verdad o falso: una lat es una lista de atomos? 650 | 651 | Verdad! 652 | Cada lat es una lista de atomos! 653 | 654 | ----------------- 655 | 656 | Escribe el función `lat?` usando unos, pero no necesariamente todo, de esos funciónes: `car` `cdr` `cons` `null?` `atom?` y `eq?` 657 | 658 | No tenemos expectacion que puedes hacer eso todavia. Porque faltas unos ingredientes. Haces los siguentes preguntas. Buena suerte. 659 | 660 | ----------------- 661 | 662 | Estas descansado? 663 | 664 | ----------------- 665 | 666 | ``` 667 | (define lat? 668 | (lambda (l) 669 | (cond 670 | ((null? l) #t) 671 | ((atom? (car l)) (lat? (cdr l))) 672 | (else #f)))) 673 | ``` 674 | Que es el valor de `(lat? l)` cuando `l` es el argumento `(panzeta y huevos)` 675 | 676 | `#t`. 677 | Eso aplicación `(lat? l)` cuando `l` es `(panzeta y huevos)` tiene el valor `#t` -- verdad -- porque `l` es un lat. 678 | 679 | ----------------- 680 | 681 | Como podemos saber es `#t` por la aplicación `(lat? l)` 682 | 683 | No tenemos expectacion que puedes hacer eso tampoco. 684 | Sabemos porque podemos ver que preguntas lat?. 685 | Estrategia: Escribe la definición del función `lat?` y ver eso por las siguentes preguntas. 686 | 687 | ----------------- 688 | 689 | Que es la primera pregunta de `(lat? l)` 690 | 691 | `(null ?)` 692 | 693 | recuerda: 694 | `(cond ...)` para iniciar las preguntas; 695 | `(lambda ...)` crea una función; y 696 | `(define ...)` da una nombre. 697 | 698 | ----------------- 699 | 700 | Que significa la linea 701 | `((null? l) #t)` 702 | cuando 703 | `l` es `(panzeta y huevos)` 704 | 705 | `(null? l)` pregunta si el argumento `l` es la lista null. Si es, el valor de el aplicación es verdad `#t`. Si no, preguntamos la proxima pregunta. En eso caso, `l` no es la lista null, entonces preguntamos la proxima pregunta. 706 | 707 | ----------------- 708 | 709 | Que es la proxima pregunta? 710 | 711 | `(atom? (car l))` 712 | 713 | ----------------- 714 | 715 | Que significa la linea 716 | `((atom? (car l)) (lat? (cdr l)))` 717 | cuando 718 | `l` es `(y huevos)` 719 | 720 | `(atom? (car l))` pregunta si `(car l)` es un atomo. Si es un atomo, el valor de la aplicación es `(lat? (cdr l))`. Si no, preguntamos la proxima pregunta. en eso caso `(car l)` es un atomo, entonces queiremos saber si el resto de la lista `l` es solo atomos. 721 | 722 | ----------------- 723 | 724 | Que significa `(lat? (cdr l))` 725 | 726 | `(lat? (cdr l))` es para saber si el resto de la lista `l` solo tiene atomos. Estamos usando el funcion `lat?` otra vez, pero eso ves, con el argumento `(cdr l)`, cual es `(huevos)`. 727 | 728 | ----------------- 729 | 730 | Que es la proxima pregunta? 731 | 732 | `(null? l). 733 | 734 | ----------------- 735 | 736 | Que es la significa de la linea 737 | `((null? l) #t)` 738 | cuando 739 | `l` es ahora `(huevos)` 740 | 741 | `(null? l)` pregunta si el argumento `l` es la lista null. Si es, el valor de el aplicación es `#t` -- verdad. Si no, vamos a la proxima pregunta. En eso caso, `l` no es null, entonces vamos a la proxima pregunta. 742 | 743 | ----------------- 744 | 745 | Que es la proxima pregunta? 746 | 747 | `(atom? (car l))`. 748 | 749 | ----------------- 750 | 751 | Que significa la linea 752 | `((atom? (car l)) (lat? (cdr l)))` 753 | cuando 754 | `l` es `(huevos)` 755 | 756 | `(atom? (car l))` pregunta si `(car l)` es un atomo. Si es un atomo, el valor de la aplicación es `(lat? (cdr l))`. Si `(car l)` no es un atomo, preguntamos la proxima pregunta. En eso caso, `(car l)` es un atomo, entonces, otro vez vamos a ver `(lat? (cdr l))` 757 | 758 | ----------------- 759 | 760 | Que significa `(lat? (cdr l))` 761 | 762 | `(lat? (cdr l))` pregunta si el resto de la lista `l` solo tiene atomos. Usa el función `lat?`, con `l` transformando hasta el valor de `(cdr l)`. 763 | 764 | ----------------- 765 | 766 | Ahora, que es el argumento por `lat?` 767 | 768 | `()`. 769 | 770 | ----------------- 771 | 772 | Que significa la linea 773 | `((null? l) #t)` 774 | cuando 775 | `l` es ahora `()` 776 | 777 | `(null? l)` pregunta si `l` es la lista null. Si es, el valor de el aplicación es el valor #t. Si no, preguntamos la proxima pregunta. En eso caso, () es la lista null. Entonces, el valor de la aplicación `(lat? l)` cuando 778 | `l` es `(panzeta y huevos)`, es #t --- verdad. 779 | 780 | ----------------- 781 | 782 | Recuerdas la preguntas sobre `(lat? l)` 783 | 784 | Problamente no. La aplicación `(lat? l)` tiene el valor de #t cuando la lista `l` es una lista de atomos cuando `l` es `(panzeta y huevos)`. 785 | 786 | ----------------- 787 | 788 | Puedes usar tu proprio palabras para explicar que hace `lat?`? 789 | 790 | Aca son nuestro palabras: 791 | "`lat?` vea cada expresión-S en la lista. Pregunta si cada es un atomo, hasta que no hay mas. Si todo son atomos, el resulto es `#t`. Si encuentra una lista, el resulto es `#f` --- falso." 792 | Ahora vamos a ver un ejemplo que resulto en falso. 793 | 794 | ----------------- 795 | 796 | Aca es el función `lat?` otra vez: 797 | ``` 798 | (define lat? 799 | (lambda (l) 800 | (cond 801 | ((null? l) #t) 802 | ((atom? (car l)) (lat? (cdr l))) 803 | (else #f)))) 804 | ``` 805 | Que es el valor de `(lat? l)` cuando 806 | `l` es `(panzeta (y huevos))` 807 | 808 | #f, 809 | porque la lista `l` tiene un expresión-S adentro que es una lista. 810 | 811 | ----------------- 812 | 813 | que es la primer pregunto? 814 | 815 | `(null? l)`. 816 | 817 | ----------------- 818 | 819 | Que es la significa de la linea 820 | `((null? l) #t)` 821 | cuando `l` es `(panzeta (y huevos))` 822 | 823 | `(null? l)` pregunta si `l` es la lista null. Si eso es la lista null, el valor es `#t`. Si `l` no es la lista null, vamos a la proxima pregunta. En ese caso, no es null, entonces, preguntamos la proxima pregunta. 824 | 825 | ----------------- 826 | 827 | Que es la proxima pregunta? 828 | 829 | `(atom? (car l))` 830 | 831 | ----------------- 832 | 833 | Que es la significa de la linea 834 | `((atom? (car l)) (lat? (cdr l)))` 835 | cuando 836 | `l` es `(panzeta (y huevos))` 837 | 838 | `(atom? (car l))` preguntas si `(car l)` es un atomo. Si es un atomo, el valor es `(lat? (cdr l))`. Si no es un atomo, vamos a la proxima pregunta. En ese caso, `(car l)` es un atomo, entonces vamos a ver si el resto de la lista `l` solo tiene atomos adrentro. 839 | 840 | ----------------- 841 | 842 | Que significa `(lat? (cdr l))` 843 | 844 | `(lat? (cdr l))` ver para saber si el resto de la lista `l` solo tiene atomos adrentro, eso vez usamos `(cdr l)` in lugar de `l`. 845 | 846 | ----------------- 847 | 848 | Que significa la linea `((null? l) #t)` cuando `l` ahora es `((y huevos))` 849 | 850 | `(null? l)` pregunta si `l` es la lista null. Si es null, el resulto es `#t`. Si no es null, vamos a la proxima pregunta. En eso caso, `l` no es null, entonces vamos a la proxima pregunta. 851 | 852 | ----------------- 853 | 854 | Que es la proxima pregunta? 855 | 856 | `(atom? (car l))` 857 | 858 | ----------------- 859 | 860 | Que significa de la linea `((atom? (car l)) (lat? (cdr l)))` cuando `l` es ahora `((y huevos))` 861 | 862 | `(atom? (car l))` pregunta si `(car l)` es un atomo. Si es un atomo, el valor es `(lat? (cdr l))`. Si no es, vamos a la proxima pregunta. En eso caso, `(car l)` no es un atomo, entonces vamos la proxima pregunta. 863 | 864 | ----------------- 865 | 866 | Que es la proxima pregunta? 867 | 868 | `else`. 869 | 870 | ----------------- 871 | 872 | Que significa la pregunta `else`? 873 | 874 | `else` significa verdad. 875 | 876 | ----------------- 877 | 878 | `else` significa verdad? 879 | 880 | Sí, porque la pregunta `else` es siempre verdad! 881 | 882 | ----------------- 883 | 884 | `else` 885 | 886 | verdad. 887 | 888 | ----------------- 889 | 890 | Porqué `else` es la ultima pregunta? 891 | 892 | Porque no necisitamos nada mas preguntas. 893 | 894 | ----------------- 895 | 896 | Porqué no necesitams nada mas preguntas? 897 | 898 | Porque una lista puede estar vacio, puede tener un atomo en la primera posición, o puede tener una lista en la primera posición. 899 | 900 | ----------------- 901 | 902 | que significa la linea `(else #f)` 903 | 904 | `else` es siempre verdad, entonces el resulto es `#f`. 905 | 906 | ----------------- 907 | 908 | Que es `)))` 909 | 910 | Son parentesis para cerrar `(cond`, `(lambda`, y `(define`. Ellos son en el inicio de la definición. 911 | 912 | ----------------- 913 | 914 | Puede explicar como determinamos el valor `#f` por `(lat? l)` cuando `l` es `(panzeta (y huevos))` 915 | 916 | Aca es una forma decir eso: 917 | "`(lat? l) mira cada argumento en `l` para saber si es un atomo. Si ya miró cada argumento, y no encontra un lista, `(lat? l)` es `#t`. Si encontra una lista, como pasa en ejemplo `(panzeta (y huevos))`, el valor de `(lat? l)` es `#f`. 918 | 919 | ----------------- 920 | 921 | "or" es la palabra en inglés por "o". 922 | 923 | Es `(or (null? l1) (atom? l2))` verdad o falso cuando `l1` es `()` y `l2` es `(d e f g)` 924 | 925 | Verdad, 926 | porque `(null? l1)` es verdad cuando `l1` es `()`. 927 | 928 | ----------------- 929 | 930 | Es `(or (null? l1) (null? l2))` verdad o false cuando `l1` es `(a b c)` y `l2` es `()` 931 | 932 | Verdad, 933 | porque `(null? l2)` es verdad cuando `l2` es `()`. 934 | 935 | ----------------- 936 | 937 | Es `(or (null? l1) (null? l2))` verdad o false cuando `l1` es `(a b c)` y `l2` es `(atom)` 938 | 939 | Falso, 940 | porque `(null? l1)` y `(null? l2)` no son verdades cuando `l1` es `(a b c)` y `l2` es `(atom)`. 941 | 942 | ----------------- 943 | 944 | Que hace `(or ...)`? 945 | 946 | Hace dos preguntas, uno y despues el otro. Si uno es verdad, termina y el resultado es verdad. Si la primer no es verdad, vamos a la segunda pregunta y el resultado es el resultado de la seguda pregunta. 947 | 948 | ----------------- 949 | 950 | --------------------------------------------------------------------------------