2013-04-06 5 views
1

Scheme est sur le point de me rendre fou. Dans le code ci-dessous, j'essaie simplement d'analyser la chaîne donnée à repl dans une liste réelle. Au lieu de cela, lorsque j'imprime ce qui est censé être ma liste analysée, tout ce que je reçois est une liste de bonnes parentes! J'utilise le site suivant pour tester mon code: http://repl.it/Schéma Lambda Return Values ​​

J'attends entièrement mon code pour créer une liste comme ce qui suit: (+ 1 2) ou peut-être ce que je ne suis pas comment les types travaillent dans schème. ("+" "1" "2")

Toute aide à la raison pour laquelle ma liste ressemble à ce qui suit est très apprécié: ())))

(define repl 
     (lambda (input) 
      (define symbol_list (Read input)) 
      ;(define value (eval symbol_list)) 
      ;(myprint value) 
      ;(print (length symbol_list)) 
      (print symbol_list) 
    ) 
) 

(define Read 
     (lambda (input) 
      (define symbol (substring input 0 1)) 
      (cond 
       ((string=? ")" symbol) '()) 
       ((or (string=? "(" symbol) (string=? " " symbol)) 
        (Read (substring input 1 (string-length input)))) 
       (else (cons symbol (Read (substring input 1 (string-length input))))) 
     ) 
) 
) 

(repl "(+ 1 2)") 
+0

C'est bizarre, le code comme affiché ici est de retour ' '(« + » « 1 » "2") ', ce que je suppose est la valeur correcte que vous attendez –

+0

Vraiment? Avez-vous utilisé le même interprète que moi? – Daniel

+1

Non, j'ai utilisé Racket. On dirait que le problème est avec l'interprète, pas votre code –

Répondre

2

Le code fonctionne, je testé dans Racket - il pourrait y avoir un problème avec l'interpréteur que vous utilisez pour le tester.

Soit dit en passant, ce que vous voulez faire peut être accompli en utilisant des procédures intégrées, comme ceci:

(read (open-input-string "(+ 1 2)")) 
=> '(+ 1 2) ; a list of symbols/numbers, not strings 
+0

Wow merci, c'est beaucoup plus pratique. Ma seule question est, comment puis-je comparer l'opérateur +? Avant, puisque + était une chaîne, je pourrais utiliser string =? mais existe-t-il un opérateur de comparaison spécial pour comparer les opérateurs littéraux tels que +, -, *, etc.? – Daniel

+1

Utilisez 'symbole =?'. Par exemple: '(symbole =? (Voiture '(+ 1 2))' +) => # t'. Et utilisez '=' pour les nombres. Ou simplement utiliser 'equal? ​​'Qui fonctionne pour tous les types –

+0

Merci encore pour les bonnes réponses. – Daniel