如何在枫树中创建类似结构的地图(std :: map)?

时间:2012-12-21 02:21:42

标签: maple

我需要一个包含API的容器:

addKeyValuePair(containerRef, [key, value])
searchByKey(containerRef, key) #that would return NULL or `value`

如何在Maple(15)中创建这样的东西?

1 个答案:

答案 0 :(得分:1)

您可能只想将常规索引编入table。请注意,以下未分配的名称Y只需分配到某个已编入索引的条目table即可成为Y[a]

restart:
Y[a]:=211:

Y[a];
                          211

Y[b];
                          Y[b]

assigned(Y[a]);
                          true

assigned(Y[b]);
                         false

eval(Y);
                      table([a = 211])

说了这么多,获得你所描述的功能只是一小部分包装,当Y[b]尚未分配时,访问NULL会返回Y[b]等等。

您可以自定义(或删除)key属于symbol类型的错误检查和限制,因为Maple允许更频繁地对table编制索引。

restart:

addKeyValuePair:=proc(containerRef::{indexed,symbol}, L::list)
  if nops(L) <> 2 then
    error "expecting list with two entries"; end if;
  if not type(L[1], symbol) then
    error "expecting list with symbol as first entry"; end if;
  containerRef[L[1]]:=L[2];
  NULL;
end proc:

searchByKey:=proc(containerRef::{indexed,symbol}, key::name)
  if assigned(containerRef[key]) then
    containerRef[key];
  else
    NULL;
  end if;
end proc:

addKeyValuePair( Y, [a, 4.5] );

searchByKey( Y, a );
                          4.5

searchByKey( Y, b );

searchByKey( Q, b );

addKeyValuePair( Y, [a, 211] );

searchByKey( Y, a );
                          211

addKeyValuePair( Y, [c] );
Error, (in addKeyValuePair) expecting list with two entries

addKeyValuePair( Y, [2.34, 211] );
Error, (in addKeyValuePair) expecting list with symbol as first entry

table是一个可变数据结构。它的类型为last_name_eval,因此它(有效地)通过“引用”作为过程调用的参数传递。