関数を引数としてelispに渡す方法


8

私は最近、lispプログラミングを学ぶためにSICPを読んでいます。

本には、以下のような高レベルの関数を作成する例があります。

 (define (sum term a next b)
   ...
   (term a)
   ...
   (next a)
   ...

この関数では、termnextが関数です。

同じ関数をelispでこのように記述したいと思います。

 (defun sum (term a next b)
    ....
    (funcall term a)
    ...
    (func next a)
    ....

次に、合計をテストするためにいくつかのテスト関数を定義します

 (defun inc-test (x) (+ x 1))

 sum inc-test 1 inc-test 10 

しかし、次のようなエラーが表示されます:無効な関数:inc-test

私はelispを使い始めたばかりなので、修正方法を誰かに教えてもらえますか?とても感謝しています


どう呼んでるのsum
ダン

こんにちは、呼び出し例を追加
Luis404 '14

3
Emacs Lispには、関数と変数の2つの名前空間があります。つまりinc-test、最後の例では変数として使用されていますが、変数として定義されていません(関数です)。シンボルまたは関数参照をに渡す必要がありfuncallます。したがって、コードを修正する1つの方法は'inc-testinc-test(引用符に注意して)の代わりにコードを渡すことです。
wvxvw 2015

これはどういう意味ですか:sum 'inc-test 1' inc-test 10 ??? このエラーが発生しました:使用方法:合計:(TERM A NEXT B)
Luis404

3
2つの名前空間と1つの問題は、elispとcommon lispの大きな違いの1つであり、もう1つはスキームです。SICPを読んでlisp-2で練習する場合、混乱することになります(変数と関数に別々の名前空間を持つ種類が呼び出されるため)。おそらく、実際のスキーム実装を試してみる必要がありますか?
Harald Hanche-Olsen

回答:


6

コメントの内容を要約するには、funcallその引数の引用符を外します(引数にアクセスするだけで)。その前に、関数の呼び出しで渡される関数名パラメーターの値を評価またはアクセスしないようにする必要もあります。

したがって、許容できる答えは次のようです。

(defun sum (term a next b)
    (funcall term a)
    (funcall next a))

(defun inc-test (x) (+ x 1))

(sum 'inc-test 1 'inc-test 10 )

または、基本的に'inc-testまたは(quote inctest)ではなくで呼び出しますinc-test

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.