11
votes

Erreur avec définir dans la raquette

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 #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>

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 > xxx pré>

Bien que nous définissons sous-code code> semble assez non pertinent. Si je le remplace par p> xxx pré>

i reçoit la même erreur. Drracket dit que 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 >

Si cela aide, ce 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)


0 commentaires

4 Réponses :


14
votes

Les définitions sont autorisées dans un contexte «corps», comme dans 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>

Par exemple: P>

(if test
    (let ()
      (define foo 'foo)
      (list foo foo))
    alternate)


1 commentaires

Merci! Fini juste avec laisser , mais il est utile de savoir que commence peut se transformer implicitement comme ça. Mon intuition était que (début foo) serait juste sténographique pour ((lambda () foo)) , mais je suppose que c'est plus compliqué que cela.



8
votes

Comme Gozoner expliqua, vous ne pouvez pas utiliser définir dans un contexte d'expression.

Que pourriez-vous faire à la place?

Utiliser laisse : xxx

ou fonctionnerait avec un "vide" let et définir : xxx

mais c'est un peu stupide.

ou utilisez COND et définir : xxx

cette dernière voie - en utilisant ond et définir - est le plus proche de ce que Guide de style de raquette actuel recommande.


3 commentaires

COND NE établit pas de contexte d'expression (selon mon test dans R6RS et SPECUD R7RS).


Dans Racket (Cond [#t (définir x 1) x]) est valide et renvoie 1 .


Eh bien, nous savons tous ... raquette n'est pas schéma ... :-) dans ikarus (Cond (#t (définir foo 'foo) (liste FOO FOO))) -> "Erreur:" Erreur: Une définition a été trouvée lorsqu'une expression était attendue. "



4
votes

Voici plus de détails, de la Raquette Docs.

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.

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.

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>


0 commentaires

0
votes

ou vous pouvez envelopper les expressions dans (commencer) par exemple (commencer (Définir x 10) (Définir y 100) (Définir z 1000))


0 commentaires