[zxspectrum] Re: SpecLISP bugfixed !
- From: Stefano Bodrato <stefano_bodrato@xxxxxxxxxxx>
- To: "zxspectrum@xxxxxxxxxxxxx" <zxspectrum@xxxxxxxxxxxxx>
- Date: Thu, 14 May 2015 11:27:27 +0200
Ho capito poco pero' mi fido.
Esempio per il calcolo del denominatore comune
Innanzitutto creiamo la funzione per 2 elementi:
(defun gcd (a b)
(if (zerop b) a
(gcd b (mod a b)))) <--- 'mod' è il resto della divisione
..l'ho presa qui:
http://rosettacode.org/wiki/Greatest_common_divisor#Common_Lisp .. il codice
ricorsivo è poco efficiente ma compatto e immediato, specialmente se lo
confronti con l'equivalente con altri linguaggi.
Ora estendiamola a un numero qualsiasi di elementi:
(defun l_gcd (l) (_l_gcd (first l) (rest l)))
(defun _l_gcd (a l) <--- la funzione appena definita passa qui il primo
elemento delle lista e il resto della lista
(if (null l) a <--- esci con il risultato quando la lista è finita
(_l_gcd (gcd a (first l)) (rest l)))) <-- ricorsione
..al nuovo comando si può passare una lista (variabile l) con questa sintassi:
(l_gcd '(24 8 32 4)) <--- possono essere
E purtroppo non so niente di Google. Per
me, a parte la mia antipatia per Google per altri motivi, quello che
riescono a fare con i loro motori di ricerca e' pura magia...
L'accorpamento di risultati che ho descritto sopra è chiamato "reduce".
La stessa tecnica può essere generalizzata passando tra i parametri il
riferimento alla funzione da applicare.
Se invece applico la stessa fn a una lista per produrre una lista di risultati
con lo stesso numero di elementi, sto facendo una "map".
I linguaggi di questo tipo (LISP, OCCAM..) sono, come già detto poco efficienti
ma abbastanza facili da adattare al calcolo parallelo senza doversene
preoccupare in fase di stesura del programma.
http://it.wikipedia.org/wiki/MapReduce
Other related posts: