Dans le chapitre 9 de la Petite Schemer, l'auteur présente les deux fonctions suivantesTraduire la fonction Q et P du Petit Schemer en Common Lisp?
(define Q
(lambda (str n)
(cond
((zero? (remainder (first$ str) n))
(Q (second$ str) n))
(t (build (first$ str)
(lambda ()
(Q (second$ str) n)))))))
(define P
(lambda (str)
(build (first$ str)(lambda() (P (Q str (first$ str)))))))
et propose qu'ils sont évalués à l'exécution suivante:
(frontier (P (second$ (second$ int))) 10)
Comment voulez-vous écrire le P et Q fonctionne en Common Lisp?
(j'ai traduit moi-même Y-Combinator - mais je trouve ce un défi)
--helper Functions--
(define frontier
(lambda (str n)
(cond
((zero? n) (quote()))
(t (cons (first$ str) (frontier (second$ str) (sub1 n)))))))
(define str-maker
(lambda (next n)
(build n (lambda() (str-maker next (next n))))))
(define int (str-maker add1 0))
(define second$
(lambda (str)
((second str))))
(define first$ first)
(define build
(lambda (a1 a2)
(cond
(t (cons a1
(cons a2 (quote())))))))))
(define first
(lambda (p)
(cond
(t (car p)))))
(define second
(lambda (p)
(cond
(t (car (cdr p))))))
(define add1
(lambda (n)
(+ 1 n)))
(define remainder
(lambda (n m)
(cond
(t (- n (* m (/ n m))))))
(Avertissement - Ce n'est pas une question de devoirs - il est pour ma compréhension et l'apprentissage)
Pourquoi "Q" et "frontière" sont-ils exactement identiques? Quelles sont les définitions de 'second $' et 'first $' pour (ils font la même chose que 'second' et' first')? – Svante
Merci - corrigé – hawkeye