----- 21/11/18 ----- > E' possibile avere qualche chiarimento o suggerimento riguardo > al cifrario di Cesare e facendo riferimento all'alfabeto latino? > Perche' la seguente procedura non funziona? (define ; alfabeto = lista lettere dell'afabeto latino alfabeto (list #\A #\B #\C #\D #\E #\F #\G #\H #\I #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\V #\X) ) (define cipher-latin (lambda (num cont) ; num: int (numero che varia le lettere), ; cont: int (contatore parte da zero per riferimento lista) (lambda (letter) (if (< (+ cont num) (length alfabeto)) (if (char=? (list-ref alfabeto cont) letter) ; confronta carattere ; con lettera dell'alfabeto latino (list-ref alfabeto (+ cont num)) ; se sono uguali ; restituisce la lettera cifrata (cipher-latin num (+ cont 1)) ; altrimenti si passa alla lettera ; successiva dell'alfabeto latino ) (list-ref alfabeto (- (+ cont num) 19)) ) ))) (define regola (cipher-latin 2 0)) ; per fare un test ----- Ci sono due problemi nel programma: 1. Le due espressioni "if" vanno scambiate: quella esterna deve essere spostata all'interno perche' solo quando viene individuata la lettera nel messaggio "in chiaro" ha senso verificare se la rotazione dei caratteri porta a un rientro da sinistra (e in tal caso occorre sottrarre l'intera lunghezza dell'alfabeto, non 19). 2. L'espressione  (cipher-latin num (+ cont 1))  restituisce una procedura, che deve essere applicata al valore di letter affinche' la lambda-espressione interna restituisca un carattere. Inoltre, in base a quanto richiesto, la procedura da definire deve avere un solo parametro: la rotazione. Ma questo non e' un problema importante perche' si rimedia semplicemente definendo una nuova procedura che richiama quella codificata sopra. ----- * -----