Rutas
/
Common Lisp
Common Lisp
/
Ejercicios
/
Sorting Socks and Sexprs
Sorting Socks and Sexprs

Sorting Socks and Sexprs

Ejercicio de aprendizaje

Introducción

Comentarios

Common Lisp permite al programador escribir «comentarios» que el ordenador ignora. Los comentarios de una sola línea empiezan con uno o varios puntos y coma (;) y, de vez en cuando, puede que veas lo siguiente:

(code...) ; => value

donde el comentario se usa para indicar qué valor devuelve Common Lisp tras ejecutar el código de esa línea.

Es idiomático usar un solo punto y coma para un comentario corto al final de una línea, dos para un comentario más largo encima de una sección de código, tres para un comentario largo que describe algo como una función y cuatro para un comentario como una cabecera al principio de un fichero fuente.

Cons

Todos los objetos de Common Lisp son o bien «átomos» (valores únicos e indivisibles) o bien «conses» (creados por la función de construcción «cons»). Un cons se compone de dos partes: el primer elemento y el resto de los elementos. Por razones históricas, estas dos partes se llaman car y cdr. Cuando estos conses se evalúan como código, el primer elemento (car) representa la función que se llama, mientras que el resto de los elementos (cdr) representan los argumentos de esa función:

(<function> <arg1> <arg2> ... <argN>)
; ^ car ^  |        ^ cdr ^

Expresiones

Todo el código de Common Lisp está hecho de S-Expressions (expresiones simbólicas). Para abreviar, se llaman sexprs. Cada sexpr es un átomo o un cons. Cuando se evalúan las S-Expressions, devuelven automáticamente algún valor que ocupa el lugar de la expresión. Cuando escribes tus propias funciones (con defun), el último valor dentro del cuerpo del defun se devuelve automáticamente:

;; Defining a new function
(defun gimme-foo () 'foo)
;; Calling the function as an S-Expression
(gimme-foo) ; => FOO

Símbolos

Los símbolos en Common Lisp son valores especiales que pueden apuntar a otros valores o, en el caso de las keywords, a sí mismos. Cuando Lisp evalúa los símbolos, estos se sustituyen por los valores a los que apuntan:

foo  ; => <whatever-foo-points-to>
:foo ; => :FOO

Ten en cuenta que las keywords se indican con dos puntos (:) al principio.

El quoting (añadir ' delante de una S-expression) le indica a Lisp que no evalúe esa expresión. Al hacer quoting de 'foo en nuestro ejemplo de defun, evitamos que Lisp intentara buscar (y no encontrara) aquello a lo que se suponía que apuntaba FOO y, en su lugar, devolvimos el propio valor FOO. Si FOO no se ha definido en ningún sitio de nuestro programa:

foo  ; => <ERROR! Lisp doesn't know what foo points to!>
'foo ; => FOO

Por ahora, puedes considerar esto simplemente como una forma de devolver símbolos desde una función, pero volveremos sobre el quoting y exploraremos más a fondo sus implicaciones en futuros ejercicios de concepto.

Instrucciones

¡Tú! Sí, tú, ¡valiente lisper! ¡Lenny, el alienígena de Lisp necesita tu ayuda! Lenny quiere ir a pasar el rato con los demás alienígenas de Lisp, pero sus padres le han dicho que no va a ir a ninguna parte hasta que su habitación esté limpia.

El problema es que ¡Lenny apenas puede ver el suelo! ¡Lenny no distingue sus átomos de sus conses, sus símbolos de sus palabras clave, sus car de sus cdr!

¿Puedes ayudar a Lenny a poner orden en este desastre? ¡No te olvides de tus paréntesis, los vas a necesitar!

1. Pon al día a Lenny con los símbolos

Antes de que Lenny pueda ponerse manos a la obra, necesita repasar cómo son los símbolos y las palabras clave: hace ya tiempo que no ordena nada... Ayuda a Lenny definiendo dos funciones: lennys-favorite-food, que se evalúa a algún símbolo, y lennys-secret-keyword, que se evalúa a alguna palabra clave. Por ejemplo:

(lennys-favorite-food) ; => LASAGNA
(lennys-secret-keyword) ; => :ALIENS-ARE-REAL

Ten en cuenta que puedes devolver el símbolo o la palabra clave que quieras (si no te gusta la lasaña o no crees en los alienígenas).

2. Ayuda a Lenny a distinguir entre átomos y conses

Una vez que Lenny haya repasado los símbolos y las palabras clave, ¡es hora de limpiar! Para clasificar todas las S-Expressions que hay tiradas por su habitación, Lenny necesita ayuda para determinar qué es un cons y qué es un átomo. Puedes ayudar implementando dos funciones, is-an-atom-p e is-a-cons-p:

(is-an-atom-p 'one-thing)    ; => T
(is-an-atom-p '(two things)) ; => NIL
(is-a-cons-p 'one-thing)    ; => NIL
(is-a-cons-p '(two things)) ; => T

Para esta sección, hay varias funciones integradas de Lisp que te pueden resultar útiles. Además, por ahora puedes considerar simplemente que T es verdadero y NIL es falso.

3. Ayuda a Lenny a separar sus conses

Por último, los conses de Lenny son demasiado abultados como para guardarlos ordenadamente, así que necesita dividirlos en partes más pequeñas. ¿Puedes ayudar definiendo dos funciones más para descomponer sus conses (first-thing y rest-of-it)?

(first-thing '(first second third)) ; => FIRST
(rest-of-it  '(first second third)) ; => (SECOND THIRD)

De nuevo, puede que algunas de las funciones integradas de Common Lisp te vengan bien aquí.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Common Lisp Exercism

¿Listo para empezar Sorting Socks and Sexprs?

Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.