Je viens de découvrir la raquette il y a quelques jours, et j'essaie d'être plus à l'aise avec elle en écrivant un petit script qui génère des images pour représenter le code source utilisant Le problème est que je reçois à plusieurs reprises ce qui semble être des erreurs très mystérieuses. Je suis sûr que je fais juste une erreur de débutant stupide, étant nouvelle dans la langue, mais je ne peux vraiment pas sembler trouver la source de la plainte. P> Voici le code fautif: P > Bien que nous définissons i reçoit la même erreur. Drracket dit que Si cela aide, ce #lang diaparow code>. Je sais que lors de la programmation dans un paradigme fonctionnel, il est une bonne pratique de créer presque toutes vos variables avec
laisser code>, mais je trouve qu'il introduit trop de niveaux d'imbrication et que la raquette a laissé une API surcliquée qui nécessite superflu parenthèses. Je suis sûr que ceci est d'éliminer l'ambiguïté lorsque vous utilisez
laisser code> de manière plus puissante, mais à mes fins, c'est juste une gêne. Par conséquent, je crée toutes mes variables avec
définir code> et écrire des blocs avec
commencent code> si j'en ai besoin (tel que dans le corps d'un
si code> si > Déclaration). P>
sous-code code> semble assez non pertinent. Si je le remplace par p>
définir code> est utilisé dans un contexte d'expression. Je comprends ce que cette erreur méchant normalement - c'est-à-dire qu'elle augmenterait lorsque vous écrivez du code comme
(Imprimer (Définir x 10)) code>, mais je ne vois pas ce qui le déclencherait ici. P >
définit code> est au début d'un bloc code> BLOCK code>, à l'intérieur d'un
si code> instruction p>
(begin
(define x 10)
x)
4 Réponses :
Les définitions sont autorisées dans un contexte «corps», comme dans Par exemple: P> lambda code> et
laisser code> entre autres. Les clauses conséquentes et alternatives de
si code> ne sont pas des contextes corporels; Ce sont des contextes d'expression et donc des définitions ne sont pas autorisés.
commencements code> est spécial -
commencer code> dans un contexte corporel permet aux définitions, mais
commencent code> Un contexte d'expression interdit les définitions. Votre cas tombe au plus tard. P>
(if test
(let ()
(define foo 'foo)
(list foo foo))
alternate)
Merci! Fini juste avec laisser code>, mais il est utile de savoir que
commence code> peut se transformer implicitement comme ça. Mon intuition était que
(début foo) code> serait juste sténographique pour
((lambda () foo)) code>, mais je suppose que c'est plus compliqué que cela.
Comme Gozoner expliqua, vous ne pouvez pas utiliser Que pourriez-vous faire à la place? p> Utiliser ou fonctionnerait avec un "vide" mais c'est un peu stupide. p> ou utilisez cette dernière voie - en utilisant définir code> dans un contexte d'expression.
laisse code> : p>
let code> et em>
définir code>: p>
COND code> et
définir code>: p>
ond code> et
définir code> - est le plus proche de ce que Guide de style de raquette actuel recommande. P> p>
COND CODE> NE établit pas de contexte d'expression (selon mon test dans R6RS et SPECUD R7RS).
Dans Racket (Cond [#t (définir x 1) x]) code> est valide et renvoie
1 code>.
Eh bien, nous savons tous ... raquette n'est pas schéma ... :-) dans ikarus (Cond (#t (définir foo 'foo) (liste FOO FOO))) Code> -> "Erreur:" Erreur: Une définition a été trouvée lorsqu'une expression était attendue. "
Voici plus de détails, de la Raquette Docs. P>
the différents contextes sont nécessaires car les macros doivent se développer différemment, selon lesquelles des formes de langue sont autorisées. P>
Comme d'autres l'ont dit, les définitions ne sont pas autorisées dans les contextes d'expression ("expr ..." dans les docs), mais sont ok dans d'autres contextes. P>
dans d'autres entrées DOC, "corps ..." indique un contexte de définition interne ( guide , référence ), par exemple dans les corps de Lambda et" formulaire ... "indique tous les contextes de non-expression, comme dans les docs pour commencer. < / p>
ou vous pouvez envelopper les expressions dans (commencer) par exemple (commencer (Définir x 10) (Définir y 100) (Définir z 1000)) p>