8

私は現在 Guile Scheme を学んでおり、ドキュメンテーションで突然次の構造に出くわしました:

((lambda args (display args)) 42)
=> (42)

これは私をループに陥れました。この時点まで、仮パラメーターは常にリストで囲まれていると想定していました。

((lambda (args) (display args)) 42)
=> 42

このバリアントをいつ使用するのか、これが可変数の引数のドット表記とどのように異なるのか疑問に思います。具体的には、次の 2 つのバリアントの違いは何ですか。

((lambda args (display args)) 1 2 3)     => (1 2 3)
((lambda (. args) (display args)) 1 2 3) => (1 2 3)

おそらくより複雑な例では、注意する必要がある違いはありますか?また、どちらかを優先する理由はありますか?

4

2 に答える 2

6

違いは、このバージョンは という単一のパラメーターを受け取ることです。これは、フォームargsに期待される実際の引数の数が正確にわかっている場合に役立ちます。lambda

(lambda (args) (display args))

そして、このバージョンはと呼ばれる (おそらく空の) パラメータのリストを受け取ります。これは、フォームargsの可変数の引数が予想される場合に役立ちます。lambda

(lambda args (display args))

次の 2 つのバージョンに違いはないはずですが、ドットの前の部分がないため、すべてのインタープリターが 2 番目のものを受け入れるわけではありません (したがって、回避する必要があります)。

(lambda args (display args))
(lambda (. args) (display args))

lambda次のバージョンは、フォームに 1 つ以上の必須パラメーター (ドットの左側の記号) と 0 個以上のオプションのパラメーターのリスト (ドットの右側の単一の記号) があることを指定する場合に役立ちます。

(lambda (mandadory1 mandatory2 . optional) (display mandatory1))
于 2012-01-11T14:11:25.257 に答える
1

これは私をループに陥れました。この時点まで、仮パラメーターは常にリストで囲まれていると想定していました。

(a . args)やのようなもの(a b . args)は実際にはリストではないことに注意してください。はが記号、が記号(a . args)のペアです。は が記号でが であるペアです ( が記号でが記号であるペア)。しばらくの間、 andと thatのリストのように見えますが、null/空のリストで終わらないため、実際には適切なリストではありません。このような構造は、不適切なリストと呼ばれることがよくあります。必要に応じて、ここまたは他の場所でドット ペア表記について少し読むことができます...caracdrargs(a b . args)caracdrcarbcdrargsab

と言うと「が記号(. args)のペアです 」みたいな感じでしょうか。あるいは、「がとがのペア」みたいなのが出てくるかもしれません。いずれにせよ、あまり意味がありません。また、Chris Jester-Young が言ったように、それは実際には有効なスキームではありません。cdrargscarcdrargs

そう。のようなもの(a b . args)は、最後に null でないものを置くための通常のドット ペア表記ですcdr。もしSchemeの仮パラメータがそれらの不適切なリスト、適切なリスト、または単なるシンボルの1つである場合、仮パラメータの定義は次のようなものでなければなりません: 仮パラメータはnull、シンボル、または、carがシンボルであり、cdrが正式なパラメータであるペア。

(これは、引数をパラメーターにバインドするかなりエレガントな方法を作る一種のクールなものだと思います。同様に、正式なパラメーターを見て、それがシンボルである場合、引数のリストをそれにバインドし、それがcar引数の をcdr仮パラメータ-thing にバインドし、仮パラメータcdr-thing/arguments の繰り返しをバインドするペア(ああ、それが null の場合は、完了または何かのようなものです)。 Common Lisp の方法よりも「そして、シンボル in の場合car&rest残りの引数をその後のシンボルにバインドする」.)

于 2012-01-26T20:31:09.847 に答える