Sie sind auf Seite 1von 7

Programacin funcional

Entrada

Parmetros

Proceso

Subrutina
o funcin

Salida

te los que son puramente funcionales, han sido enfatizados en el ambiente acadmico principalmente y no tanto
en el desarrollo de software comercial. Sin embargo, lenguajes de programacin importantes tales como Scheme,
Erlang, Rust, Objective Caml y Haskell, han sido utilizados en aplicaciones comerciales e industriales por muchas organizaciones. La programacin funcional tambin
es utilizada en la industria a travs de lenguajes de dominio especco como R (estadstica), Mathematica (matemticas simblicas), J y K (anlisis nanciero), F# en Microsoft.NET y XSLT (XML). Lenguajes de uso especco usados comnmente como SQL y Lex/Yacc, utilizan
algunos elementos de programacin funcional, especialmente al procesar valores mutables. Las hojas de clculo
tambin pueden ser consideradas lenguajes de programacin funcional.

Valor de
retorno

La programacin funcional tambin puede ser desarrollada en lenguajes que no estn diseados especcamente
para la programacin funcional. En el caso de Perl, por
ejemplo, que es un lenguaje de programacin imperativo,
existe un libro que describe como aplicar conceptos de
programacin funcional. JavaScript, uno de los lenguajes
ms ampliamente utilizados en la actualidad, tambin incorpora capacidades de programacin funcional. Python
tambin incorpora particularidades de los lenguajes funcionales como listas de comprensin y funciones de tratamiento de listas como matemtica de conjuntos. Java en
su versin 8, esta incorporando la programacin funcional, as como el uso de las expresiones lambda.

Diagrama del funcionamiento de una subrutina.

En ciencias de la computacin, la programacin funcional es un paradigma de programacin declarativa basado


en la utilizacin de funciones aritmticas que no maneja datos mutables o de estado. Enfatiza la aplicacin de
funciones, en contraste con el estilo de programacin imperativa, que enfatiza los cambios de estado. La programacin funcional tiene sus races en el clculo lambda, un
sistema formal desarrollado en los aos 1930 para investigar la denicin de funcin, la aplicacin de las funciones
y la recursin. Muchos lenguajes de programacin funcionales pueden ser vistos como elaboraciones del clculo
lambda.

1 Utilidad
El objetivo es conseguir lenguajes expresivos y matemticamente elegantes, en los que no sea necesario bajar al
nivel de la mquina para describir el proceso llevado a
cabo por el programa, y evitar el concepto de estado del
cmputo. La secuencia de computaciones llevadas a cabo por el programa se rige nica y exclusivamente por la
reescritura de deniciones ms amplias a otras cada vez
ms concretas y denidas, usando lo que se denominan
deniciones dirigidas.

En la prctica, la diferencia entre una funcin matemtica


y la nocin de una funcin utilizada en la programacin
imperativa es que las funciones imperativas pueden tener
efectos secundarios, al cambiar el valor de clculos realizados previamente. Por esta razn carecen de transparencia referencial, es decir, la misma expresin sintctica
puede resultar en valores diferentes en diferentes momentos dependiendo del estado del programa siendo ejecutado. Con cdigo funcional, en contraste, el valor generado
por una funcin depende exclusivamente de los argumentos alimentados a la funcin. Al eliminar los efectos secundarios se puede entender y predecir el comportamiento de un programa mucho ms fcilmente, y esta es una
de las principales motivaciones para utilizar la programacin funcional.

2 Caractersticas

Los programas escritos en un lenguaje funcional estn


constituidos nicamente por deniciones de funciones,
Los lenguajes de programacin funcional, especialmen- entendiendo stas no como subprogramas clsicos de un
1

lenguaje imperativo, sino como funciones puramente matemticas, en las que se verican ciertas propiedades como la transparencia referencial (el signicado de una expresin depende nicamente del signicado de sus subexpresiones), y por tanto, la carencia total de efectos colaterales.
Otras caractersticas propias de estos lenguajes son la no
existencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteracin
(lo que obliga en la prctica a que todas las repeticiones
de instrucciones se lleven a cabo por medio de funciones
recursivas).
Existen dos grandes categoras de lenguajes funcionales:
los funcionales puros y los hbridos. La diferencia entre
ambos estriba en que los lenguajes funcionales hbridos
son menos dogmticos que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de instrucciones o la asignacin de variables. En
contraste, los lenguajes funcionales puros tienen una mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se cumple siempre con un
lenguaje funcional hbrido.

2.1

Funciones de primera clase y de orden


superior

Funciones de orden superior son funciones que pueden


tomar otras funciones como argumentos o devolverlos como resultados. En clculo , un ejemplo de una funcin de
orden superior es el operador diferencial d / dx , que devuelve la derivada de una funcin f .
Las funciones de orden superior estn estrechamente relacionadas con las funciones de primera clase en las cuales las funciones de orden superior y las funciones de primera clase pueden recibir como argumentos y resultados
otras funciones. La distincin entre los dos es sutil: de orden superior, describe un concepto matemtico de funciones que operan sobre otras funciones, mientras que la
primera clase es un trmino informtico que describe
las entidades del lenguaje de programacin que no tienen
ninguna restriccin de su utilizacin (por lo tanto funciones de primera clase pueden aparecer en cualquier parte
del programa que otras entidades de primer nivel como
los nmeros pueden, incluidos como argumentos a otras
funciones y como sus valores de retorno).
Las funciones de orden superior permiten la aplicacin
parcial, una tcnica en la que se aplica una funcin a sus
argumentos uno a la vez, con cada aplicacin devolver
una nueva funcin que acepta el siguiente argumento. Esto le permite a uno expresar, por ejemplo, la funcin sucesor como el operador de suma aplicada parcialmente al
nmero natural uno.

CARACTERSTICAS

2.2 Funciones puras


Las funciones puramente funcionales (o expresiones) no
tienen efectos secundarios (memoria o E/S). Esto signica que las funciones puras tienen varias propiedades tiles, muchas de las cuales pueden ser utilizados para optimizar el cdigo:
Si no se utiliza el resultado de una expresin pura,
se puede eliminar sin afectar a otras expresiones.
Si una funcin pura se llama con parmetros que no
causan efectos secundarios, el resultado es constante
con respecto a la lista de parmetros (a veces llamada transparencia referencial), es decir, si la funcin
pura se llama de nuevo con los mismos parmetros,
el mismo resultado ser devuelto (esto puede habilitar las optimizaciones de almacenamiento en cach).
Si no hay una dependencia de datos entre dos expresiones puras, entonces su orden puede ser invertido,
o pueden llevarse a cabo en paralelo y que no pueda
interferir con los otros.
Si el lenguaje no permite efectos secundarios, entonces cualquier estrategia de evaluacin se puede
utilizar, lo que da la libertad al compilador para
reordenar o combinar la evaluacin de expresiones
en un programa (por ejemplo, usando la poda).
La mayora de los compiladores de lenguajes imperativos detectan funciones puras automticamente y realizan
la eliminacin de subexpresiones comunes. Sin embargo no siempre es posible detectarlo en bibliotecas precompiladas, porque por norma general no dan esta informacin. Esto provoca que no se puedan realizar optimizaciones que podran aplicar a dichas funciones externas.
Algunos compiladores, como gcc, s que aaden palabras
claves adicionales para que el programador marque explcitamente como puras aquellas funciones externas que
proceda, de modo que se le apliquen las optimizaciones
pertinentes. Fortran 95 tambin permite que declarar funciones puras.

2.3 Recursividad
Iterar en los lenguajes funcionales es normalmente llevado a cabo mediante recursividad. Las funciones recursivas se invocan a s mismas, permitiendo que una operacin se realice una y otra vez hasta alcanzar el caso
base. Aunque algunas recursividades requieren el mantenimiento de una pila, la recursividad mediante una cola
puede ser reconocida y optimizada mediante un compilador dentro del mismo cdigo utilizado, para implementar las iteraciones en un lenguaje imperativo. El estndar
del esquema del lenguaje requiere implementaciones para conocer y optimizar la recursividad mediante una cola. La optimizacin de la recursividad mediante una cola

2.5

Tipo de sistemas

puede ser implementada transformando el programa a un utilizada por defecto en multitud de lenguajes funcionaestilo de pase de continuidad durante la compilacin, en- les puros, incluidos Miranda, Clean y Haskell.
tre otros enfoques.
Hughes (1984) defenda la evaluacin no estricta como
Los patrones comunes de recursividad puede ser factori- un mecanismo para mejorar la modularidad de los prozados usando funciones comunes ms grandes, con ca- gramas a travs de la separacin de tareas, a partir de la
tamorsmos y anamorsmos (pliegues y despliegues), implementacin de productores y consumidores de usiendo estos los ejemplos ms evidentes. Tal y como las jos de datos de forma fcil e independiente. Launchbury
mayores funciones ms comunes tienen un rol anlogo (1993) describe algunas dicultades que tena la evaluapara construir estructuras de control se tienen los itera- cin no estricta, particularmente al analizar los requisitos
dores en los lenguajes imperativos.
de almacenamiento de los programas, y propone una seLa mayora de los lenguajes de programacin funcional mntica operacional para ayudar durante el anlisis. Harde propsito general permiten la recursividad sin restric- per (2009) propone incluir ambas tcnicas (evaluacin
ciones y superan el test de Turing, lo que hace que el pro- estricta y no estricta) en el mismo lenguaje, utilizando
grama que se interrumpe no pueda tomar un decisin, lo los tipos del sistema del lenguaje para distinguirlas.
que puede causar una falta de solidez en el razonamiento ecuacional y generalmente requiere introducir inconsistencia dentro de la lgica expresada por los tipos del
sistema del lenguaje. Algunos lenguajes de propsito especial como Coq permiten tan slo recursividad bien fundamentada y tienen una normalizacin fuerte(clculos no
nalizados pueden ser expresados tan slo con ujos de
valores innitos llamados codata) En consecuencia, estos lenguajes fallan el test de Turing y declarar funciones
ciertas en ellos es imposible, pero pueden declarar una
amplia clase de clculos interesantes mientras evitan los
problemas producidos por la recursividad sin restricciones. La programacin funcional limitada a la recursividad
bien construida con unas cuantas restricciones ms se llama programacin funcional total.

2.4

2.5 Tipo de sistemas


Especialmente desde el desarrollo de tipos de inferencia
de Hindley - Milner en la dcada de 1970, los lenguajes de programacin funcionales han tendido a utilizar el
clculo con tipo lambda, en comparacin con el clculo
lambda sin tipo utilizado en Lisp y sus variantes (tales
como el lenguaje scheme). El uso de tipos de datos algebraicos y la coincidencia de patrones hace que la manipulacin de estructuras de datos complejas convenientes
y expresivos, la presencia de comprobaciones estrictas de
tipos en tiempo de compilacin hace que los programas
sean ms able, mientras que la inferencia de tipos libera
al programador de la necesidad de declarar manualmente
los tipos para el compilador.

Evaluacin estricta frente a la no es- Algunos lenguajes funcionales orientados a la investigatricta


cin, tales como Coq, Agda, Cayenne y Epigram se basan

Los lenguajes funcionales pueden ser clasicados por


el hecho de usar evaluacin estricta(eager) o no estricta(lazy), conceptos que hacen referencia a cmo los argumentos de las funciones son procesados cuando una
expresin est siendo evaluada. La diferencia tcnica est
en la notacin semntica de las expresiones que contienen
clculos fallidos o divergentes. Bajo la evaluacin estricta, la evaluacin de cualquier trmino que contenga un
sub-trmino fallido har que este sea de por s fallido.
Por ejemplo, la expresin:
print length([2+1, 3*2, 1/0, 5-4])
fallar bajo evaluacin estricta por la divisin por cero
en el tercer elemento de la lista. Utilizando evaluacin no
estricta, el tamao de la funcin devolver un valor de 4(
por ejemplo el nmero de elementos de la lista) ya que
evaluar esto no afectar al estar evaluando los que componen la lista. En resumen, la evaluacin estricta evala
por completo los argumentos a menos que sus valores requieran evaluar la propia funcin que se llama a s misma.
La implementacin de la estrategia comn para evaluacin no estricta en los lenguajes funcionales es la de reduccin mediante un grafo. La evaluacin no estricta es

en la teora de tipo intuicionista, que permite a los tipos


a depender de los trminos. Estos tipos se denominan tipos dependientes. Estos sistemas de tipo no tienen un tipo
decidible inferencia y son difciles de entender y programar con plantillas de citacin. Pero tipos dependientes
pueden expresar proposiciones arbitrarias en la lgica de
predicados.
A travs del isomorsmo de Curry-Howard, entonces,
mecanograados a programas en estas lenguas se convierten en una forma de escribir las pruebas matemticas
formales de las que un compilador puede generar cdigo
de certicado. Si bien estas lenguas son principalmente
de inters en la investigacin acadmica (incluyendo las
matemticas formalizadas), han comenzado a ser utilizado en la ingeniera tambin. Compcert es un compilador
para un subconjunto del lenguaje de programacin C que
se escribe en Coq y veric formalmente. Una forma limitada de tipos dependientes llamados tipos de datos algebraicos generalizados (GADTs) puede ser implementado de una manera que ofrece algunos de los benecios
de la programacin dependiente escrito, evitando la mayor parte de su inconveniencia. GADTs estn disponibles
en el Glasgow Haskell Compiler, en OCaml (desde la versin 4.00) y en Scala y se han propuesto como adiciones

