(load "interaction-utils.scm") (load "object-system.scm") (load "make-agent.scm") (define (make-place name desc) (let ((list-of-agents null)) (define (self msg) (cond ((eq? msg 'description) (lambda (self) desc)) ((eq? msg 'name) (lambda (self) name)) ((eq? msg 'add-agent!) (lambda (self agent) (cond ((not (assq (ask agent 'name) list-of-agents)) (set! list-of-agents (cons (cons (ask agent 'name) agent) list-of-agents))) (else (display "Error: agent is already in the room"))))) ((eq? msg 'get-agent) (lambda (self agent) assq (ask agent 'name) list-of-agents)) ((eq? msg 'delete-agent) (lambda (self agent) (cond ((assq (ask agent 'name) list-of-agents) (retire-agent self agent list-of-agents '())) (else (display "Error agent not in room"))))) ((eq? msg 'agents) (lambda (self) list-of-agents)))) (define (retire-agent self agent list-of-agents new-list-of-agents) (cond ((null? list-of-agents) (set! list-of-agents new-list-of-agents) new-list-of-agents) ((eq? (car (car list-of-agents)) (ask agent 'name)) (retire-agent self agent (cdr list-of-agents) new-list-of-agents)) (else (retire-agent self agent (cdr list-of-agents) (cons (car list-of-agents) new-list-of-agents))))) self))