Guest User

Untitled

a guest
Apr 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.64 KB | None | 0 0
  1.  
  2. 2a)
  3. declare proc{NewWrapper ?Wrap ?Unwrap}
  4. Key={NewName}
  5. in
  6. fun{Wrap X}
  7. fun{$ K} if K==Key
  8. then X
  9. else raise 'use Unwrap' end
  10. end
  11. end
  12. end
  13. fun{Unwrap C}
  14. try{C Key}
  15. catch _ then raise error(unwrap(C)) end
  16. end
  17. end
  18. end
  19.  
  20. declare Queue =
  21. local
  22. Wrap Unwrap
  23. {NewWrapper Wrap Unwrap}
  24.  
  25. fun {Empty}
  26. {Wrap nil}
  27. end
  28.  
  29. fun {Enqueue X#Q}
  30. {Wrap X|{Unwrap Q}}
  31. end
  32.  
  33. fun {Dequeue Q}
  34. case {Unwrap Q} of
  35. nil then {Wrap nil}
  36. [] [X] then {Wrap nil}
  37. [] (H|T) then {Wrap H|{Unwrap {Dequeue {Wrap T}}}}
  38. end
  39. end
  40.  
  41. fun {First Q}
  42. case {Unwrap Q} of
  43. nil then raise empty(queue: first) end
  44. [] [X] then {Wrap X}
  45. [] (_|T) then {Wrap {Unwrap {First {Wrap T}}}}
  46. end
  47. end
  48.  
  49. fun {IsEmpty Q}
  50. case {Unwrap Q} of
  51. nil then true
  52. [] _ then false
  53. end
  54. end
  55.  
  56. fun {ToList Q}
  57. {Unwrap Q}
  58. end
  59. in
  60. queue(empty: Empty
  61. enqueue: Enqueue
  62. dequeue: Dequeue
  63. first: First
  64. isEmpty: IsEmpty
  65. toList: ToList
  66. )
  67. end
  68. {Browse {Queue.isEmpty {Queue.enqueue 1#{Queue.empty}}}}
  69. {Browse {Queue.isEmpty {Queue.empty}}}
  70.  
  71. {Browse {Queue.toList {Queue.dequeue {Queue.enqueue 4#{Queue.enqueue 3#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}}}
  72. {Browse {Queue.toList {Queue.first {Queue.enqueue 4#{Queue.enqueue 3#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}}}
  73. {Browse {Queue.first {Queue.empty}}}
  74.  
  75. 2B)
  76.  
  77.  
  78.  
  79. declare proc{NewWrapper ?Wrap ?Unwrap}
  80. Key={NewName}
  81. in
  82. fun{Wrap X}
  83. fun{$ K} if K==Key
  84. then X
  85. else raise 'use Unwrap' end
  86. end
  87. end
  88. end
  89. fun{Unwrap C}
  90. try{C Key}
  91. catch _ then raise error(unwrap(C)) end
  92. end
  93. end
  94. end
  95.  
  96. declare Queue =
  97. local
  98. Wrap Unwrap
  99. {NewWrapper Wrap Unwrap}
  100.  
  101. fun {Empty}
  102. ({Wrap nil}#{Wrap nil})
  103. end
  104.  
  105. fun {Enqueue X # (Q1#Q2)}
  106. case {Unwrap Q1} of
  107. nil then ({Wrap [X]} # {Wrap X|{Unwrap Q2}})
  108. [] _ then ( Q1 # {Wrap X|{Unwrap Q2}}) %pjest Q1
  109. end
  110. end
  111.  
  112. fun {Dequeue Q1#Q2}
  113. case {Unwrap Q1}#{Unwrap Q2} of
  114. ([X]#Q2) then ({Dequeue ({Wrap {Reverse Q2}}#{Wrap nil}) })
  115. [] ((_|T)#Q2) then ({Wrap T}#{Wrap Q2})
  116. [] _ then ({Wrap nil}#{Wrap nil})
  117. end
  118. end
  119.  
  120. fun {IsEmpty Q1#Q2}
  121. case {Unwrap Q1}#{Unwrap Q2} of
  122. (nil#nil) then true
  123. [] _ then false
  124. end
  125. end
  126.  
  127. fun {First Q1#Q2}
  128. case {Unwrap Q1}#Q2 of
  129. (nil#_) then raise empty(queue: first) end
  130. [] ((H|_)#_) then H
  131. end
  132. end
  133.  
  134. fun {ToList Q1#Q2}
  135. {Unwrap Q1}#{Unwrap Q2}
  136. end
  137.  
  138.  
  139. in
  140. queue(empty: Empty
  141. enqueue: Enqueue
  142. dequeue: Dequeue
  143. first: First
  144. isEmpty: IsEmpty
  145. toList: ToList
  146. )
  147. end
  148.  
  149. {Browse {Queue.toList {Queue.enqueue 3#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}
  150.  
  151. {Browse {Queue.isEmpty {Queue.enqueue 1#{Queue.empty}}}}
  152. {Browse {Queue.isEmpty {Queue.empty}}}
  153.  
  154. {Browse {Queue.toList {Queue.dequeue {Queue.enqueue 4#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}}
  155. {Browse {Queue.first {Queue.enqueue 5#{Queue.enqueue 4#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}}
  156. {Browse {Queue.first {Queue.empty}}}
Add Comment
Please, Sign In to add comment