Design patterns 我可以在Scheme中实现这样的单例设计模式吗?
我对设计模式知之甚少,今天我学习了Singleton设计模式,所以我试着 在这样的方案中实现它Design patterns 我可以在Scheme中实现这样的单例设计模式吗?,design-patterns,scheme,Design Patterns,Scheme,我对设计模式知之甚少,今天我学习了Singleton设计模式,所以我试着 在这样的方案中实现它 (define nil '()) (define Singleton (let ((instance nil)) (lambda () (if (null? instance) (let ((a 0)) (define (dispatch msg) (cond ((eq? msg 'get)
(define nil '())
(define Singleton
(let ((instance nil))
(lambda ()
(if (null? instance)
(let ((a 0))
(define (dispatch msg)
(cond ((eq? msg 'get)
(lambda () a))
((eq? msg 'set)
(lambda (v)
(begin (set! a v)
'ok)))))
(set! instance dispatch)))
instance)))
(define a (Singleton))
(define b (Singleton))
(eq? a b);;#t
((a 'set) 3)
((b 'get));;3
我对该设计模式的理解和实现是否正确?您的实现是正确的,因为
(eq?a b)
是\t
我将把它简化一点(尽管这不是代码审查),如下所示:
nil
,'()
即可(a'set 3)
而不是((a'set)3)
case
而不是cond
我不是DP专家,但对我来说这似乎是对的。您可以返回dispatch,在定义a和b时不使用parens。@Rptx Yes true。但我想这并不是真正实现单例模式。
(define Singleton
(let ((a 0)) ; instance variables
(define (get) a)
(define (set v) (set! a v) 'ok)
(define (dispatch msg . args) ; dispatcher procedure
(case msg
((get) (apply get args))
((set) (apply set args))
(else (error "unknown message"))))
(lambda () dispatch))) ; return dispatch procedure
(define a (Singleton))
(define b (Singleton))
(eq? a b) ;; #t
(a 'set 3) ;; 'ok
(b 'get) ;; 3