En Scheme se usa una extraña forma de evaluar expresiones, se llama Notación prefija y aunque al principio parece difícil de comprender, con muy poca práctica se comprende perfectamente cómo se evalúan esas expresiones. A continuación voy a explicar un poco la idea. Disfrútenlo.
Las expresiones aritméticas que usamos generalmente en nuestros cómputos usan notación infija, es decir, ponemos los operadores entre los operandos. Una consecuencia inmediata es que cuando hacemos una operación compuesta por varias expresiones distintas (por ejemplo multiplicaciones y sumas en la misma expresión) es necesario establecer unas reglas especiales para que el computador evalúe las operaciones de tal manera que refleje el cálculo que esperamos que haga. Por ejemplo, si escribimos 1+2*3, lo que queremos es que nos ofrezca como resultado 7, ya que nosotros implícitamente hacemos las multiplicaciones primero, en realidad eso es lo que el computador va a hacer pero porque existe una regla llamada precedencia de operadores que dice que primero se hagan las multiplicaciones antes que las sumas. Por otro lado, no es extraño que alguien piense que el resultado es la evaluación en secuencia de la expresión, por ejemplo 1+2=3*3=9. Es decir, si la expresión se leyera en secuencia la operación no daría el resultado esperado. Es obvio que si quisieramos que la expresión dé 9 como resultado, hay que usar paréntesis para obligar a la computadora a hacer primero la suma.

Las expresiones en notación infija tienen una inconsistencia inevitable: siempre habrá expresiones prefijas y se mezclarán con expresiones infijas. Muchas funciones matemáticas ordinarias usan notación prefija, por ejemplo el seno de un ángulo: sen(pi/2), en ésta expresión, familiar para nosotros, el operador es sen y el operando es pi/2. Otros ejemplos son los operadores log o raíz, que siempre se escriben antes de los operandos. Por otro lado, la notación prefija exige una forma consistente de escribir las expresiones y evaluarlas: siempre serán expresiones prefijas.

Las expresiones en notación prefija nacen como una forma de evitar los paréntesis en una expresión, sin embargo eso sólo ocurre cuando las expresiones tienen cierta cualidad que las hace no ambíguas. Por otro lado, la utilidad que tienen en el procesamiento de los computadores las hace ideales para representar ciertas operaciones que se hacen con mucha frecuencia con unos objetos especiales llamados pilas (stacks), muy similares a otros objetos llamados listas (lists) que son como la representación de alto nivel de las primeras. En realidad, un computador, conceptualmente se puede considerar un procesador de pilas, es decir, de procesos u operaciones que se hacen una a la vez en una secuencia estricta, es la base conceptual de su funcionamiento, por lo que entender las pilas (o listas) implica entender el funcionamiento de una computadora.

Scheme

El primer acercamiento a Scheme es usarlo para comprender la notación prefija. Las expresiones en scheme siempre están entre paréntesis, éstos obligan al lenguaje y al programador a tener un orden claro de las operaciones y todas las expresiones son prefijas. Scheme puede ser una calculadora simple de expresiones prefijas.

Una expresión en esta notación consiste en evaluar primero las expresiones del paréntesis más interno. De alguna manera consiste en ir eliminando los paréntesis reemplazandolos por expresiones concretas llamadas atómicas a las que no hay que hacerles ninguna operación adicional, por ejemplo un número que en sí mismo puede ser un resultado final.

Por ejemplo:

Notación infija: 1+2*3

Notación prefija: (+ 1 (* 2 3))

como se describió anteriormente, la evaluación de la expresión prefija consiste en eliminar primero el paréntesis más interno en el que se multiplican 2 y 3 (y todos los números u otras expresiones), llegando al resultado atómico intermedio 6, éste resultado reemplaza el paréntesis y a continuación se evalúa la suma de 1 y 6.

  1. (+ 1  (* 2 3))
  2. (+ 1 6)
  3. 7

Si la expresión que quisiéramos evaluar fuera

Notación infija: (1+2)*3, se escribiría

Notación prefija: (* 3 (+ 1 2))

La primera la entendemos y sabemos que da 9, la segunda la evaluamos como reemplazar el paréntesis más interno por el valor atómico 3 dado que es la suma de 1 y 2, una vez reemplazado multiplicarlo por 3.

  1. (* 3 (+ 1 2))
  2. (* 3 3)
  3. 9

Práctica

Aprender a usar la notación prefija es como aprender un hobby: requiere mucha práctica. Así que como si estuviéramos aprendiendo a tocar guitarra, vamos a hacer muchos ejercicios básicos para dominar la técnica básica.

Convertir las siguientes expresiones a notación prefija y evaluar el resultado:

  1. 1+2+3+4
  2. 1+2+3*4
  3. 1*2+3*4
  4. (1+2)*3+4
  5. (1+2)*(3+4)

Evaluar las siguientes expresiones:

  1. (+ 1 2 3 4)
  2. (* 1 2 3 4)
  3. (- 5 4 3 2)
  4. (- (+ 5 4) 3)
  5. (+ (- 5 4) (- 3 2))
  6. (* (+ 1 2) (- 3 4) (* 5  (+ 6 7)))
  7. (/ (+ 65 4) (- 32 1) )
  8. (/ (- 65 4) 32)

Respuestas: 1. 10, 2. 24, 3. -4, 4. 6, 5. 2, 6. -195, 7. 2.2258, 8. 1.90625

Para siguientes expresiones de la siguiente imagen, conviertalas a notación prefija (clic para ver más grande):

Expresiones

Resumen

Las notaciones son una forma distinta de escribir lo que usualmente escribimos como expresiones matemáticas, la notación prefija escribe primero los operadores o identificadores de la función a ejecutar y luego los operandos. En scheme, todas las expresiones (excepto unas pocas formas especiales) son expresiones prefijas encerradas en paréntesis.