Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme-实现基本OOP,在正确设置new()时遇到问题/this_Oop_Scheme_Racket - Fatal编程技术网

Scheme-实现基本OOP,在正确设置new()时遇到问题/this

Scheme-实现基本OOP,在正确设置new()时遇到问题/this,oop,scheme,racket,Oop,Scheme,Racket,为了学习OOP的范例,我们被要求在scheme中实现我们自己的OOP语言。我首先创建一个对象,然后基于该对象创建一个类。我的下一步将是创建一个我的教授称之为“类工厂”的函数,该函数将根据特定的规范输入创建类。不过,在我开始之前,我面临着一个我认为很简单的问题: 这是我的课,它的作用是: (define pclass (λ input (let ((p-obj (list 'let `((xvar ,(caar input)) (yvar ,(cadar input)) (*this*

为了学习OOP的范例,我们被要求在scheme中实现我们自己的OOP语言。我首先创建一个对象,然后基于该对象创建一个类。我的下一步将是创建一个我的教授称之为“类工厂”的函数,该函数将根据特定的规范输入创建类。不过,在我开始之前,我面临着一个我认为很简单的问题:

这是我的课,它的作用是:

(define pclass
  (λ input
    (let ((p-obj (list 'let `((xvar ,(caar input)) (yvar ,(cadar input)) (*this* null))
                       '(λ input
                          (let ((method (car input)) (args (cdr input)))
                            (cond
                              ((eq? 'display method) (begin
                                                       (display "Coords: x=") (display xvar) 
                                                       (display ", y=") (display yvar) (newline)))
                              ((eq? 'setx method) (set! xvar (cadr input)))
                              ((eq? 'getx method) xvar)
                              ((eq? 'gety method) yvar)
                              ((eq? 'polar method) (let ((radius (sqrt (+ (* xvar xvar) (* yvar yvar))))
                                                         (angle (/ (truncate (* (atan (/ yvar xvar)) 
                                                                            (/ 36000 (* 2 3.1415)))) 100))) 
                                                     (list radius angle)))
                              ((eq? 'dist method) (let ((x2 ((cadr input) 'getx)) 
                                                        (y2 ((cadr input) 'gety))) 
                                                    (sqrt (+ (expt (- x2 xvar) 2) (expt (- y2 yvar) 2)))))
                              ((and (eq? 'set method) (null? *this*)) (set! *this* (cadr input)))
                              (else (begin (display "Error: No method with signature: ") (display method)))
                           ))))))
      (eval p-obj))))
我的问题在于我的新功能。如果我这样运行:

(define new
  (λ input
    ((car input) (cdr input))))
除了分配这个变量的问题之外,它工作得很好。为了分配它,我假设它是这样的:

(define new
  (λ input
    (let ((new-obj ((car input) (cdr input))))
      (new-obj 'set new-obj))))
但此方法不会在运行代码时返回要分配的过程对象:

(define x (new pclass 3 5))
我确信这是一个我不完全理解的小诡计。我应该提到,如果我用第一个新代码定义x,它工作得很好,我可以对x进行方法调用。我只是没有一个指针,当我需要它的时候。我不明白为什么我的类中的let块会返回一个过程对象,但是我的新函数中的let块却没有返回过程对象。

…修复了它

...
((and (eq? 'set method) (null? *this*)) (begin (set! *this* (cadr input)) *this*))
...

为什么要通过引用和
eval
进行间接寻址?我很确定你不需要
eval
。如果您想自动创建访问器,或者使用特殊的pretty语法而不是lambda,那么您可能需要宏,而不是其他。看看有没有灵感。