Tout d'abord for
dans #lang racket
est purement pour les effets secondaires. Habituellement, vous voudriez que les autres variantes comme for/map
et for/fold
finissent par produire une valeur. La raquette est une descendante de Scheme et toute la boucle est juste du sucre syntaxique pour une fonction récursive appliquée. A titre d'exemple la boucle do
:
(do ((vec (make-vector 5))
(i 0 (+ i 1)))
((= i 5) vec)
(vector-set! vec i i))
; ==> #(0 1 2 3 4)
En réalité, la langue n'a pas do
comme primitive. Au lieu de cela la mise en œuvre ont généralement une macro qui fait dans ce (ou quelque chose de similaire): il suffit de sucre
(let loop ((vec (make-vector 5)) (i 0))
(if (= i 5)
vec
(begin
(vector-set! vec i i)
(loop vec (+ i 1)))))
Ceci est bien sûr pour cela:
((letrec ((loop (lambda (vec i)
(if (= i 5)
vec
(begin
(vector-set! vec i i)
(loop vec (+ i 1)))))))
loop)
(make-vector 5) (i 0))
Et bien sûr letrec
est aussi le sucre .. Cela revient à utiliser lambda
à un certain niveau.
Lorsque j'utilise ce code, j'obtiens un tableau comme: "define: attendu une seule expression pour le corps de la fonction, mais trouvé 1 partie supplémentaire" – Deesha
Derik si vous utilisez un langage d'enseignement, vous devez spécifier lequel. – soegaard
Enveloppe la définition interne en local. Rechercher comment utiliser local. – soegaard