2010-08-03 8 views
9

Załóżmy, że mam jeden element i mam listę predykatów (funkcji). Chcę zastosować każdy z tych predykatów do pojedynczego elementu i uzyskać odpowiednią listę wartości zwracanych. Wiem, że map i znajomi mogą zastosować jedną funkcję do każdej listy argumentów, ale czy istnieje jakaś zwięzła składnia do zastosowania wielu funkcji do pojedynczego argumentu?Zwięzły kod Lisp, aby zastosować listę wszystkich funkcji do tych samych argumentów i uzyskać listę wartości zwracanych?

Oczywiście mogę zrobić

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

ale byłoby miło, gdyby nie było to funkcja, która pracowała jak:

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

oczywiście mogę tylko defun, ale chciałem wiedzieć, czy istnieje akceptowana metoda robienia tego.

Odpowiedz

9

Ta operacja nie jest tak powszechna i nie ma w rzeczywistości zdefiniowanego wcześniej sposobu, poza pisaniem jej bezpośrednio, w Common Lisp. Różni ludzie lubią krótką składnię i dodają elementy syntaktyczne, które pomogłyby w takim przypadku wszystkim Lisps. W Common Lisp można napisać funkcję, która robi to, co chcemy (zamiast dodawać składnię).

(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

Nie rozumiem, co CLHS ma do powiedzenia o tym, co robi DYNAMIC-EXTENT. Wpis mówi, że na przykład implementacja może wybrać opcję przydzielania zmiennych zadeklarowanych w ten sposób, i pokazuje, że prawdopodobnie nie jest użyteczne przypisywanie alokacji parametrów defun. Działa tutaj, ponieważ args jest listą (tak znanego rozmiaru)? –

+1

args to lista. Ta lista jest używana tylko wewnątrz tej funkcji i nie jest zwracana. Zatem zakres dynamiczny. Lista może być przydzielona do stosu, jeśli jest to obsługiwane. Lista zostanie zniszczona po powrocie z tej funkcji, dlatego nie jest potrzebny czas GC. –

Powiązane problemy