Introducción a Scheme y la Programación Funcional

Scheme es un lenguaje de programación basado en el paradigma funcional, es uno de los dialectos más conocidos de Lisp y la esencia de su implementación se basa en el siguiente principio: "Los lenguajes no se deberían desarrollar añadiendo muchas características, sino quitando las debilidades y las limitaciones que hacen que las características adicionales parezcan necesarias". Para poder comprender a este lenguaje es importante entender el concepto de lista que, si bien es cierto no es la única estrucutura de datos, sí es la más importante.

En este primer artículo mostraré el uso de algunos conceptos básicos como son los operadores, las condicionales y la recursión, los cuales servirán para familiarizarnos un poco con la sintaxis de Scheme.

1.- El clásico ejemplo del factorial de un número
En este ejemplo podemos apreciar el uso de la ejecución condicional a través de la función cond cuya sintaxis es la siguiente:

(cond (<condition1> <result1>)
(<condition2> <resultt2>) …
(<conditionn> <resultn>)
(else <else-result>) ;optional else clause
)
(define (factorial n)
  (cond ((= n 1) 1)
        (else (* n (factorial (- n 1))))
        )
  )
2.- Sumatoria desde 1 hasta n
(define (suma n)
  (cond ((= n 0) 0)
        (else (+ n (suma (- n 1))))
    )
  )
3.- Valor absoluto
(define (valor_absoluto x)
  (cond ((< x 0) (* -1 x))
        (else x)
        )
  )
4.- Longitud de una lista
(define (longitud x)
  (cond ((null? x) 0)
        (else (+ 1 (longitud (cdr x))))
  )
  )
5.- Sumatoria de los elementos de una lista
La función car devuelve el primer elemento de una lista.
(define (suma_lista x)
  (cond ((null? x) 0)
        (else (+ (car x) (suma_lista (cdr x))))
    )
  )
6.- Concatenación de dos listas
(define (concatenar x y)
  (cond ((null? x) y)
        (else (cons (car x)
                    (concatenar (cdr x) y)
               )
              )
        )
 )
7.- Determinar si un elemento es atómico
(define (atom? x)
 (cond ((symbol? x) #t)
 ((number? x) #t)
 ((char? x) #t)
 ((string? x) #t)
 ((null? x) #t)
 (else #f)
 )
 )
8.- Contar la cantidad de elementos atómicos de una lista
(define (cantidad_elementos_atomicos x)
  (cond ((null? x) 0)
        ((atom? x) 1)
        (else (+ (cantidad_elementos_atomicos (car x)) (cantidad_elementos_atomicos (cdr x))
                 )
              )
    )
  )
En un siguiente artículo hablaremos acerca del lenguaje de programación Racket, el cual usaremos para implementar fractales.

Comentarios