Dans le Schéma, ce qui est le point de “série”!?
Quel est le point de l'utilisation de la set!
opérateur d'affectation dans le schéma? Pourquoi ne pas simplement rebind
une variable à une nouvelle valeur à l'aide define
?
> (define x 100)
> (define (value-of-x) x) ;; value-of-x closes over "x"
> x
100
> (value-of-x)
100
> (set! x (+ x 1))
> x
101
> (value-of-x)
101
> (define x (+ x 1))
> x
102
> (value-of-x)
102
>
Vous devez vous connecter pour publier un commentaire.
Si les deux
define
etset!
permettra de redéfinir une valeur dans la même portée, ils font deux choses différentes quand le champ est différent. Voici un exemple:Comme vous pouvez le voir, lorsque nous créons un nouveau domaine lexical (comme lorsque nous
define
une fonction), tous les noms définis dans ce champ masquer les noms qui apparaissent dans le cadre englobant. Cela signifie que lorsque nousdefine
dx
à4
dansfoo
, nous avons vraiment créé une nouvelle valeur pourx
que l'ombre de la vieille valeur. Dansbar
, depuisfoo
n'existe pas dans ce champ d'activité,set!
regarde le cadre englobant de trouver, et de changement, la valeur dex
.Aussi, comme d'autres personnes l'ont dit, vous êtes seulement censés
define
un nom une fois dans un champ. Certaines implémentations vous permettra d'obtenir de loin avec de multiplesdefine
s, et d'autres ne le seront pas. Aussi, vous êtes supposé utiliserset!
sur une variable qui a déjà étédefine
d. Encore une fois, de la rigueur de cette règle est appliquée dépend de la mise en œuvre.Il n'est généralement pas autorisé à
define
une variable plus d'une fois. La plupart des REPLs le permettre pour des raisons de commodité lorsque vous êtes en essayant des choses, mais si vous essayez de le faire dans un Schéma de programme, il vous donnera une erreur.Par exemple, dans mzscheme, le programme
donne l'erreur
En outre,
define
a un sens différent lorsqu'il est utilisé dans d'autres contextes. Le programmea la sortie
C'est parce que
define
s à l'intérieur de certaines constructions sont en fait traités comme desletrec
s.Lorsque vous utilisez lexicale liaisons de vous faire pas
define
eux:Lorsque vous utilisez définir vous créez une nouvelle variable avec la nouvelle valeur, tandis que l'ancien variable existe encore avec l'ancienne valeur; il est juste caché par la nouvelle. Sur la ligne de commande, vous ne voyez pas la différence de jeu!, mais les définir ne sera pas utilisable, par exemple, un compteur de boucle dans un programme impératif.