Справка по форматированию схемы - PullRequest
1 голос
/ 29 марта 2010

Я работал над проектом для школы, который берет функции из файла класса и превращает их в объект / классы. Назначение - все об объектно-ориентированном программировании в схеме.

Моя проблема, однако, в том, что мой код неправильно отформатирован.

Вывод, который он выдает мне всякий раз, когда я даю ему файл для передачи, оборачивает методы класса в списке, делая так, что класс никогда не будет объявлен. Я не могу понять, как сделать так, чтобы скобки обернули список методов для удаления.

Буду очень признателен за любую помощь.

Ниже вывод, файл класса и код.

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

1 Ответ

1 голос
/ 29 марта 2010

У вас слишком много открывающих скобок в первом пункте cond.

IE:

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

Обновлен:

Вы ищете это?

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

Или вы можете сделать:

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