1

関数 F があるとします。関数のリストを引数として関数 F に渡したいとします。

関数 F は、リスト内の各関数を 1 つずつ調べて、それぞれを 2 つの整数 x と y にそれぞれ適用します。

たとえば、リスト = (プラス、マイナス、プラス、除算、倍、プラス) とx = 6andy = 2の場合、出力は次のようになります。

8 4 8 3 12 8

これを Common Lisp で実装するにはどうすればよいですか?

4

1 に答える 1

6

多くの可能性があります。

CL-USER> (defun f (x y functions)
           (mapcar (lambda (function) (funcall function x y)) functions))
F
CL-USER> (f 6 2 (list #'+ #'- #'+ #'/ #'* #'+))
(8 4 8 3 12 8)
CL-USER> (defun f (x y functions)
           (loop for function in functions
                 collect (funcall function x y)))
F
CL-USER> (f 6 2 (list #'+ #'- #'+ #'/ #'* #'+))
(8 4 8 3 12 8)
CL-USER> (defun f (x y functions)
           (cond ((null functions) '())
                 (t (cons (funcall (car functions) x y)
                          (f x y (cdr functions))))))
F
CL-USER> (f 6 2 (list #'+ #'- #'+ #'/ #'* #'+))
(8 4 8 3 12 8)
CL-USER> (defun f (x y functions)
           (labels ((rec (functions acc)
                      (cond ((null functions) acc)
                            (t (rec (cdr functions)
                                    (cons (funcall (car functions) x y)
                                          acc))))))
             (nreverse (rec functions (list)))))
F
CL-USER> (f 6 2 (list #'+ #'- #'+ #'/ #'* #'+))
(8 4 8 3 12 8)
CL-USER> (defun f (x y functions)
           (flet ((stepper (function result)
                    (cons (funcall function x y) result)))
             (reduce #'stepper functions :from-end t :initial-value '())))
F
CL-USER> (f 6 2 (list #'+ #'- #'+ #'/ #'* #'+))
(8 4 8 3 12 8)

等々。

最初の 2 つは読み取り可能で、3 番目は Lisp の初級コースの新人がおそらく行う方法であり、4 番目はテール コールの最適化について聞いた後の新人であり、5 番目は隠れた Haskeller によって書かれています。

于 2013-04-20T04:52:54.333 に答える