03 octombrie 2014

Scheme: o implementare procedurală pentru un obiect Environment

Env : mulțimea tuturor funcțiilor care fac corespondență între un Id și o Valoare

Interfața
Constructori:
empty-env : () -> Env       ( nicio corespondență )
extend-env : Id x Val x Env -> Env      ( adaugă o nouă coresp., a.î. f(Id) = Val )

Observatori:
empty-env? : Env -> Boolean
apply->env : Env x Id -> Val     ( află cât este f(Id) )

Specificații
(empty-env? (empty-env)) = #t
(empty-env? (extend-env id val env)) = #f
(apply->env (empty-env) x) = 'Error
(apply->env (extend-env id val env) x) = val,  dacă x == id
                                                           = (apply->env env x) , altfel

Implementare procedurală
#lang racket

; constructor
(define (empty-env)
  (lambda (obs dummy)
    (cond ((eq? 'empty-env? obs) #t)
          ((eq? 'apply-env obs) 'Error))))

; constructor
(define (extend-env s1 v1 env)
  (lambda (obs s2)
    (cond ((eq? 'empty-env? obs) #f)
          ((eq? 'apply-env obs)
             (cond ((eq? s1 s2) v1)
                   (else (apply-env env s2)))))))

; observers
(define (apply-env env v)
  (env 'apply-env v))

(define (empty-env? env)
  (env 'empty-env? 'dummy))

; some tests
(display (empty-env? (empty-env)))
(display (empty-env? (extend-env 'a 2 (empty-env))))

(display "\n")

(display (apply-env (extend-env 'a 2 (empty-env)) 'a))

Niciun comentariu: