Advertisement
DoromaAnim

Untitled

Apr 3rd, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. ;;(define (app-flat t)
  2. ;; (define (iter tt xs)
  3. ;; (if (eq? `leaf tt)
  4. ;; xs
  5. ;; (iter (third tt) (cons (second tt) (iter (fourth tt) xs)))))
  6. ;; (iter t null))
  7.  
  8. #lang racket
  9.  
  10. ;; struktury z których budujemy drzewa binarne
  11.  
  12. (struct node (v l r) #:transparent)
  13. (struct leaf () #:transparent)
  14.  
  15. ;; predykat: czy dana wartość jest drzewem binarnym?
  16.  
  17. (define (tree? t)
  18. (match t
  19. [(leaf) true]
  20. ; wzorzec _ dopasowuje się do każdej wartości
  21. [(node _ l r) (and (tree? l) (tree? r))]
  22. ; inaczej niż w (cond ...), jeśli żaden wzorzec się nie dopasował, match kończy się błędem
  23. [_ false]))
  24.  
  25. ;; przykładowe użycie dopasowania wzroca
  26.  
  27. (define (insert-bst v t)
  28. (match t
  29. [(leaf) (node v (leaf) (leaf))]
  30. [(node 0 l r) (error "zero w drzewie")]
  31. [(node w l r)
  32. (if (< v w)
  33. (node w (insert-bst v l) r)
  34. (node w l (insert-bst v r)))]))
  35.  
  36. (define (paths t)
  37. (define (add v xs)
  38. (if (null? xs)
  39. xs
  40. (cons (cons v (car xs)) (add v (cdr xs)))))
  41. (define (rek t)
  42. (match t
  43. [(leaf) (list `*)]
  44. [(node v l r) (add v (append (rek l) (rek r)))]))
  45. (rek t))
  46.  
  47. (paths (node 3 (node 2 (leaf)(node 6 (node 7 (leaf) (leaf))(leaf)))(node 7 (leaf) (leaf))))
  48.  
  49. ;; definicja wyrażeń z let-wyrażeniami
  50.  
  51. (struct const (val) #:transparent)
  52. (struct op (symb l r) #:transparent)
  53. (struct let-expr (x e1 e2) #:transparent)
  54. (struct variable (x) #:transparent)
  55.  
  56. (define (expr? e)
  57. (match e
  58. [(variable s) (symbol? s)]
  59. [(const n) (number? n)]
  60. [(op s l r) (and (member s '(+ *))
  61. (expr? l)
  62. (expr? r))]
  63. [(let-expr x e1 e2) (and (symbol? x)
  64. (expr? e1)
  65. (expr? e2))]
  66. [_ false]))
  67.  
  68. ;; podstawienie wartości (= wyniku ewaluacji wyrażenia) jako stałej w wyrażeniu
  69.  
  70. (define (subst x v e)
  71. (match e
  72. [(op s l r) (op s (subst x v l)
  73. (subst x v r))]
  74. [(const n) (const n)]
  75. [(variable y) (if (eq? x y)
  76. (const v)
  77. (variable y))]
  78. [(let-expr y e1 e2)
  79. (if (eq? x y)
  80. (let-expr y
  81. (subst x v e1)
  82. e2)
  83. (let-expr y
  84. (subst x v e1)
  85. (subst x v e2)))]))
  86.  
  87. ;; (gorliwa) ewaluacja wyrażenia w modelu podstawieniowym
  88.  
  89. (define (eval e)
  90. (match e
  91. [(const n) n]
  92. [(op '+ l r) (+ (eval l) (eval r))]
  93. [(op '* l r) (* (eval l) (eval r))]
  94. [(let-expr x e1 e2)
  95. (eval (subst x (eval e1) e2))]
  96. [(variable n) (error n "cannot reference an identifier before its definition ;)")]))
  97.  
  98. ;; przykładowe programy
  99.  
  100. ;;(define p1
  101. ;; (let-expr 'x (op '+ (const 2) (const 2))
  102. ;; (op '+ (const 1000) (let-expr 'y (op '+ (const 5) (const 5))
  103. ;; (op '* (variable 'x) (variable 'y))))))
  104. ;;
  105. ;;(define p2
  106. ;; (let-expr 'x (op '+ (const 2) (const 2))
  107. ;; (op '+ (const 1000) (let-expr 'x (op '+ (const 5) (const 5))
  108. ;; (op '* (variable 'x) (variable 'x))))))
  109. ;;
  110. ;;(define p3
  111. ;; (let-expr 'x (op '+ (const 2) (const 2))
  112. ;; (op '+ (const 1000) (let-expr 'y (op '+ (const 5) (const 5))
  113. ;; (op '* (variable 'x) (variable 'z))))))
  114. ;;
  115. ;;(define p4
  116. ;; (let-expr 'y (op '+ (const 5) (const 5))
  117. ;; (op '* (const '2) (variable 'y))))
  118.  
  119.  
  120. (define (eval-sign e)
  121. (match e
  122. [(const n) 0]
  123. [(op '+ l r) (+ 1 (eval-sign l) (eval-sign r))]
  124. [(op '* l r) (- (+ (eval-sign l) (eval-sign r)) 1)]
  125. [(let-expr x e1 e2)
  126. (eval-sign (subst x (eval e1) e2))]
  127. [(variable n) (error n "cannot reference an identifier before its definition ;)")]))
  128.  
  129.  
  130. ;;(eval-sign p1)
  131. ;;(eval-sign p2)
  132. ;;(eval-sign p4)
  133. ;;(eval p3)
  134.  
  135. (struct text (title auth chaps))
  136. (struct chapt (title lst))
  137.  
  138. (define (list-of? xs p?)
  139. (define (iter xs)
  140. (if (null? xs)
  141. #t
  142. (if (p? (car xs))
  143. (iter (cdr xs))
  144. #f)))
  145. (if (< 0 (length xs))
  146. (iter xs)
  147. #f))
  148.  
  149. (define (chap? c)
  150. (match c
  151. [(chapt t l)
  152. (and
  153. (string? t)
  154. (list-of? l (lambda x (or (string? (car x))
  155. (chap? x)))))]
  156. [_ false]))
  157.  
  158.  
  159. (define (doc? d)
  160. (match d
  161. [(text t a c)
  162. (and
  163. (string? t)
  164. (string? a)
  165. (chap? c))]
  166. [_ false]))
  167.  
  168. (doc? (text "tytul" "autor" (chapt "tytul2" (list "akap1" "akap2"))))
  169.  
  170. (define a "xd")
  171.  
  172. (define (beg x)
  173. (printf (~a "<" x ">")))
  174.  
  175. (define (end x)
  176. (printf (~a "<" x "/>")))
  177.  
  178.  
  179.  
  180.  
  181.  
  182. ;;(beg `html)
  183. ;;(end `html)
  184.  
  185. (`1 `. `2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement