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

. 的第一个子句中有太多左括号cond

IE:

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

更新:

你在找这个吗?

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

或者你可以这样做:

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