Advertisement
Guest User

Untitled

a guest
May 5th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 4.84 KB | None | 0 0
  1. #lang racket
  2.  
  3. ;; expressions
  4.  
  5. (define (const? t)
  6.   (number? t))
  7.  
  8. (define (op? t)
  9.   (and (list? t)
  10.        (member (car t) '(+ - * /))))
  11.  
  12. (define (op-op e)
  13.   (car e))
  14.  
  15. (define (op-args e)
  16.   (cdr e))
  17.  
  18. (define (op-cons op args)
  19.   (cons op args))
  20.  
  21. (define (op->proc op)
  22.   (cond [(eq? op '+) +]
  23.         [(eq? op '*) *]
  24.         [(eq? op '-) -]
  25.         [(eq? op '/) /]))
  26.  
  27. (define (let-def? t)
  28.   (and (list? t)
  29.        (= (length t) 2)
  30.        (symbol? (car t))))
  31.  
  32. (define (let-def-var e)
  33.   (car e))
  34.  
  35. (define (let-def-expr e)
  36.   (cadr e))
  37.  
  38. (define (let-def-cons x e)
  39.   (list x e))
  40.  
  41. (define (let? t)
  42.   (and (list? t)
  43.        (= (length t) 3)
  44.        (eq? (car t) 'let)
  45.        (let-def? (cadr t))))
  46.  
  47. (define (let-def e)
  48.   (cadr e))
  49.  
  50. (define (let-expr e)
  51.   (caddr e))
  52.  
  53. (define (let-cons def e)
  54.   (list 'let def e))
  55.  
  56. (define (var? t)
  57.   (symbol? t))
  58.  
  59. (define (var-var e)
  60.   e)
  61.  
  62. (define (var-cons x)
  63.   x)
  64.  
  65. (define (arith/let-expr? t)
  66.   (or (const? t)
  67.       (and (op? t)
  68.            (andmap arith/let-expr? (op-args t)))
  69.       (and (let? t)
  70.            (arith/let-expr? (let-expr t))
  71.            (arith/let-expr? (let-def-expr (let-def t))))
  72.       (var? t)))
  73.  
  74. ;; let-lifted expressions
  75.  
  76. (define (arith-expr? t)
  77.   (or (const? t)
  78.       (and (op? t)
  79.            (andmap arith-expr? (op-args t)))
  80.       (var? t)))
  81.  
  82. (define (let-lifted-expr? t)
  83.   (or (and (let? t)
  84.            (let-lifted-expr? (let-expr t))
  85.            (arith-expr? (let-def-expr (let-def t))))
  86.       (arith-expr? t)))
  87.  
  88. ;; generating a symbol using a counter
  89.  
  90. (define (number->symbol i)
  91.   (string->symbol (string-append "x" (number->string i))))
  92.  
  93. ;; environments (could be useful for something)
  94.  
  95. (define empty-env
  96.   null)
  97.  
  98. (define (add-to-env x v env)
  99.   (cons (list x v) env))
  100.  
  101. (define (find-in-env x env)
  102.   (cond [(null? env) (error "undefined variable" x)]
  103.         [(eq? x (caar env)) (cadar env)]
  104.         [else (find-in-env x (cdr env))]))
  105.  
  106. ;; the let-lift procedure
  107.  
  108. ;;wewnętrzna reprezentacja wyrażenia
  109. (define (struct? s) ;; lista zmiennych z ich definicjami, wyrażenie arith-expr, indeks potrzebny do zmiany nazwy
  110.   (and (list? s)
  111.        (= 3 (length s))
  112.        (arith-expr? (second s))
  113.        (list? (first s))
  114.        (number? (third s))))
  115. (define (struct-cons xs e idx)
  116.   (list xs e idx))
  117. (define (struct-varlist s)
  118.   (car s))
  119. (define (struct-expr s)
  120.   (cadr s))
  121. (define (struct-idx s)
  122.   (caddr s))
  123.  
  124. (define (struct->let-lift s)
  125.   (cond [(null? (struct-varlist s)) (struct-expr s)]
  126.         [else (let-cons (car (struct-varlist s))
  127.                         (struct->let-lift (struct-cons (cdr (struct-varlist s))
  128.                                                        (struct-expr s) 0)))]))
  129.  
  130. (define (let-lift e)
  131.   (define (helper e env idx)
  132.     (cond [(const? e) (struct-cons '() e idx)]
  133.           [(var? e) (struct-cons '() (find-in-env (var-var e) env) idx)]
  134.           [(op? e) (let ((lis (op-helper (op-args e) env idx)))
  135.                      (struct-cons (app-varlist lis)
  136.                                   (op-cons (op-op e) (app-expr lis))
  137.                                   (+ (length (app-varlist lis))idx)))]
  138.           [(let? e) (let* ((a (helper (let-def-expr (let-def e)) env idx))
  139.                           (new-var (list (let-def-var (let-def e))
  140.                                          (number->symbol (struct-idx a))))
  141.                           (b (helper (let-expr e)
  142.                                      (add-to-env (first new-var) (second new-var) env)
  143.                                      (+ 1 (struct-idx a)))))
  144.                       (struct-cons (append (struct-varlist a)
  145.                                            (list (list (second new-var) (struct-expr a)))
  146.                                            (struct-varlist b))
  147.                                    (struct-expr b)
  148.                                    (struct-idx b)))]))
  149.  
  150.   (define (op-helper lis env idx)
  151.   (if (null? lis)
  152.       null
  153.       (let ((a (helper (car lis) env idx)))
  154.         (cons a (op-helper (cdr lis) env (struct-idx a))))))
  155.  
  156.   (define (app-varlist lis-struct )
  157.     (if (null? lis-struct)
  158.         null
  159.         (append (struct-varlist (car lis-struct)) (app-varlist (cdr lis-struct)))))
  160.  
  161.   (define (app-expr lis-struct)
  162.     (if (null? lis-struct)
  163.         null
  164.         (cons (struct-expr (car lis-struct)) (app-expr (cdr lis-struct)))))
  165.            
  166.   (struct->let-lift (helper e empty-env 1)))
  167.  
  168. (let-lift '(let (x 4) (let (y 7) 5)))
  169. (let-lift '(+ (let (x 5) x)
  170.               (let (x 1) x)
  171.               (let (x 7) x)))
  172. (let-lift '(let (z 3) z))
  173. (let-lift '( let ( x (- 2
  174.                         ( let ( z 3) z ) ) )
  175.               (+ x 2) ))
  176. (let-lift '(let (x
  177.                  (* 3
  178.                     (let (z 1)
  179.                         (let (a (+ z 2)) (- a 4)))
  180.                     (let (y 2) (+ 6 y))))
  181.              (- 5 x)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement