Advertisement
Guest User

interpretador_objetos_planos

a guest
Apr 7th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 22.21 KB | None | 0 0
  1. #lang eopl
  2.  
  3. ;^;; 5-3.scm: basis for OOP interps
  4.  
  5. (let ((time-stamp "Time-stamp: <2001-05-10 16:18:14 dfried>"))
  6.   (eopl:printf "5-3.scm - basis for OOP interps ~a~%"
  7.     (substring time-stamp 13 29)))
  8.  
  9. ;;;;;;;;;;;;;;;; top level and tests ;;;;;;;;;;;;;;;;
  10.  
  11. ;(define run
  12. ;  (lambda (string)
  13. ;    (eval-program (scan&parse string))))
  14. ;
  15. ;(define functional-groups '(lang3-5 lang3-6 lang3-7))
  16. ;
  17. ;(define oop-groups '(oop))
  18. ;
  19. ;(define run-all
  20. ;  (lambda ()
  21. ;    (run-experiment run use-execution-outcome
  22. ;      (append functional-groups oop-groups) all-tests)))
  23. ;
  24. ;(define run-functional
  25. ;  (lambda ()
  26. ;    (run-experiment run use-execution-outcome
  27. ;      functional-groups all-tests)))
  28. ;
  29. ;(define run-oop
  30. ;  (lambda ()
  31. ;    (run-experiment run use-execution-outcome
  32. ;      oop-groups all-tests)))
  33. ;
  34. ;(define run-one
  35. ;  (lambda (test-name)
  36. ;    (run-test run test-name)))
  37. ;
  38. ;;; needed for testing
  39. ;(define equal-external-reps? equal?)
  40.  
  41. ;^;;;;;;;;;;;;;;; grammatical specification ;;;;;;;;;;;;;;;;
  42.  
  43. (define the-lexical-spec
  44.   '((whitespace (whitespace) skip)
  45.     (comment ("%" (arbno (not #\newline))) skip)
  46.     (identifier
  47.       (letter (arbno (or letter digit "_" "-" "?")))
  48.       symbol)
  49.     (number (digit (arbno digit)) number)))
  50.  
  51. (define the-grammar
  52.   '((program ((arbno class-decl) expression) a-program)
  53.  
  54.     (expression (number) lit-exp)
  55.     (expression (identifier) var-exp)  
  56.     (expression
  57.       (primitive "(" (separated-list expression ",") ")")
  58.       primapp-exp)
  59.     (expression
  60.       ("if" expression "then" expression "else" expression)
  61.       if-exp)
  62.    (expression
  63.       ("let" (arbno  identifier "=" expression) "in" expression)
  64.       let-exp)
  65.     (expression
  66.       ("proc" "(" (separated-list identifier ",") ")" expression)
  67.       proc-exp)
  68.     (expression
  69.       ("(" expression (arbno expression) ")")
  70.       app-exp)
  71.     (expression                        
  72.       ("letrec"
  73.         (arbno identifier "(" (separated-list identifier ",") ")"
  74.           "=" expression)
  75.         "in" expression)
  76.       letrec-exp)
  77.     (expression ("set" identifier "=" expression) varassign-exp)
  78.     (expression
  79.       ("begin" expression (arbno ";" expression) "end")
  80.       begin-exp)
  81.  
  82.     (primitive ("+")     add-prim)
  83.     (primitive ("-")     subtract-prim)
  84.     (primitive ("*")     mult-prim)
  85.     (primitive ("add1")  incr-prim)
  86.     (primitive ("sub1")  decr-prim)
  87.     (primitive ("zero?") zero-test-prim)
  88.     (primitive ("list") list-prim)
  89.     (primitive ("cons") cons-prim)
  90.     (primitive ("nil")  nil-prim)
  91.     (primitive ("car")  car-prim)
  92.     (primitive ("cdr")  cdr-prim)
  93.     (primitive ("null?") null?-prim)
  94.  
  95. ;^;;;;;;;;;;;;;;; new productions for oop ;;;;;;;;;;;;;;;;
  96.  
  97.     (class-decl                        
  98.       ("class" identifier
  99.         "extends" identifier                  
  100.          (arbno "field" identifier)
  101.          (arbno method-decl)
  102.          )
  103.       a-class-decl)
  104.  
  105.     (method-decl
  106.       ("method" identifier
  107.         "("  (separated-list identifier ",") ")" ; method ids
  108.         expression
  109.         )
  110.       a-method-decl)
  111.  
  112.     (expression
  113.       ("new" identifier "(" (separated-list expression ",") ")")
  114.       new-object-exp)
  115.  
  116.     (expression
  117.       ("send" expression identifier
  118.         "("  (separated-list expression ",") ")")
  119.       method-app-exp)
  120.  
  121.     (expression                                
  122.       ("super" identifier    "("  (separated-list expression ",") ")")
  123.       super-call-exp)
  124.  
  125. ;^;;;;;;;;;;;;;;; end new productions for oop ;;;;;;;;;;;;;;;;
  126.  
  127.     ))
  128.  
  129. (sllgen:make-define-datatypes the-lexical-spec the-grammar)
  130.  
  131. (define list-the-datatypes
  132.   (lambda () (sllgen:list-define-datatypes the-lexical-spec the-grammar)))
  133.  
  134. (define scan&parse
  135.   (sllgen:make-string-parser the-lexical-spec the-grammar))
  136.  
  137. (define just-scan
  138.   (sllgen:make-string-scanner the-lexical-spec the-grammar))
  139.  
  140. ;^;;;;;;;;;;;;;;; the interpreter ;;;;;;;;;;;;;;;;
  141.  
  142. (define eval-program
  143.   (lambda (pgm)
  144.     (cases program pgm
  145.       (a-program (c-decls exp)
  146.         (elaborate-class-decls! c-decls) ;\new1
  147.         (eval-expression exp (empty-env))))))
  148.  
  149. (define eval-expression
  150.   (lambda (exp env)
  151.     (cases expression exp
  152.       (lit-exp (datum) datum)
  153.       (var-exp (id) (apply-env env id))
  154.       (primapp-exp (prim rands)
  155.         (let ((args (eval-rands rands env)))
  156.           (apply-primitive prim args)))
  157.       (if-exp (test-exp true-exp false-exp)
  158.         (if (true-value? (eval-expression test-exp env))
  159.           (eval-expression true-exp env)
  160.           (eval-expression false-exp env)))
  161.       (let-exp (ids rands body)
  162.         (let ((args (eval-rands rands env)))
  163.           (eval-expression body (extend-env ids args env))))
  164.       (proc-exp (ids body)
  165.         (closure ids body env))
  166.       (app-exp (rator rands)
  167.         (let ((proc (eval-expression rator env))
  168.               (args (eval-rands      rands env)))
  169.           (if (procval? proc)
  170.             (apply-procval proc args)
  171.             (eopl:error 'eval-expression
  172.               "Attempt to apply non-procedure ~s" proc))))
  173.       (letrec-exp (proc-names idss bodies letrec-body)
  174.         (eval-expression letrec-body
  175.           (extend-env-recursively proc-names idss bodies env)))
  176.       (varassign-exp (id rhs-exp)
  177.         (setref!
  178.           (apply-env-ref env id)
  179.           (eval-expression rhs-exp env))
  180.         1)
  181. ;&
  182.       (begin-exp (exp1 exps)
  183.         (let loop ((acc (eval-expression exp1 env))
  184.                    (exps exps))
  185.           (if (null? exps) acc
  186.             (loop (eval-expression (car exps) env) (cdr exps)))))
  187. ;^;;;;;;;;;;;;;;; begin new cases for chap 5 ;;;;;;;;;;;;;;;;
  188.       (new-object-exp (class-name rands)
  189.         (let ((args (eval-rands rands env))
  190.               (obj (new-object class-name)))
  191.           (find-method-and-apply
  192.             'initialize class-name obj args)
  193.           obj))
  194.       (method-app-exp (obj-exp method-name rands)
  195.         (let ((args (eval-rands rands env))
  196.               (obj (eval-expression obj-exp env)))
  197.           (find-method-and-apply
  198.             method-name (object->class-name obj) obj args)))
  199.       (super-call-exp (method-name rands)
  200.         (let ((args (eval-rands rands env))
  201.               (obj (apply-env env 'self)))
  202.           (find-method-and-apply
  203.             method-name (apply-env env '%super) obj args)))
  204. ;^;;;;;;;;;;;;;;; end new cases for chap 5 ;;;;;;;;;;;;;;;;
  205.       )))
  206.      
  207.  
  208. (define eval-rands
  209.   (lambda (exps env)
  210.     (map
  211.       (lambda (exp) (eval-expression exp env))
  212.       exps)))
  213.  
  214. (define apply-primitive
  215.   (lambda (prim args)
  216.     (cases primitive prim
  217.       (add-prim  () (+ (car args) (cadr args)))
  218.       (subtract-prim () (- (car args) (cadr args)))
  219.       (mult-prim  () (* (car args) (cadr args)))
  220.       (incr-prim  () (+ (car args) 1))
  221.       (decr-prim  () (- (car args) 1))
  222.       (zero-test-prim () (if (zero? (car args)) 1 0))
  223.       (list-prim () args)               ;already a list
  224.       (nil-prim () '())
  225.       (car-prim () (car (car args)))
  226.       (cdr-prim () (cdr (car args)))
  227.       (cons-prim () (cons (car args) (cadr args)))
  228.       (null?-prim () (if (null? (car args)) 1 0))
  229.       )))
  230.  
  231. (define init-env
  232.   (lambda ()
  233.     (extend-env
  234.       '(i v x)
  235.       '(1 5 10)
  236.       (empty-env))))
  237.  
  238. ;^;;;;;;;;;;;;;;; booleans ;;;;;;;;;;;;;;;;
  239.  
  240. (define true-value?
  241.   (lambda (x)
  242.     (not (zero? x))))
  243.  
  244.  
  245. ;;;;;;;;;;;;;;;; declarations ;;;;;;;;;;;;;;;;
  246.  
  247.  
  248. (define class-decl->class-name
  249.   (lambda (c-decl)
  250.     (cases class-decl c-decl
  251.       (a-class-decl (class-name super-name field-ids m-decls)
  252.         class-name))))
  253.  
  254. (define class-decl->super-name
  255.   (lambda (c-decl)
  256.     (cases class-decl c-decl
  257.       (a-class-decl (class-name super-name field-ids m-decls)
  258.         super-name))))
  259.  
  260. (define class-decl->field-ids
  261.   (lambda (c-decl)
  262.     (cases class-decl c-decl
  263.       (a-class-decl (class-name super-name field-ids m-decls)
  264.         field-ids))))
  265.  
  266. (define class-decl->method-decls
  267.   (lambda (c-decl)
  268.     (cases class-decl c-decl
  269.       (a-class-decl (class-name super-name field-ids m-decls)
  270.         m-decls))))
  271.  
  272. (define method-decl->method-name
  273.   (lambda (md)
  274.     (cases method-decl md
  275.       (a-method-decl (method-name ids body) method-name))))
  276.  
  277. (define method-decl->ids
  278.   (lambda (md)
  279.     (cases method-decl md
  280.       (a-method-decl (method-name ids body) ids))))
  281.  
  282. (define method-decl->body
  283.   (lambda (md)
  284.     (cases method-decl md
  285.       (a-method-decl (method-name ids body) body))))
  286.  
  287. (define method-decls->method-names
  288.   (lambda (mds)
  289.     (map method-decl->method-name mds)))
  290.        
  291. ;^;;;;;;;;;;;;;;; procedures ;;;;;;;;;;;;;;;;
  292.  
  293. (define-datatype procval procval?
  294.   (closure
  295.     (ids (list-of symbol?))
  296.     (body expression?)
  297.     (env environment?)))
  298.  
  299. (define apply-procval
  300.   (lambda (proc args)
  301.     (cases procval proc
  302.       (closure (ids body env)
  303.         (eval-expression body (extend-env ids args env))))))
  304.                
  305. ;^;;;;;;;;;;;;;;; references ;;;;;;;;;;;;;;;;
  306.  
  307. (define-datatype reference reference?
  308.   (a-ref
  309.     (position integer?)
  310.     (vec vector?)))
  311.  
  312. (define deref
  313.   (lambda (ref)
  314.     (cases reference ref
  315.       (a-ref (pos vec)
  316.              (vector-ref vec pos)))))
  317.  
  318. (define setref!
  319.   (lambda (ref val)
  320.     (cases reference ref
  321.       (a-ref (pos vec)
  322.         (vector-set! vec pos val)))
  323.     1))
  324.  
  325. ;^;;;;;;;;;;;;;;; environments ;;;;;;;;;;;;;;;;
  326.  
  327. (define-datatype environment environment?
  328.   (empty-env-record)
  329.   (extended-env-record
  330.     (syms (list-of symbol?))
  331.     (vec vector?)              ; can use this for anything.
  332.     (env environment?))
  333.   )
  334.  
  335. (define empty-env
  336.   (lambda ()
  337.     (empty-env-record)))
  338.  
  339. (define extend-env
  340.   (lambda (syms vals env)
  341.     (extended-env-record syms (list->vector vals) env)))
  342.  
  343. (define apply-env-ref
  344.   (lambda (env sym)
  345.     (cases environment env
  346.       (empty-env-record ()
  347.         (eopl:error 'apply-env-ref "No binding for ~s" sym))
  348.       (extended-env-record (syms vals env)
  349.         (let ((pos (rib-find-position sym syms)))
  350.           (if (number? pos)
  351.               (a-ref pos vals)
  352.               (apply-env-ref env sym)))))))
  353.  
  354. (define apply-env
  355.   (lambda (env sym)
  356.     (deref (apply-env-ref env sym))))
  357.  
  358. (define extend-env-recursively
  359.   (lambda (proc-names idss bodies old-env)
  360.     (let ((len (length proc-names)))
  361.       (let ((vec (make-vector len)))
  362.         (let ((env (extended-env-record proc-names vec old-env)))
  363.           (for-each
  364.             (lambda (pos ids body)
  365.               (vector-set! vec pos (closure ids body env)))
  366.             (iota len) idss bodies)
  367.           env)))))
  368.  
  369. ;(define rib-find-position
  370. ;  (lambda (sym los)
  371. ;    (list-find-position sym los)))
  372.  
  373. (define list-find-position
  374.   (lambda (sym los)
  375.     (list-index (lambda (sym1) (eqv? sym1 sym)) los)))
  376.  
  377. (define list-index
  378.   (lambda (pred ls)
  379.     (cond
  380.       ((null? ls) #f)
  381.       ((pred (car ls)) 0)
  382.       (else (let ((list-index-r (list-index pred (cdr ls))))
  383.               (if (number? list-index-r)
  384.                 (+ list-index-r 1)
  385.                 #f))))))
  386.  
  387. (define iota
  388.   (lambda (end)
  389.     (let loop ((next 0))
  390.       (if (>= next end) '()
  391.         (cons next (loop (+ 1 next)))))))
  392.  
  393. (define difference
  394.   (lambda (set1 set2)
  395.     (cond
  396.       ((null? set1) '())
  397.       ((memv (car set1) set2)
  398.        (difference (cdr set1) set2))
  399.       (else (cons (car set1) (difference (cdr set1) set2))))))
  400.  
  401.  
  402. ;^; new for ch 5
  403. (define extend-env-refs
  404.   (lambda (syms vec env)
  405.     (extended-env-record syms vec env)))
  406.  
  407. ;^; waiting for 5-4-2.  Brute force code.
  408. (define list-find-last-position
  409.   (lambda (sym los)
  410.     (let loop
  411.       ((los los) (curpos 0) (lastpos #f))
  412.       (cond
  413.         ((null? los) lastpos)
  414.         ((eqv? sym (car los))
  415.          (loop (cdr los) (+ curpos 1) curpos))
  416.         (else (loop (cdr los) (+ curpos 1) lastpos))))))
  417.  
  418. ;;;;;;;;;;;;;;;; classes ;;;;;;;;;;;;;;;;
  419.  
  420. (define-datatype class class?
  421.   (a-class
  422.     (class-name symbol?)  
  423.     (super-name symbol?)
  424.     (field-length integer?)  
  425.     (field-ids (list-of symbol?))
  426.     (methods method-environment?)))
  427.  
  428. ;;;; constructing classes
  429.  
  430. (define elaborate-class-decls!
  431.   (lambda (c-decls)
  432.     (initialize-class-env!)
  433.     (for-each elaborate-class-decl! c-decls)))
  434.  
  435. (define elaborate-class-decl!
  436.   (lambda (c-decl)
  437.     (let ((super-name (class-decl->super-name c-decl)))
  438.       (let ((field-ids  (append
  439.                           (class-name->field-ids super-name)
  440.                           (class-decl->field-ids c-decl))))
  441.         (add-to-class-env!
  442.           (a-class
  443.             (class-decl->class-name c-decl)
  444.             super-name
  445.             (length field-ids)
  446.             field-ids
  447.             (roll-up-method-decls
  448.               c-decl super-name field-ids)))))))
  449.  
  450. (define roll-up-method-decls
  451.   (lambda (c-decl super-name field-ids)
  452.     (map
  453.       (lambda (m-decl)
  454.         (a-method m-decl super-name field-ids))
  455.       (class-decl->method-decls c-decl))))
  456.  
  457.  
  458. ;^;;;;;;;;;;;;;;; objects ;;;;;;;;;;;;;;;;
  459.  
  460. ;^; an object is now just a single part, with a vector representing the
  461. ;^; managed storage for the all the fields.
  462.  
  463. (define-datatype object object?
  464.   (an-object
  465.     (class-name symbol?)
  466.     (fields vector?)))
  467.  
  468. (define new-object
  469.   (lambda (class-name)
  470.     (an-object
  471.       class-name
  472.       (make-vector (class-name->field-length class-name))))) ;\new1
  473.  
  474. ;^;;;;;;;;;;;;;;; methods ;;;;;;;;;;;;;;;;
  475.  
  476. (define-datatype method method?
  477.   (a-method
  478.     (method-decl method-decl?)
  479.     (super-name symbol?)
  480.     (field-ids (list-of symbol?))))
  481.  
  482. (define find-method-and-apply
  483.   (lambda (m-name host-name self args)
  484.     (let loop ((host-name host-name))
  485.       (if (eqv? host-name 'object)
  486.           (eopl:error 'find-method-and-apply
  487.             "No method for name ~s" m-name)
  488.           (let ((method (lookup-method m-name ;^ m-decl -> method
  489.                           (class-name->methods host-name))))
  490.             (if (method? method)
  491.                 (apply-method method host-name self args)
  492.                 (loop (class-name->super-name host-name))))))))
  493.  
  494. (define apply-method
  495.   (lambda (method host-name self args)                ;\new5
  496.     (let ((ids (method->ids method))
  497.           (body (method->body method))
  498.           (super-name (method->super-name method))
  499.           (field-ids (method->field-ids method))      
  500.           (fields (object->fields self)))
  501.       (eval-expression body
  502.         (extend-env
  503.           (cons '%super (cons 'self ids))
  504.           (cons super-name (cons self args))
  505.           (extend-env-refs field-ids fields (empty-env)))))))
  506.  
  507. (define rib-find-position
  508.   (lambda (name symbols)
  509.     (list-find-last-position name symbols)))
  510.  
  511. ;;;;;;;;;;;;;;;; method environments ;;;;;;;;;;;;;;;;
  512.  
  513. (define method-environment? (list-of method?))
  514.  
  515. (define lookup-method                  
  516.   (lambda (m-name methods)
  517.     (cond
  518.       ((null? methods) #f)
  519.       ((eqv? m-name (method->method-name (car methods)))
  520.        (car methods))
  521.       (else (lookup-method m-name (cdr methods))))))
  522.  
  523. ;;;;;;;;;;;;;;;; class environments ;;;;;;;;;;;;;;;;
  524.  
  525. ;;; we'll just use the list of classes (not class decls)
  526.  
  527. (define the-class-env '())
  528.  
  529. (define initialize-class-env!
  530.   (lambda ()
  531.     (set! the-class-env '())))
  532.  
  533. (define add-to-class-env!
  534.   (lambda (class)
  535.     (set! the-class-env (cons class the-class-env))))
  536.  
  537. (define lookup-class                    
  538.   (lambda (name)
  539.     (let loop ((env the-class-env))
  540.       (cond
  541.         ((null? env) (eopl:error 'lookup-class
  542.                        "Unknown class ~s" name))
  543.         ((eqv? (class->class-name (car env)) name) (car env))
  544.         (else (loop (cdr env)))))))
  545.  
  546. ;;;;;;;;;;;;;;;; selectors ;;;;;;;;;;;;;;;;
  547.  
  548. (define class->class-name
  549.   (lambda (c-struct)
  550.     (cases class c-struct
  551.       (a-class (class-name super-name field-length field-ids methods)
  552.         class-name))))
  553.  
  554. (define class->super-name
  555.   (lambda (c-struct)
  556.     (cases class c-struct
  557.       (a-class (class-name super-name field-length field-ids methods)
  558.         super-name))))
  559.  
  560. (define class->field-length
  561.   (lambda (c-struct)
  562.     (cases class c-struct
  563.       (a-class (class-name super-name field-length field-ids methods)
  564.         field-length))))
  565.  
  566. (define class->field-ids
  567.   (lambda (c-struct)
  568.     (cases class c-struct
  569.       (a-class (class-name super-name field-length field-ids methods)
  570.         field-ids))))
  571.  
  572. (define class->methods
  573.   (lambda (c-struct)
  574.     (cases class c-struct
  575.       (a-class (class-name super-name field-length field-ids methods)
  576.         methods))))
  577.  
  578. (define object->class-name
  579.   (lambda (obj)
  580.     (cases object obj
  581.       (an-object (class-name fields)
  582.         class-name))))
  583.  
  584. (define object->fields
  585.   (lambda (obj)
  586.     (cases object obj
  587.       (an-object (class-decl fields)
  588.         fields))))
  589.  
  590. (define object->class-decl
  591.   (lambda (obj)
  592.     (lookup-class (object->class-name obj))))
  593.  
  594. (define object->field-ids
  595.   (lambda (object)
  596.     (class->field-ids
  597.       (object->class-decl object))))
  598.  
  599. (define class-name->super-name
  600.   (lambda (class-name)
  601.     (class->super-name (lookup-class class-name))))
  602.  
  603. (define class-name->field-ids
  604.   (lambda (class-name)
  605.     (if (eqv? class-name 'object) '()
  606.       (class->field-ids (lookup-class class-name)))))
  607.  
  608. (define class-name->methods
  609.   (lambda (class-name)
  610.     (if (eqv? class-name 'object) '()
  611.       (class->methods (lookup-class class-name)))))
  612.  
  613. (define class-name->field-length
  614.   (lambda (class-name)
  615.     (if (eqv? class-name 'object)
  616.         0
  617.         (class->field-length (lookup-class class-name)))))
  618.  
  619. (define method->method-decl
  620.   (lambda (meth)
  621.     (cases method meth
  622.       (a-method (meth-decl super-name field-ids) meth-decl))))
  623.  
  624. (define method->super-name
  625.   (lambda (meth)
  626.     (cases method meth
  627.       (a-method (meth-decl super-name field-ids) super-name))))
  628.  
  629. (define method->field-ids
  630.   (lambda (meth)
  631.     (cases method meth
  632.       (a-method (method-decl super-name field-ids) field-ids))))
  633.  
  634. (define method->method-name
  635.   (lambda (method)
  636.     (method-decl->method-name (method->method-decl method))))
  637.  
  638. (define method->body
  639.   (lambda (method)
  640.     (method-decl->body (method->method-decl method))))
  641.  
  642. (define method->ids
  643.   (lambda (method)
  644.     (method-decl->ids (method->method-decl method))))
  645.  
  646.  
  647. (define interpretador
  648.   (sllgen:make-rep-loop  "-->" eval-program
  649.                          (sllgen:make-stream-parser
  650.                                   the-lexical-spec
  651.                                   the-grammar)))
  652.  
  653. (scan&parse "
  654. class c_1 extends object
  655. field a
  656. field b
  657. method initialize () 0
  658. method setup (x, y)
  659. begin
  660. set a=x;
  661. set b=+(y,2);
  662. -(y,x)
  663. end
  664. method m1 () send self m2 (+(a,b))
  665. method m2 (n) +(n, -(b,a))
  666.  
  667. class c_2 extends c_1
  668. field b
  669. field c
  670. method setup (x, y)
  671. begin
  672. set b=x;
  673. set c=super setup(y, *(b,2));
  674. super m1()
  675. end
  676. method m2 (n) +(n,*(a, -(b,c)))
  677. method m3 (n) +(b, super m2(+(c,n)))
  678.  
  679. class c_3 extends c_2
  680. field a
  681. method setup(x,y)
  682. begin
  683. set a=super setup(y,x);
  684. *(x,y)
  685. end
  686. method m2 (n) super m3(n)
  687. method m3 (n) +(n, -(c,b))
  688. method m4 (n) super m2(+(n, +(b, 2)))
  689.  
  690. let p=proc (o)
  691.         let r_1 = send o setup(1,3)
  692.         in let r_2 = send o m2(+(r_1 ,1))
  693.                r_3 = send o m1()
  694.            in +(r_1 , +(r_2 ,r_3 ))
  695. o_1 = new c_1()
  696. o_2 = new c_2()
  697. o_3 = new c_3()
  698. in let x= (p o_1)
  699. y= (p o_2)
  700. z= (p o_3)
  701. in send o_3 m4(+(x, +(y,z )))
  702. ")
  703.  
  704. (define programaObjetos1
  705.    "
  706.   class c1 extends object
  707.     field a
  708.     field b
  709.     field c
  710.     method initialize ()
  711.      begin
  712.        set a=1;
  713.        set b=2;
  714.        set c=+(a,b);
  715.        c
  716.      end
  717.     method m1 ()
  718.      begin
  719.        set a=+(a,b);
  720.        set b=+(a,a);
  721.        +( send self m2 (a), b)
  722.     end
  723.     method m2 (n) +(n,+(+(a,b),c))
  724.  
  725.  class c2 extends c1
  726.     field c
  727.     field d
  728.     method initialize ()
  729.       begin
  730.         set b=1;
  731.         super initialize();
  732.         set c=2;
  733.         set d=c;
  734.         send self m3(c)
  735.       end
  736.      method m2 (n) let a = +(n,+(a,-(b,c))) in +(n,+(a,-(b,c)))
  737.  
  738.     method m3 (n)
  739.        begin
  740.          set a=+(a,c);
  741.          set b=+(b,c);
  742.          super m2(n)
  743.        end
  744.  
  745.    let  p=proc (o)
  746.          let r1 = send o m2(3)
  747.              r2 = send o m1()
  748.              in +(r1,r2 )
  749.         o1 = new c1()
  750.         o2 = new c2()
  751.    in let x= (p o1)
  752.           y= (p o2)
  753.        in send o2 m3(+(x, y))
  754.   " )
  755.  
  756. (define programaObjetos2 "
  757.  
  758. class c1 extends object
  759. field a
  760. field b
  761. field c
  762. method initialize ()
  763.  begin
  764.   set a=1;
  765.   set b=2;
  766.   set c=-(b,a);
  767.   c
  768.  end
  769.  method m1 ()
  770.   begin
  771.    set a=+(a,b);
  772.    set b=+(a,b);
  773.    +( send self m2 (a), b)
  774.  end
  775.  method m2 (n) +(n,+(+(a,c),b))
  776.  
  777. class c2 extends c1
  778.  
  779.  field c
  780.  field d
  781.  method initialize ()
  782.   begin
  783.     set b=2;
  784.     super initialize();
  785.     set c=3;
  786.     set d=c;
  787.     send self m3(d)
  788.   end
  789.  
  790.   method m2 (n) let a = +(n,+(a,-(b,c))) in +(n,+(a,-(b,c)))
  791.  
  792.   method m3 (n)
  793.    begin
  794.      set a=+(a,c);
  795.      set b=+(b,c);
  796.      super m2(n)
  797.    end
  798.  
  799.   let p=proc (o)
  800.          let r1 = send o m2(3)
  801.              r2 = send o m1()
  802.          in +(r1,r2 )
  803.       o1 = new c1()
  804.       o2 = new c2()
  805.  in let x= (p o1)
  806.         y= (p o2)
  807.     in send o2 m3(+(x, y))
  808. ")
  809.  
  810. ;(read-eval-print)
  811.  
  812. ;;Ejemplos
  813. ;; class c1 extends object  field x field y  method initialize()  begin set x = 1; set y = 2 end method m1() x method m2() y  let o1 = new c1() in send o1 m1()
  814.  
  815.  
  816. ;;;; class c1 extends object  field x field y  method initialize()  begin set x = 1; set y = 2 end method m1() x method m2() y  class c2 extends c1  field x field y  method initialize()  begin set x = 2; set y = 3 end method m1() x  let o1 = new c1() o2 = new c2() in send o2 m2()
  817.  
  818.  
  819. ;;;; class c1 extends object  field x field y  method initialize()  begin   set x = 1; set y = 2 end method m1() x method m2() y  class c2 extends c1  field x field y  method initialize()  begin   super initialize(); set  x = 2; set y = 3 end method m1() x  let o1 = new c1() o2 = new c2() in send o2 m2()
  820.  
  821. ;;class c1 extends object  field x field y  method initialize()  begin   set x = 1; set y = 2 end method m1() x method m2() send self m1()  class c2 extends c1  field x field y  method initialize()  begin   super initialize(); set  x = 9; set y = 10 end method m1() x  let o1 = new c1() o2 = new c2() in send o2 m2()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement