[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: