Hola.
No es nada importante, sólo un proyecto más para aprender sobre cómo se implementa un lenguaje de programación, su intérprete, etc... Aparte no había ningún intérprete de Scheme decente para .NET así que era un proyecto útil. (se puede compilar en una dll y usar como lenguaje de extensión en cualquier programa .NET)
Siempre me he interesado por lenguajes imperativos (como C) así que quise ver algo diferente; Scheme es un lenguaje funcional con algunas características extrañas a lenguajes como C, como macros, closures, continuaciones... (en la wikipedia y en páginas sobre Scheme explican mejor todas sus propiedades).
Ésto viene a ser un intérprete de ese lenguaje, escrito en C#. Es decir, tú escribes programas en Scheme y SharpScheme los ejecuta, del mismo modo que Python interpreta programas en Python o Gcc compila programas en C.
Un ejemplo de programa sencillo en Scheme, que calcula el factorial de un número dado. Me gusta poner el ejemplo porque da a entender lo distinto que puede ser un lenguaje funcional. : -)
Función factorial en C:
long int factorial (int n) {
if (n<2)
return 1;
else
return n * factorial(n-1);
}
Función factorial en Scheme al estilo de la de C (recursiva):
(define (fact n)
(if (< n 2)
1
(* n (fact (- n 1)))))
Función factorial en Scheme, pero en estilo funcional:
;; Defino una función que me de un rango de nºs...
(define (range low high)
(cond
(> low high) '())
(else (cons low (range (+ low 1) high)))))
;; Defino factorial
(define (fact n) (apply * (range 1 n)))
Esta última solución es particularmente interesante, porque se ve cómo se piensa
en un lenguaje funcional. Se define factorial como la aplicación de la función '*' (multiplicación)
al rango de números que va desde 1 hasta N. (donde N es el factorial a calcular)
Si lo probamos en SharpScheme:
(define (range low high)
(if (> low high) '()
(cons low (range (+ 1 low) high))))
range
(define (fact n) (apply * (range 1 n)))
fact
(fact 10)
3628800
(fact 50)
3,04140932017134E+64