2012-10-11 4 views
1

Comment puis-je définir une fonction qui renvoie une fermeture en maximum?Fonction qui renvoie une fermeture au maximum

Mon exemple concret: J'ai une liste de la forme:

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

Je veux exctract un élément en fonction de la partie avant le signe égal.

Voilà ma tentative:

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

Cela a fonctionné comme je voulais.

Depuis la liste réelle est beaucoup plus longue et je ne veux pas copier-coller le code, Je veux maintenant l'utiliser comme ceci:

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" 

Mais déjà la première partie ne fonctionne pas :

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

Comment est-il lié à Lisp? – Ankur

+0

maxima utilise le lisp en interne – Onur

Répondre

2

Cette solution a fonctionné pour moi (en fonction de l'exemple "curry" dans l'aide maxima pour buildq, voir 36. Function Definition):

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)) 
     ); 

Exemple:

myList : [a = 4, b = 7, c = 5+b]$ 
ExtractElement(myList, b, identity); 
// result: b = 7 
ExtractElement(myList, c, second); 
// result: b+5 
Questions connexes