a otros idiomas, incluyendo Java y C#.

VENTAJAS DE USAR UN PARADIGMA FUNCIONAL


Proceso de depuracin menos problemtico
Pruebas de unidades ms conables

2.6

La programacin funcional en lenguajes no funcionales

Es posible utilizar un estilo de programacin funcional


en lenguajes que tradicionalmente no se consideran lenguajes funcionales. Por ejemplo, tanto D y Fortran95 se
apoyan explcitamente en funciones puras. Funciones de
primera clase, se han aadido lentamente a los lenguajes
principales. Por ejemplo, a principios de 1994, el apoyo
a lambda, ltro, mapa, y reducir esta en Python. Luego,
durante el desarrollo de Python 3000, Guido van Rossum
pidi la eliminacin de estas caractersticas. Sin embargo, ms tarde cambi de opinin, y slo la reduccin fue
eliminado, a pesar de que sigue siendo accesible a travs
de los mdulos de biblioteca functools estndar. Funciones de primera clase tambin fueron introducidas en PHP
5.3, Visual Basic9, C#3.0 y C++11.

Mayor facilidad para la ejecucin concurrente

3.1 Simulacin de estados


Hay tareas (como por ejemplo, el mantenimiento del saldo de una cuenta bancaria) que a menudo parecen implementadas con estados. La programacin funcional pura
acta sobre esas tareas, tareas de entrada/salida de datos
tales como entrada de datos por parte del usuario y mostrar resultados por pantalla, de una forma diferente.
El lenguaje de programacin funcional Haskell lo implementa usando mnadas, estructura que representa clculos que se describen como una secuencia de pasos, derivada de la teora de categoras.
Las mnadas ofrecen una forma de abstraer ciertos tipos
de patrones computacionales, incluyendo (pero no limitado a) el diseo de operaciones con estados cambiantes
(y otras acciones secundarias tales como entrada/salida
de datos) de una manera imperativa sin perder la pureza. Mientras las mnadas existentes pueden ser fciles de
aplicar en un programa usando las plantillas y ejemplos
adecuados, muchos estudiantes tienen problemas para entenderlo conceptualmente, por ejemplo cuando se les pide
denir nuevas mnadas. (lo que a veces resulta necesario
para ciertos tipos de libreras)[2]

En Java, las clases annimas a veces pueden ser utilizados


para simular clausuras. Sin embargo, las clases annimas
no son siempre los reemplazos completos de las clausuras, ya que tienen capacidades ms limitadas. Por ejemplo, Java 8, incluye expresiones lambda para reemplazar
determinadas clases annimas. Sin embargo, la presencia de excepciones con comprobaciones en este lenguaje
puede desaconsejar el uso de programacin funcional, ya
que puede ser necesario para capturar las excepciones que
se deben controlar para despus volverlas a lanzar ellos
(problema este que sin embargo no se produce en otros Otra forma en la que los lenguajes funcionales pueden silenguajes sobre JVM que no tienen excepciones compro- mular estados es rodeando una estructura de datos que
representa el estado actual como un parmetro para llabadas, como es Scala).
madas a funciones. En cada llamada a funcin, se crea una
Muchos patrones de diseo orientado a objetos se pue- copia de esta estructura de datos que se diferencia con el
den expresar en trminos de programacin funcional por resultado de la funcin. Esto se conoce como estilo de
ejemplo : el patrn de estrategia simplemente dicta el uso paso de estado.
de una funcin de orden superior, y el patrn de visitantes corresponde aproximadamente a un catamorsmo, o Los lenguajes funcionales no puros normalmente includoble tambin conocido como reducir, comprimir, o in- yen mtodos para gestionar el cambio de estado ms diyectar, se reere a una familia de funciones de orden su- rectamente. Clojure por ejemplo, usa una gestin de refeperior que analiza una estructura de datos recursiva y se rencias que pueden ser actualizadas aplicando funciones
recombinan con el uso de una operacin de combinacin. puras al estado actual. Este tipo de enfoque permite el
cambio de estado, promoviendo el uso de funciones puDel mismo modo, la idea de los datos inmutables de la ras como la mejor forma de realizar clculos.
programacin funcional se incluye a menudo en lenguajes de programacin imperativa, por ejemplo, la tupla de Mtodos alternativos como Hoare logic, el cual es un sistema formal con un conjunto de reglas lgicas que sirven
Python, que es una matriz inmutable.
para razonar con rigor acerca de la correccin de programas, y la singularidad han sido desarrollados para realizar
un seguimiento de los efectos secundarios en los progra3 Ventajas de usar un paradigma mas. Algunos lenguajes de investigacin modernos usan
sistemas de efectos para hacer explcita la presencia de
funcional
efectos colaterales.
Entre las ventajas que suelen citarse de usar un paradigma
funcional en la programacin de computadoras, estn las 3.2
siguientes:[1]
Ausencia de efectos colaterales

