El Blog de Trespams

Blog personal sobre tecnologia, gestió de projectes i coses que se me passen pel cap

El teu llenguatge de programació pot fer això?

Aquesta és la pregunta que fa Joel Spolsky al seu blog. Aquesta pregunta li serveix a Joel per introduïr-nos en la programació funcional.

A més de provocar-nos Joel ens anima a aprendre més coses de la programació funcional, d'aquesta capa d'abstracció addicional que ens permet fer les coses d'una altra manera. En Joel diu que si no fos per aquest tipus d'abstracció Google no seria el que és i aprofita per tonar-se a queixar de les escoles de pensament únic, on sols s'ensenya un llenguatge de programació.

Amb això, com en tantes altres coses, no put estar més d'acord amb Joel. Un sol llenguatge no basta, ens limita a pensar sols en el llenguatge que sabem i no ens permet pensar en termes del problema que volem resoldre. El curs de Ruby al que anàrem fa uns dies anava un poc en aquesta línea: veure com altres llenguatges resolen problemes comuns, veure altres maneres de fer coses ...

En aquests moments el meus dos llenguatges de programació principals són Java i Python. Java ho faig servir per guanyar-me les sopes, Python per divertir-me, per la mateixa raó que escric aquest blog. Així que la contestació a la pregunta de Joel, és sí, Python pot fer això! Si el que diu de Google és cert, i no tenc cap motiu per dubtar-ho, no m'extranya gens que aquesta gent hagi contractat al creador de Python, Guido Van Rossum, ja que des dels començaments la programació funcional ha estat una part important del llenguatge.

#!/usr/bin/python
def alert (s):
print s
print "pas 1"
alert ("I'd like some Spaggetti!")
alert ("I'd like some Chocolate Moose!")

def SwedishCheff(food):
alert ("I'd like some %s !" % food)
print "pas 2"
SwedishCheff("Spaghetti")
("Chocolate Moose")
print "pas 3"

def PutInPot(s):
alert ("pot "+s)

def BoomBoom(s):
alert ("boom "+s)

def Cook (i1, i2, f):
alert ("get the "+ i1) f(i1) f(i2)
Cook ("lobster", "water", PutInPot)
Cook ("chicken", "coconut", BoomBoom)
print "pas 4"

#Aquí del que es tracat de de definr la funció en línea. #Tiram de lambda per això. lamda ens permet definir
# funcions anònimes #sempre que el cos sigui una sola expressió. #El codi javascrip de Joel:
Cook( "lobster", "water", function(x) { alert("pot " + x); } );
Cook( "chicken", "coconut", function(x) { alert("boom " + x); } );
Cook ("lobster", "water", lambda x: alert("pot "+x))
Cook ("chicken", "coconut", lambda x: alert("boom "+x))
print "pas 5 n-----"
# Aquí Joel defineix la funició map. És una construcció pròpia de Python. Així que no necessitam ni fer-la la sintaxi és
map(funcio, llista)
a = [1,2,3]
a= map (lambda x: x*2, a)
map (alert, a)
# Finalment el reduce tampoc no fa falta definir-la ja que també és part del llenguatge. #de fet podriem fer
suma = lambda x : reduce (lambda i,j : i+j, x)
alert ( suma(a)) b=['a1','b2','c3'] alert( suma(b))

blog comments powered by Disqus