2011-07-19 4 views
3

J'ai essayé de trouver une solution dans Google, j'ai essayé d'utiliser ctrl-c puis: unComment sortir d'une boucle infinie dans emacs lisp? (environnement: emacs)

Mais cela ne fonctionne pas ici.

Mon code est comme:

(defun game-repl() 
    (loop (print (eval (read))))) 

alors je cours

(game-repl()) 
look() 
+0

Souvent, les boucles de jeu auront une variable 'isDone' ou' isNotDone', et effectueront une boucle en fonction de cela, par ex. '(alors que c'est non-fait ...)'. Placez simplement 'is-not-done' à false, et la boucle se rompra à l'itération suivante. –

+0

Merci @Merlyn, Mais ma question est de savoir comment casser cette boucle vers mon environnement de programmation Lisp, c'est Emacs. –

+1

D'où pourquoi un commentaire et pas une réponse :) Mais cela résoudrait le problème ... Il suffit de mettre 'is-not-done' dans votre REPL. Mais oui je peux voir que vous cherchez une commande d'éditeur, pas une solution programmable. –

Répondre

8
(loop (setq x (read)) 
     (if (eq x 'exit) 
     (return) 
     (print (eval x)))) 
+0

merci. Je ferais mieux de suivre cette routine. –

1

[Référence http://www.psg.com/~dlamkins/sl/chapter05.html]

La plupart du temps vous écrivez un formulaire LOOP, vous aimeriez avoir un moyen de sortir. Heureusement, une forme de retour n'importe où à l'intérieur provoquera le contrôle de quitter la boucle; toute valeur spécifiée devient la valeur de la forme LOOP:

? (loop 
    (print "Here I am.") 
    (return 17) 
    (print "I never got here.")) 
"Here I am." 
17 

RETOUR est normalement utilisé sous une forme conditionnelle, comme ceci:

? (let ((n 0)) 
    (loop 
     (when (> n 10) (return)) 
    (print n) (print (* n n)) 
    (incf n))) 

0 0 
1 1 
2 4 
3 9 
4 16 
5 25 
6 36 
7 49 
8 64 
9 81 
10 100 
NIL 
? 
+0

informatif. Merci. –

6

modes Emacs envoient souvent un signal d'interruption au programme inférieur seulement lorsque vous appuyez deux fois de suite sur Ctrl-C (la séquence de touches que vous recherchez est C-c C-c). En particulier, ceci est vrai pour SLIME. C'est parce que C-c est un prefix key qui est généralement combiné avec d'autres touches pour accéder à un tas de fonctionnalités spécifiques au mode.

-1

Cette réponse Stack Exchange est le premier coup sur google pour « briser une boue en boucle sans fin »

C-c C-b 

Ce qui manque, est que les différents lisps gérer cette rupture différemment. J'ai trouvé cette réponse parce que GNU Clisp n'intercepte pas le C-c C-b de SLIME. Il ne fait pas non plus ce que fait SBCL qui intercepte à la fois C-c C-b et C-c C-c.

+0

Je viens de confirmer que c'est spécifique à Clisp sous Windows. – Evan