Erlang 语言编程问题: 一家具有创新理念的新公司计划让顾客在网上订购食品杂货,然后用卡车送货。他们决定将这项服务称为“WeePod”(也是需要的编程文件名)。你的目标是编写一个Erlang服务器来帮助运行该服务。服务器应该拥有增加/删除商品列表和客户购物车。命令应该包括:
show_shelves
Returns a list of {=item name=, =price=} pairs.
返回所有商品(商品名字,价格)的列表
{add_item, =item name=, =price=}
Puts the new item on shelve (or changes the price for the existing item).
增加新商品(或者改变现有商品的价格)
{choose, =item name=, =count=}
Places =count= many =item name='s in your shopping cart.
将商品名字和价格加入购物车
{remove, =item name=}
Removes all =item name='s (if any) from your shopping cart.
删除所有在购物车里的商品
show_basket
Returns a list of {=item name=, =count=} pairs.
输出购物篮中商品名字+数量
checkout
Returns total price of items in your shopping cart.
输出购物篮中商品总额
除了服务器所需的代码之外,还应该提供一个向服务器发送消息的简单函数。(例子最后有写)
如下是问题给的简单示例:
-module(weepod_alpha).
-export([start/0, send_wait/2]).
start() -> spawn(fun init/0).
init() ->
put({item, lettuce}, 1.50),
put({item, cupcake}, 0.75),
put({item, soup}, 2.35),
put(cart, []),
loop().
add_items(Name, Count, []) -> [{Name, Count}];
add_items(Name, Count, [{Name, C}|L]) -> [{Name, C+Count}|L];
add_items(Name, Count, [H|L]) -> [H|add_items(Name, Count, L)].
shelf_list() ->
K = get(),
[{N,get(E)} || {{item, N}=E, _} <- K].
loop() ->
receive
{From, show_shelves} ->
From ! {self(), shelf_list()}, loop();
{From, {choose, Name, Count}} ->
put(cart, add_items(Name, Count, get(cart))),
From ! {self(), ok}, loop();
{From, Other} ->
From ! {self(), {error, Other}}, loop()
end.
% core client function
send_wait(Pid, Request) ->
Pid ! {self(), Request},
receive
{Pid, Response} -> Response
end.