質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Scheme

Schemeは、Lispから派生したプログラミング言語の一つであり、仕様または実装を指す場合もあります。言語自体の仕様はシンプルで、関数型言語として理解しやすいことから記号処理などで主に用いられている言語です。

Q&A

解決済

1回答

413閲覧

Scheme: ある関数内のlambdaにどうやって引数が渡されているかがわからない

kasanegi

総合スコア20

Scheme

Schemeは、Lispから派生したプログラミング言語の一つであり、仕様または実装を指す場合もあります。言語自体の仕様はシンプルで、関数型言語として理解しやすいことから記号処理などで主に用いられている言語です。

0グッド

0クリップ

投稿2018/10/25 13:09

該当のコード

Scheme

1(define (remove x ls) 2 (if (null? ls) 3 '() 4 (let ((h (car ls))) 5 ((if (eqv? x h) 6 (lambda (y) y) 7 (lambda (y) (cons h y))) 8 (remove x (cdr ls))))))

質問

上記のコードは、渡されたリストに該当する値xが存在すればその値を除いたリストに評価される、という関数です。

そこで質問なのですが、この関数中の(lambda (y) (cons h y))について、(cdr ls)になるであろう、仮引数yに渡されるリストはどこで作られるのでしょうか?

初歩的な質問ではあるかと思いますが、お時間ございましたら回答いただけると嬉しいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

lisp

1( 2 (if (eqv? x h) 3 (lambda (y) y) 4 (lambda (y) (cons h y)) 5 ....)

のifはlamda関数を返します。
仮にifの述語が#fだったとしますと次のようになります。

lisp

1( 2 (lambda (y) (cons h y)) 3 ....)

この関数のyに適用されるのはその後ろから与えられます。そうですね。(remove x (cdr ls))ですね。
というのも以下のように書くとfの引数がわかりますよね。

lisp

1(f 2 (remove x (cdr ls)))

投稿2018/10/25 14:19

fu7mu4

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kasanegi

2018/10/25 14:56 編集

なるほど! 評価が進んでいくと、 ((lambda (y) y) arg)となって関数呼び出しになる、という理解で問題ないでしょうか?
fu7mu4

2018/10/25 14:58

それでいいです。
kasanegi

2018/10/26 02:52

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問