Statements vs expressions.

En este post te voy a explicar cuál es la diferencia entre un statement y una expression.

Primeros pasos.

Una expresión (expression) es un conjunto de instrucciones que producen un resultado. En cambio, una sentencia (statement) es un conjunto de instrucciones que no producen un resultado explícito.

//Statements shouldn't return a value.
def doSomething() = {
println("Doing something...")
}
//Expression should always return a value
def divisibleByTwo(input:Double) = input % 2
doSomething()
//Obviously, a program is composed by statements and expressions.
val result = divisibleByTwo(10)
println(result)

Este concepto puede variar entre lenguajes de programación, por ejemplo, las estructuras de control, en algunos lenguajes las puedes considerar como sentencias, y en otros, funcionan como sentencias y expresiones. Ambos tipos de instrucciones son necesarias para escribir un programa.

En el caso del paradigma funcional, las expresiones son preferidas debido a que, en teoría, ofrecen una mejor transparencia referencial. Esto depende de como se escriba la expression.

No todos los lenguajes son iguales.

En lenguajes como Scala o Ruby, todo, o casi todo, puede considerarse una expresión. Por ejemplo, un bloque if puede ser asignado a una variable, lo que lo convierte en una expresión. En el caso de C#, un bloque if no es una expression y causará un error de compilación si se intenta asignar a una variable.

internal static class ExpressionsExample
{
private static void DoSomething() => Console.WriteLine("Doing something");
public static void Main()
{
//void methods can't be a expression.
var voidResult = DoSomething();
//This isn't possible en dotnet.
//Not all control structures can return a value.
var expressionResult = if (21 % 2 == 0) 10 else 20
}
}

En el ejemplo anterior, intente asignar un método de tipo void, y una sentencia if en C#, solo obtuve errores de compilación, porque el lenguaje no ve estos elementos como expresiones, sino como sentencias.

En el caso de Scala, esto es posible.

//Unit is the equivalent to Void
def doSomething():Unit = {
println("Doing something")
}
//A normal if statement can be used as expression
var expressionResult = if(21 % 2 ==0) 10 else 20
println(expressionResult)
//In Scala, even the void methods can be a expression
var voidResult = doSomething()
println(voidResult)

Un método que no retorna nada, puede ser asignado como una expresión. Se podría decir que en Scala no existen las sentencias. Asignar un método sin retorno a una variable no hace sentido, únicamente es un ejemplo.

Conclusiones.

Estos conceptos no son universales, y pueden variar dependiendo del lenguaje, tecnologias o paradigma que ocupes. Incluso, esta distinción entre código que retorna un resultado e instrucciones que no, puede encontrarse con métodos y procedimientos en otros lenguajes. La diferencia entre estos conceptos es importante si estás trabajando con paradigma funcional o high order functions.

Referencias:

  1. https://www.learningjournal.guru/article/scala/functional-programming/statements-and-expressions-in-scala/#google_vignette 

 

Gustavo Sánchez

Soy especialista en escribir software de calidad. Mediante el uso de marcos de trabajo, técnicas y automatización de procesos he podido reducir los costes operativos de los sistemas de la empresa. Sistemas confiables y adaptables producen clientes felices.

Site Footer