Skip to content

Instantly share code, notes, and snippets.

@chansey97
Created August 9, 2020 20:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chansey97/aecffabb2885c83fa040ba677bde5de4 to your computer and use it in GitHub Desktop.
Save chansey97/aecffabb2885c83fa040ba677bde5de4 to your computer and use it in GitHub Desktop.
#lang racket
(define the-key 'the-key)
(define the-spell-book 'the-spell-book)
(define person%
(class object%
(init-field items h)
(super-new)
(define/public (has-item item)
(member item items))
(define/public (height)
h)
))
(define door<%> (interface () can-open can-pass))
(define door-mixin
(mixin () (door<%>)
(super-new)
(define/public (can-open p)
(println "door% can-open")
#t)
(define/public (can-pass p)
(println "door% can-pass")
#t)
))
(define secure-door<%> (interface (door<%>) needed-item))
(define secure-mixin
(mixin (door<%>) (secure-door<%>)
(super-new)
(define/public (needed-item) ;; error??
(println "secure-mixin needed-item")
#f)
(define/override (can-open p)
(println "secure-mixin can-open")
(define item (needed-item))
(cond
((not (send p has-item item)) (printf "You don't have the Key ~v\n" item)
#f)
(else (printf "Using Key... ~v\n" item)
(super can-open p))))
))
(define locked-needed-mixin
(mixin (secure-door<%>) (secure-door<%>)
(super-new)
(define/override (needed-item)
(println "locked-needed-mixin neededItem")
the-key)
))
(define magic-needed-mixin
(mixin (secure-door<%>) (secure-door<%>)
(super-new)
(define/override (needed-item)
(println "magic-needed-mixin neededItem")
the-spell-book)
))
(define door%
(door-mixin object%))
(define locked-mixin (compose locked-needed-mixin secure-mixin))
(define magic-mixin (compose magic-needed-mixin secure-mixin))
(define locked-magic-mixin (compose locked-mixin magic-mixin))
(define locked-magic-door% (locked-magic-mixin door%))
(define door (new locked-magic-door%))
(send door can-open (new person% [items (list the-key the-spell-book)] [h 0.5]))
; class*: superclass already contains method
; superclass: #<class:...agic-door-failed.rkt:62:2>
; method name: needed-item
; class name: ...agic-door-failed.rkt:36:2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment