2009-12-25 4 views
2

Есть ли способ сделать список, который содержит функции? То, что я пытаюсь сделать, составляет список некоторых арифметических операторов (+ - * /), поэтому я могу легко манипулировать их порядком и применять их к списку чисел.Список функций

Так что, если у меня есть этот список, я хотел бы использовать его как это:

(apply (map (lambda (x) 
       x) 
      '(+ - * /)) 
     '(1 2 3 4)) 

Я начинающий программист, так что если есть лучший способ сделать такую ​​операцию, ваш совет очень ценится ,

+0

Ammar: Рукой, разверните и покажите, что будет делать код, который вы написали. Затем сделайте то же самое с вашим новым кодом. Вы должны увидеть разницу. – grettke

ответ

10

Списки составлены с помощью функции LIST.

(list 1 2 3) 

(list + - * /) 

Применение список символов не имеет смысла:

(apply (map (lambda (x) x) '(+ - * /)) '(1 2 3 4)) 

бы быть (применяя список функций до сих пор не имеет смысла):

(apply (map (lambda (x) x) (list + - * /)) '(1 2 3 4)) 

Упрощенная (по-прежнему не так):

(apply (list + - * /) '(1 2 3 4)) 

Но, mayb е вы хотите это:

(map (lambda (f) 
     (apply f '(1 2 3 4))) 
    (list + - * /)) 

В Common Lisp:

(mapcar #'(lambda (f) 
      (apply f '(1 2 3 4))) 
     (list #'+ #'- #'* #'/)) 

Возвращает:

(10 -8 24 1/24) 
+0

Я хочу вернуть результат от применения этих функций в этом порядке к списку, (+ 1 (- 2 (* 3 4))), (игнорировать дополнительный элемент в списке функций). –

+0

ну, примените только одну функцию, а не список функций. Попробуйте еще раз ... –

+2

Спасибо за указание (список # '+ #' - # '* #' /), это привело меня к тому, что я хотел. –

2

Я удивлен, что никто не упомянул quasiquotation. :-) На схеме, можно сказать:

`(,+ ,- ,* ,/) 

или в Common Lisp:

`(,#'+ ,#'- ,#'* ,#'/) 

В некоторых случаях, особенно с участием сложных списков, quasiquotation делает код намного проще, чем читать соответствующий list версия.

Смежные вопросы