Cuestiones de eciencia

Los lenguajes de programacin son tpicamente menos


ecientes en el uso de CPU y memoria que los lenguajes

4.1

Estilos de codicacin

imperativos como pueden ser C y Pascal. Esto est relacionado con el hecho de que algunas estructuras de datos
de tamao indenido como los vectores tienen una programacin muy sencilla usando el hardware existente, el
cual es una mquina de Turing bastante evolucionada. Se
puede acceder muy ecientemente a las posiciones del
array con CPUs con un alto grado de perfeccionamiento, haciendo pre bsquedas ecientemente a travs de las
memorias cach o manejado con instrucciones SIMD. Y
no es fcil crear componentes homlogos inmutables de
propsito general con la misma eciencia. Para lenguajes puramente funcionales, el peor caso descendente es
el logartmico en el nmero de celdas de memoria usadas, porque las estructuras de memoria que cambian de
tamao pueden ser representadas por estructuras de datos puramente funcionales con tiempo de acceso logartmico, como por ejemplo un rbol equilibrado. Sin embargo, tales retrasos no son universales. Para programas
que realizan clculos numricos intensivos, los lenguajes
funcionales tales como OCaml y Clean son algo ms lentos que C. Para programas que manejan grandes matrices
y bases de datos multidimensionales, los vectores de los
lenguajes funcionales, como J y K, fueron diseados optimizando su velocidad.
La inalterabilidad de los datos puede llevar en muchos
casos a ejecuciones ecientes permitiendo al compilador
hacer suposiciones que en un lenguaje imperativo resultaran arriesgadas, aumentando las probabilidades para la
expansin en lnea, que es una optimizacin del compilador que sustituye en el lugar de la llamada a una funcin
con el cuerpo del destinatario de la llamada mejorando el
uso del tiempo y espacio en tiempo de ejecucin.
La evaluacin perezosa es una estrategia de evaluacin
que retrasa el clculo de una expresin hasta que su valor sea necesario, tambin puede mejorar la velocidad del
problema, incluso asintticamente, mientras que puede
reducir la velocidad por un factor constante, sin embargo
puede producir prdidas de memoria si se usa de manera
incorrecta. Launchbury 1993 discute de manera terica
los problemas relacionados con las prdidas de memoria de evaluacin perezosa, y OSullivan et al. 2008 da
algunos consejos prcticos para el anlisis y la solucin
de estos problemas. Sin embargo, las implementaciones
ms generales de evaluacin perezosa hace un uso extensivo de cdigo sin referencia y los datos llevan a cabo un
funcionamiento pobre en los procesadores modernos con
un alto grado de paralelismo y cachs multinivel, donde
un fallo de cach puede producir un coste de cientos de
ciclos de reloj.

5
del lenguaje ML). Erlang es otro lenguaje funcional de
programacin concurrente. Mathematica permite la programacin en mltiples estilos, pero promueve la programacin funcional. R tambin es un lenguaje funcional dedicado a la estadstica.[3] Recientemente Microsoft Research est trabajando en el lenguaje F# (Functional#).
Entre otros lenguajes que se podran utilizar para programacin funcional se podran incluir a Perl, pues, aunque
es un lenguaje de propsito muy general, se pueden realizar programas usando exclusivamente funciones denidas por el usuario; as como Python, como lenguaje que
incorpora el paradigma funcional; o Ruby.

4.1 Estilos de codicacin


Mientras que los programas imperativos tienden a proporcionar los pasos a dar por un programa, los funcionales tienden a enfatizar la composicin y disposicin de las
funciones, sin especicar pasos de manera explcita.

