Este es un ejemplo de un libro que estoy leyendo:
volume = begin
len = 10
breadth = 20
height = 30
len * breadth * height
end
¿Por qué necesito expresiones compuestas? Podría escribir volume = 10 * 20 * 30o volume = len * breadth * heightescribir una función para eso o una función anónima ...
¿Por qué uso beginy end? O la pregunta probablemente mejor: ¿ cuándo los uso, ya que supongo que el ejemplo anterior del libro probablemente no sea muy bueno?

Respuestas:
Supongo que hay muchas situaciones en las que los
begin ... endbloques son útiles, pero como notó, a menudo también puede lograr un efecto similar con otras construcciones, como funciones, etc.¿Para qué podrían
begin ... endusarse los bloques?len,breadthyheightsólo existirá dentro del bloque y no contamina el espacio de nombres circundante.@inbounds begin <all my code without bounds checking goes here> endo envolviendo un@time begin ... endcódigo de una pieza.begin ... end, no introduce un alcance local, pero el argumento es válido para ellet ... endbloque similar ).En particular, el segundo punto es para qué los uso en mis códigos.
fuente
beginlos bloques qué no presento alcance . Por otro lado, convierten una secuencia de declaraciones en una expresión, lo que puede ser útil si genera código con / desde una macro.let ... endlo que introduce un alcance local. Corregirá mi respuesta.beginbloques introducen un alcance local.Para generalizar lo que todos han dicho: los bloques le permiten convertir una lista de declaraciones ("frases" sintácticas que no tienen valores, es decir, no se pueden asignar) a una expresión (una "frase" que representa valores y se puede asignar )
Por ejemplo, aunque no deberías, puedes escribir
asignar
xal resultado de una operación de bucle. (Con la restricción de que la última instrucción de la secuencia debe ser realmente una expresión; de lo contrario, no tendría ningún valor para la expresión).Un caso de uso legítimo de esto es el código generado. Por ejemplo, podrías activar
dentro
transparente para el usuario, mientras que
@somethingpuede generar libremente cualquier construcción de lenguaje.O si desea escribir una función anónima con un cuerpo más largo (y no usar el
functionformulario):fuente
x = y = 1,,a = if false endyb = for i in 1:2 enddespués de lo cualxtiene el valor1,aybambos tienen el valornothing.if-elsedeclaración:a = if false; 1 else 2 end. En este caso,aes igual2.setproperty!/setindex!, y es "tradicionalmente" que tenga un valor (en lenguajes tipo C). Lo mismo paraif-else, que es una expresión en un par de idiomas. Peroforyifsinelsetener un valor "predeterminado" denothing, veo eso como un mero artefacto.Un uso para estos bloques es en las comprensiones:
Podrías hacer una función y usarla dentro de la comprensión, pero a veces esto es conveniente. Se usa siempre que desee usar un bloque de código multilínea en algún lugar, por ejemplo, para pasarlo como argumento a una macro (que se usa muy comúnmente
@testsetdesde la biblioteca estándar de Prueba).fuente
y^2 - y^4 + 2en este caso. Quizás sería mejor mostrar un ejemplo donde realmente se necesitan dos (o más) pasos.En pocas palabras: "comenzar" solo denota un bloque de código (vea los documentos sobre esto: https://docs.julialang.org/en/v1/base/base/#begin ).
En el ejemplo anterior, no está claro que haya un valor para usar un bloque de inicio frente a declarar una función.
No veo que esa palabra clave se use mucho en el código y personalmente nunca la he usado en la práctica. Mi sugerencia es que solo use una función, ya que hará lo mismo.
fuente
prognen LISP).