2010-03-29 4 views
1

J'ai travaillé sur un projet pour l'école qui prend des fonctions à partir d'un fichier de classe et les transforme en objet/classes. L'affectation est tout sur la programmation orientée objet dans le schéma.Aide au formatage de schéma

Mon problème est cependant que mon code ne se formate pas correctement.

La sortie qu'il me donne chaque fois que je lui donne un fichier à passer enveloppe les méthodes de la classe dans une liste, ce qui fait que la classe n'est jamais vraiment déclarée. Je ne peux pas pour la vie de moi comprendre comment obtenir la parenthèse enveloppant la liste de méthode pour enlever.

J'apprécierais vraiment toute aide.

Voici la sortie, le fichier de classe et le code.

(define pointInstance 
    (let ((myx 1) (myy 2)) 
    (lambda msg 
     (cond 
     (((eq? (car msg) getx) myx) 
     ((eq? (car msg) gety) myy) 
     ((eq? (car msg) setx) (set! myx x)) 
     ((eq? (car msg) show) (begin (display "[") (display myx) (display ",") (display myy) (display "]")))))))) 

Si vous regardez juste après le cond, vous verrez comment toutes ces instructions sont contenues dans une liste. Je ne peux pas faire fonctionner correctement à moins qu'ils ne soient pas enveloppés par cette liste de haut niveau.

;;;; PART1 --- A super-easy set of classes. Just models points and lines. Tests all of >the 
;; basics of class behavior without touching on anything particularly complex. 

(class pointInstance (parent:) (constructor_args:) 
    (ivars: (myx 1) (myy 2)) 
    (methods: 
    (getx() myx) 
    (gety() myy) 
    (setx (x) (set! myx x)) 
    (show() (begin (display "[") (display myx) (display ",") (display myy) (display "]"))) 
    )) 



(require (lib "trace.ss")) 

;; Continue reading until you hit the end of the file, all the while 
;; building a list with the contents 
(define load-file 
(lambda (port) 
(let ((rec (read port))) 
(if (eof-object? rec) 
'() 
(cons rec (load-file port)))))) 

;; Open a port based on a file name using open-input-file 
(define (load fname) 
(let ((fport (open-input-file fname))) 
(load-file fport))) 



;(define lis (load "C:\\Users\\Logan\\Desktop\\simpletest.txt")) 
;(define lis (load "C:\\Users\\Logan\\Desktop\\complextest.txt")) 
(define lis (load "C:\\Users\\Logan\\Desktop\\pointinstance.txt")) 

;(display (cdaddr (cdddar lis))) 

(define makeMethodList 
    (lambda (listToMake retList) 
    ;(display listToMake) 
    (cond 
     [(null? listToMake) 
     retList 
     ;(display "The list passed in to parse was null") 
     ] 
     [else 
     (makeMethodList (cdr listToMake) (append retList (list (getMethodLine   listToMake)))) 
     ] 
     ) 
    )) 
;(trace makeMethodList) 

;this works provided you just pass in the function line 
(define getMethodLine 
    (lambda (functionList) 
    `((eq? (car msg) ,(caar functionList)) ,(caddar functionList)))) 

(define load-classes 
    (lambda paramList 
    (cond 
    [(null? paramList) (display "Your parameters are null, man.")] 
[(null? (car paramList))(display "Done creating class definitions.")] 
[(not (null? (car paramList))) 

    (begin 
    (let* ((className (cadaar paramList)) 
      (classInstanceVars (cdaddr (cddaar paramList))) 
      (classMethodList (cdr (cadddr (cddaar paramList)))) 
      (desiredMethodList (makeMethodList classMethodList '())) 

      ) 
     ;(display "Classname: ") 
     ;(display className) 
     ;(newline)(newline) 

     ;(display "Class Instance Vars: ") 
     ;(display classInstanceVars) 
     ;(newline)(newline) 

     ;(display "Class Method List: ") 
     ;(display classMethodList) 
     ;(newline) 

     ;(display "Desired Method List: ") 
     ;(display desiredMethodList)) 
     ;(newline)(newline) 

;---------------------------------------------------- 
;do not delete the below code!` 
     `(define ,className 
     (let ,classInstanceVars 
      (lambda msg 
      ;return the function list here 
      (cond ,(makeMethodList classMethodList '()))) 
      )) 
;--------------------------------------------------- 
))] 
) 
)) 

(load-classes lis) 
;(load-classes lis) 
;(load-classes-helper lis) 
;(load-classes "simpletest.txt") 
;(load-classes "complextest.txt") 

;method list 
;(display (cdr (cadddr (cddaar <class>)))) 

Répondre

1

Vous avez trop de parenthèses d'ouverture dans la 1ère clause du cond.

IE:

(((eq? (car msg) getx) myx) 
^ 

mise à jour:

Vous cherchez cela?

(cond ,@(makeMethodList classMethodList '()) 
     ^^ 

Ou vous pouvez faire:

(cond . ,(makeMethodList classMethodList '()) 
+0

Je sais que, je ne sais pas comment se débarrasser de lui. Avez-vous des suggestions sur la façon de se débarrasser de l'ensemble externe de parenthèses pour les méthodes? – Logan

+1

@Logan: réponse mise à jour. – leppie

+0

@John: s'il vous plaît ne pas étiqueter des questions comme devoirs à moins que le PO déclare que c'est bien des devoirs, ou à moins que vous ayez une boule de cristal. –