Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 2a)
- declare proc{NewWrapper ?Wrap ?Unwrap}
- Key={NewName}
- in
- fun{Wrap X}
- fun{$ K} if K==Key
- then X
- else raise 'use Unwrap' end
- end
- end
- end
- fun{Unwrap C}
- try{C Key}
- catch _ then raise error(unwrap(C)) end
- end
- end
- end
- declare Queue =
- local
- Wrap Unwrap
- {NewWrapper Wrap Unwrap}
- fun {Empty}
- {Wrap nil}
- end
- fun {Enqueue X#Q}
- {Wrap X|{Unwrap Q}}
- end
- fun {Dequeue Q}
- case {Unwrap Q} of
- nil then {Wrap nil}
- [] [X] then {Wrap nil}
- [] (H|T) then {Wrap H|{Unwrap {Dequeue {Wrap T}}}}
- end
- end
- fun {First Q}
- case {Unwrap Q} of
- nil then raise empty(queue: first) end
- [] [X] then {Wrap X}
- [] (_|T) then {Wrap {Unwrap {First {Wrap T}}}}
- end
- end
- fun {IsEmpty Q}
- case {Unwrap Q} of
- nil then true
- [] _ then false
- end
- end
- fun {ToList Q}
- {Unwrap Q}
- end
- in
- queue(empty: Empty
- enqueue: Enqueue
- dequeue: Dequeue
- first: First
- isEmpty: IsEmpty
- toList: ToList
- )
- end
- {Browse {Queue.isEmpty {Queue.enqueue 1#{Queue.empty}}}}
- {Browse {Queue.isEmpty {Queue.empty}}}
- {Browse {Queue.toList {Queue.dequeue {Queue.enqueue 4#{Queue.enqueue 3#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}}}
- {Browse {Queue.toList {Queue.first {Queue.enqueue 4#{Queue.enqueue 3#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}}}
- {Browse {Queue.first {Queue.empty}}}
- 2B)
- declare proc{NewWrapper ?Wrap ?Unwrap}
- Key={NewName}
- in
- fun{Wrap X}
- fun{$ K} if K==Key
- then X
- else raise 'use Unwrap' end
- end
- end
- end
- fun{Unwrap C}
- try{C Key}
- catch _ then raise error(unwrap(C)) end
- end
- end
- end
- declare Queue =
- local
- Wrap Unwrap
- {NewWrapper Wrap Unwrap}
- fun {Empty}
- ({Wrap nil}#{Wrap nil})
- end
- fun {Enqueue X # (Q1#Q2)}
- case {Unwrap Q1} of
- nil then ({Wrap [X]} # {Wrap X|{Unwrap Q2}})
- [] _ then ( Q1 # {Wrap X|{Unwrap Q2}}) %pjest Q1
- end
- end
- fun {Dequeue Q1#Q2}
- case {Unwrap Q1}#{Unwrap Q2} of
- ([X]#Q2) then ({Dequeue ({Wrap {Reverse Q2}}#{Wrap nil}) })
- [] ((_|T)#Q2) then ({Wrap T}#{Wrap Q2})
- [] _ then ({Wrap nil}#{Wrap nil})
- end
- end
- fun {IsEmpty Q1#Q2}
- case {Unwrap Q1}#{Unwrap Q2} of
- (nil#nil) then true
- [] _ then false
- end
- end
- fun {First Q1#Q2}
- case {Unwrap Q1}#Q2 of
- (nil#_) then raise empty(queue: first) end
- [] ((H|_)#_) then H
- end
- end
- fun {ToList Q1#Q2}
- {Unwrap Q1}#{Unwrap Q2}
- end
- in
- queue(empty: Empty
- enqueue: Enqueue
- dequeue: Dequeue
- first: First
- isEmpty: IsEmpty
- toList: ToList
- )
- end
- {Browse {Queue.toList {Queue.enqueue 3#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}
- {Browse {Queue.isEmpty {Queue.enqueue 1#{Queue.empty}}}}
- {Browse {Queue.isEmpty {Queue.empty}}}
- {Browse {Queue.toList {Queue.dequeue {Queue.enqueue 4#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}}
- {Browse {Queue.first {Queue.enqueue 5#{Queue.enqueue 4#{Queue.enqueue 2#{Queue.enqueue 1#{Queue.empty}}}}}}}
- {Browse {Queue.first {Queue.empty}}}
Add Comment
Please, Sign In to add comment