Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 1.94 KB | None | 0 0
  1. #lang racket
  2.  
  3. (define (tagged-tuple? tag len p)
  4.   (and (list? p)
  5.        (= (length p) len)
  6.        (eq? (car p) tag)))
  7.  
  8. (define (tagged-list? tag p)
  9.   (and (pair? p)
  10.        (eq? (car p) tag)
  11.        (list? (cdr p))))
  12.  
  13. ;; tree
  14.  
  15. (define (node x y)
  16.   (list 'node x y))
  17.  
  18. (define (node? n)
  19.   (tagged-tuple? 'node 3 n))
  20.  
  21. (define (node-left n)
  22.   (second n))
  23.  
  24. (define (node-right n)
  25.   (third n))
  26.  
  27. (define (leaf? n)
  28.   (or (symbol? n)
  29.       (number? n)
  30.       (null? n)))
  31.  
  32. ;; results
  33.  
  34. (define (res v s)
  35.   (cons v s))
  36.  
  37. (define (res-val r)
  38.   (car r))
  39.  
  40. (define (res-state r)
  41.   (cdr r))
  42.  
  43. ;;
  44.  
  45. ;(define (rename t)
  46. ;  (define (rename-st t i)
  47. ;    (cond [(leaf? t) (res i (+ i 1))]
  48. ;          [(node? t)
  49. ;           (let* ([rl (rename-st (node-left t) i)]
  50. ;                  [rr (rename-st (node-right t) (res-state rl))])
  51. ;             (res (node (res-val rl) (res-val rr))
  52. ;                  (res-state rr)))]))
  53. ;  (res-val (rename-st t 0)))
  54.            
  55.  
  56. ;; currying
  57.  
  58. (let ([p (lambda (x y) (+ x y))])
  59.   (p 3 4))
  60.  
  61. (let ([p (lambda (x y) (+ x y))])
  62.   ((curry p) 3))
  63.  
  64. (let ([p (lambda (x y) (+ x y))])
  65.   (((curry p) 3) 4))
  66.  
  67. ((let ([p (lambda (x y) (+ x y))])
  68.    ((curry p) 3)) 4)
  69.  
  70.  
  71. ;;
  72.  
  73. (define (st-app f x y)
  74.   (lambda (i)
  75.     (let* ([rx (x i)]
  76.            [ry (y (res-state rx))])
  77.       (res (f (res-val rx) (res-val ry))
  78.            (res-state ry)))))
  79.  
  80. (define get-st
  81.   (lambda (i)
  82.     (res i i)))
  83.  
  84. (define (modify-st f)
  85.   (lambda (i)
  86.     (res null (f i))))
  87.  
  88. (define (inc n)
  89.   (+ n 1))
  90.  
  91. ;;
  92.  
  93. (define (rename t)
  94.   (define (rename-st t i)
  95.     (cond ;[(leaf? t) (lambda (i) (res i (+ i 1)))]
  96.           [(leaf? t)
  97.            (st-app (lambda (x y) x)
  98.                    get-st
  99.                    (modify-st inc))]
  100.           [(node? t)
  101.            (st-app node
  102.                    (rename-st (node-left t))
  103.                    (rename-st (node-right t)))]))
  104.   (res-val (rename-st t 0)))
  105.  
  106. ; WHILE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement