Scheme-实现基本OOP,在正确设置new()时遇到问题/this
为了学习OOP的范例,我们被要求在scheme中实现我们自己的OOP语言。我首先创建一个对象,然后基于该对象创建一个类。我的下一步将是创建一个我的教授称之为“类工厂”的函数,该函数将根据特定的规范输入创建类。不过,在我开始之前,我面临着一个我认为很简单的问题: 这是我的课,它的作用是: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*
(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,那么您可能需要宏,而不是其他。看看有没有灵感。