1

クラスファイルから関数を取得してオブジェクト/クラスに変換する学校向けのプロジェクトに取り組んでいます。割り当ては、スキームのオブジェクト指向プログラミングに関するものです。

しかし、私の問題は、私のコードが正しくフォーマットされていないことです。

渡すファイルを渡すたびに出力される出力は、クラスのメソッドをリストでラップし、クラスが実際に宣言されないようにします。私は一生、メソッドリストを囲む括弧を削除する方法を理解できません。

助けていただければ幸いです。

以下は、出力、クラス ファイル、およびコードです。

(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 "]"))))))))

cond の直後を見ると、これらすべての eq ステートメントがどのようにリストに含まれているかがわかります。トップレベルのリストでラップされていない限り、これを正しく機能させることはできません。

;;;; 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>))))
4

1 に答える 1

1

の第 1 句に開き括弧が多すぎますcond

いいえ:

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

更新しました:

これを探していますか?

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

または、次のことができます。

(cond . ,(makeMethodList classMethodList  '())
于 2010-03-29T05:15:12.470 に答える