1

如何定义一个以最大值返回闭包的函数?

我的具体例子:我有一个表格列表:

myList : [a = 1, c = 33, d = c+7];

我想根据等号之前的部分提取一个元素。

这是我的尝试:

find_a (e) := first(e) = a;
temp1 : sublist(myList ,'find_a );
map('second, temp1);
//output is "1"

这如我所愿。

由于真正的列表要长得多,而且我不想复制粘贴代码,我现在想像这样使用它:

SearchElement(ElementName) := block(
        [res],
        res : lambda([x],first(x) = ElementName),
        return (res)
        );
GetByKey(list_,key_) := block(
        [res , finder:SearchElement(key_)],
        res : map('second, sublist(list_,'finder),
        return (res)
        );

GetByKey(myList, a);
// should return "1"

但是第一部分已经不起作用:

SearchElement(a);
// output:
lambda([x],first(x)=ElementName)
// expected output:
lambda([x],first(x)=a)
4

1 回答 1

2

该解决方案对我有用(基于最大值帮助中的“咖喱”示例buildq,请参阅36. 函数定义):

ElementSelectorPredicate(targetElement) ::= buildq (
            [targetElement], 
            lambda ([x], first(x) = targetElement)
          );
ExtractElement(targetList, targetElement, operation) := block(
            [searcher: ElementSelectorPredicate(targetElement), res],
            res: first(sublist(targetList,'searcher)), 
            return (operation(res))
          );

例子:

myList : [a = 4, b = 7, c = 5+b]$
ExtractElement(myList, b, identity);
// result: b = 7
ExtractElement(myList, c, second);
// result: b+5
于 2012-10-11T10:01:43.727 回答