5 Uso en la industria
La programacin funcional es ms popular en el mbito
acadmico que en mbitos industriales. Sin embargo se
ha empezado a usar importantes lenguajes de programacin funcionales en sistemas comerciales o industriales.
Un ejemplo de lenguaje de programacin usado en el mbito industrial es el Erlang, el cual fue desarrollado para
poner en prctica el sistema de tolerancia a fallos en las
telecomunicaciones. Importantes empresas como WhatsApp, Facebook, o T-Mobile optaron por Erlang como
lenguaje en alguno de sus desarrollos. Otro ejemplo de
uso de los lenguajes de programacin funcionales en la
industria es el caso del uso del Scheme de Lisp, que fue
usado como base en el desarrollo de aplicaciones para los
primeros ordenadores de la rma Apple Macintosh. De
hecho, hoy en da,est siendo usado para desarrollo de sistemas de simulacin y de control de telescopio. Haskell,
es un ejemplo de lenguaje que cre con propsito de lenguaje de investigacin pero que se ha usado para el desarrollo de sistemas aeroespaciales, programacin web y diseo hardware. Otros lenguajes de programacin funcionales han sido usados en mbitos comerciales y nancieros.

6 Vase tambin
4

Lenguajes funcionales
Lenguaje de programacin

Entre los lenguajes funcionales puros, cabe destacar a


Haskell y Miranda. Los lenguajes funcionales hbridos
ms conocidos son Scala, Lisp, Clojure, Scheme, Ocaml,
SAP y Standard ML (estos dos ltimos, descendientes

Clculo Lambda
Teora de categoras

Referencias

[1] http://ademirar.wordpress.com/2010/08/28/
programacion-funcional-para-el-resto-de-nosotros/
[2] Newbern, J. All About Monads: A comprehensive guide to the theory and practice of monadic programming in
Haskell. Consultado el 14 de febrero de 2008.
[3] Barrapunto | Programacin funcional para el resto de nosotros

REFERENCIAS

Text and image sources, contributors, and licenses

8.1

Text

Programacin funcional Fuente: http://es.wikipedia.org/wiki/Programaci%C3%B3n%20funcional?oldid=78655498 Colaboradores:


Robbot, Ricpelo, Miuler, Ascnder, Rsg, Elwikipedista, Endo, Rutrus, Yurik, Yrithinnd, Orgullobot, RobotQuistnix, Yrbot, Cesarsorm,
BOTijo, YurikBot, GermanX, Eskimbot, Maldoror, Tute, JoaquinFerrero, JAnDbot, TXiKiBoT, HiTe, Sirpuppet, Cinevoro, VolkovBot,
Technopat, Gdelno, Aliamondano, David.Villa, Luis1970, Muro Bot, Edmenb, El Pantera, Mrubio166, YonaBot, SieBot, Danielba894,
Luis ademir, BOTarate, BuenaGente, Nicop, DragonBot, Eduardosalg, Edgarchan, Osado, AVBOT, MastiBot, Diegusjaimes, DumZiBoT,
MelancholieBot, Luckas-bot, Ptbotgourou, Xqbot, Jkbw, FrescoBot, Surfaz, Botarel, Skaponcio, Panderine!, Dinamik-bot, EmausBot, Grillitus, ChuispastonBot, Gusama Romero, Syrusakbary, Elvisor, Flashlack, Leitoxx, Addbot, BOTito, Jacalco y Annimos: 61

8.2

Images

Archivo:Commons-emblem-question_book_orange.svg
Fuente:
http://upload.wikimedia.org/wikipedia/commons/1/1f/
Commons-emblem-question_book_orange.svg Licencia: CC BY-SA 3.0 Colaboradores: <a href='//commons.wikimedia.org/
wiki/File:Commons-emblem-issue.svg'
class='image'><img
alt='Commons-emblem-issue.svg'
src='//upload.wikimedia.org/
wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/25px-Commons-emblem-issue.svg.png'
width='25'
height='25'
srcset='//upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/38px-Commons-emblem-issue.svg.png
1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/50px-Commons-emblem-issue.svg.png 2x'
data-le-width='48' data-le-height='48' /></a> + <a href='//commons.wikimedia.org/wiki/File:Question_book.svg' class='image'><img
alt='Question book.svg' src='//upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/25px-Question_book.svg.png'
width='25' height='20' srcset='//upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/38px-Question_book.svg.
png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/50px-Question_book.svg.png 2x' data-lewidth='252' data-le-height='199' /></a> Artista original: GNOME icon artists, Jorge 2701
Archivo:Subprograma.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/9/98/Subprograma.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Josell7

8.3

Content license

Creative Commons Attribution-Share Alike 3.0

Das könnte Ihnen auch gefallen