Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Design patterns 我可以在Scheme中实现这样的单例设计模式吗?_Design Patterns_Scheme - Fatal编程技术网

Design patterns 我可以在Scheme中实现这样的单例设计模式吗?

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)

我对设计模式知之甚少,今天我学习了Singleton设计模式,所以我试着 在这样的方案中实现它

(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

我将把它简化一点(尽管这不是代码审查),如下所示:

  • 如果是第一次呼叫,则无需使用标志;只需定义一次dispatcher并不断返回对它的引用
  • 无需定义
    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