pure
se ha ampliado un poco desde el lanzamiento de TDPL, desde pure
como TDPL describe resulta demasiado restrictivo para ser útil más allá de las funciones matemáticas simples y similares. Se puede ver en the online documentation para la definición actual, pero en esencia se reduce a esto:
pure
funciones no pueden acceder a cualquier nivel de módulo o variables estáticas que pueden ser mutados durante el transcurso del programa (que debe haber const
tipos de valor o immutable
para acceder desde una función pure
).
pure
funciones no pueden llamar a ninguna función que no sea pure
.
pure
funciones no pueden realizar E/S.
Eso es todo. No hay otras restricciones Sin embargo, hay son restricciones adicionales requeridas si se va a optimizar una función pure
de modo que solo se llame una vez, incluso si se usa varias veces dentro de una instrucción. A saber:
- parámetros de la función debe ser
immutable
o implícitamente convertible en immutable
.
En teoría que podría ampliarse a exigir que argumentos de la función deben ser immutable
o implícitamente convertible en immutable
(de modo que una función con const
parámetros podría optimizarse cuando se administra immutable
argumentos), pero eso no es actualmente el caso.
Tales funciones de pure
a veces se denominan "fuertemente" pure
, mientras que aquellas que no se pueden optimizar se conocen como "débilmente" pure
. TDPL describe fuertemente las funciones pure
. Débilmente se agregaron pure
funciones para hacer que pure
se pueda usar de manera más general.
Mientras débilmente pure
funciones pueden alterar sus argumentos, no pueden alterar el estado global, por lo que cuando son llamados por pure
fuertemente funciones (que no puede alterar sus argumentos), la garantía de que el fuerte pure
El valor de retorno de la función siempre será el mismo para los mismos argumentos que aún se mantienen. Esencialmente, debido a que las funciones débiles pure
no pueden mutar el estado global, son parte del estado privado de la función fuertemente pure
a partir de la cual son llamadas. Por lo tanto, está muy alineado con lo que describe Andrei en la sección 5.11.1.1 pure
es pure
Tiene en TDPL, excepto que el estado privado de la función se ha expandido para permitir funciones que pueden alterar su estado privado sin alterar el estado global .
Otra cosa importante de la nota que se ha agregado desde TDPL con respecto a pure
es la inferencia del atributo de la función. pure
, nothrow
y @safe
se deducen para las funciones de plantilla (aunque no para las funciones normales). Entonces, si una función de plantilla puede ser pure
, ahora es espure
. Su pureza depende de con qué se crea una instancia. Entonces, es posible usar pure
con funciones de plantilla, mientras que antes, por lo general no se podía, porque si lo hacía pure
, no funcionaría con una función impura. Pero si no lo hizo hacerlo pure
, entonces no podría usarlo con una función pure
, por lo que era un problema importante para pure
. Afortunadamente, atribuimos correcciones de inferencia que ahora sí. Siempre que una función de plantilla siga las reglas enumeradas anteriormente cuando se crea una instancia, entonces se considera pure
.
He intentado limpiar la etiqueta [tag: pure], porque a veces se refiere a funciones virtuales puras, a veces a [puro] (http://beebole.com/pure/) y a veces a [pure ] (http://en.wikipedia.org/wiki/Pure_ (programming_language)) - entre otros. Pero no sé nada sobre [tag: d]. ¿Podría confirmar si la edición de mi etiqueta es apropiada? ¿Funcionaría [tag: puramente funcional] para esta pregunta? Creé [tag: pure-function], así que si [tag: pure-functional] funciona, creo que sería mejor usar la etiqueta existente. –
@RichardJPLeGuen Pure como en [pureza funcional] (http://en.wikipedia.org/wiki/Pure_function), por lo que pure-function funcionaría para esta pregunta. puramente funcional, no tanto. – Arlen
Gracias, @Arlen! –