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

このソリューションは私のために機能しました(最大ヘルプの「カレー」の例に基づいています。36をbuildq参照してください。関数の定義):

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 に答える