7

私は、他のいくつかの関数の構成を返す関数を作成したかったのです。

(funcall (compose 'f 'g) x) == (f (g x))

私はこれで惨めに失敗したと感じています。これまでの私の最善の試み:

(defun compose (funcs)
  "composes several funcitons into one"
  (lambda (arg)
    (if funcs
        (funcall (car funcs) (funcall (compose (cdr funcs)) arg))
        arg)))

しかし、何らかの理由で、以下は依然として 0 を返します。

(funcall (compose '(
           (lambda (a) (* a 3))
           (lambda (a) (+ a 2))
)) 0)

それを修正する方法はありますか?

4

2 に答える 2

7

あなたのコードは、Emacs Lisp がデフォルトでサポートしていないレキシカル スコープのラムダを必要とします。Emacs 24 を使用している場合は、に設定lexical-bindingするtと、例が記述どおりに機能します。

古い Emacs を使用している場合は、明示的なlexical-let形式を使用してレキシカル スコープのラムダを作成できます。

(require 'cl)

(defun compose (funcs)
  "composes several funcitons into one"
  (lexical-let ((funcs funcs))
    (lambda (arg)
      (if funcs
          (funcall (car funcs) (funcall (compose (cdr funcs)) arg))
        arg))))
于 2012-11-01T11:07:08.840 に答える
0

ライブラリが必要な場合は、ダッシュ機能-composeを参照してください(&rest fns)

于 2020-09-23T19:40:18.723 に答える