2010-08-03 6 views
9

Angenommen, ich habe ein einzelnes Element, und ich habe eine Liste von Prädikaten (Funktionen). Ich möchte jedes dieser Prädikate auf das einzelne Element anwenden und eine entsprechende Liste von Rückgabewerten erhalten. Ich weiß, dass map und Freunde eine einzelne Funktion auf jede Liste von Argumenten anwenden können, aber gibt es eine kurze Syntax, um viele Funktionen auf ein einzelnes Argument anzuwenden?Concise Lisp-Code, um eine Liste von Funktionen alle auf das gleiche Argument (s) anzuwenden und eine Liste der Rückgabewerte zu erhalten?

Natürlich kann ich

(mapcar (lambda (pred) (funcall pred SINGLE-ELEMENT)) LIST-OF-PREDICATES) 

tun, aber es wäre schön, wenn es eine Funktion ist, die wie gearbeitet:

(test-predicates-against-element LIST-OF-PREDICATES SINGLE-ELEMENT) 

Natürlich kann ich nur defun es, aber ich wollte wissen, ob es gibt eine akzeptierte Methode dafür.

Antwort

9

Diese Operation ist nicht üblich und es gibt nicht wirklich eine vordefinierte Möglichkeit, es zu tun, außer es direkt in Common Lisp zu schreiben. Verschiedene Leute mögen eine kurze Syntax und fügen syntaktische Elemente hinzu, die in einem solchen Fall zu allen Arten von Lisps beitragen würden. In Common Lisp möchte man vielleicht eine Funktion schreiben, die das tut, was man will (anstatt Syntax hinzuzufügen).

(defun fmap (functions &rest args) 
    (declare (dynamic-extent args)) 
    "Applies each function to the arguments. Returns a list of results." 
    (mapcar (lambda (function) 
      (apply function args)) 
      functions)) 

CL-USER 1 > (fmap (list #'+ #'- #'* #'/) 42 17) 
(59 25 714 42/17) 
+0

Ich verstehe nicht, was CLHS darüber zu sagen hat, was DYNAMIC-EXTENT tut. Der Eintrag besagt, dass zum Beispiel eine Implementierung auswählen kann, die so deklarierten Zuweisungsvariablen zu stapeln, und zeigt, dass es wahrscheinlich nicht sinnvoll ist, die Parameter eines Defuns zu stapeln. Es funktioniert hier, weil args eine Liste ist (also von bekannter Größe)? –

+1

args ist eine Liste. Diese Liste wird nur innerhalb dieser Funktion verwendet und nicht zurückgegeben. Also der dynamische Umfang. Die Liste kann Stapel zugeordnet werden, wenn dies unterstützt wird. Die Liste wird bei der Rückkehr von dieser Funktion zerstört, daher wird keine GC-Zeit benötigt. –