2012-01-11 4 views
8

私は現時点ではガイルスキームを学んでいる、と私は突然、次のような構成に走った文書で:"ベア"仮パラメータでラムダ定義を使用する場合

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

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

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

このバリアントを使用するとき、私は疑問に思う、とどのようにこれは、可変個の引数のためのドット表記とは異なります。 - おそらく、より複雑な例について -

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

違いがあり、私が知っておく必要があり、他の上の1つを好むために何らかの理由があること:具体的には、2つの以下のバリアントの違いは何ですか?

(lambda (args) (display args)) 

そして、このバージョンは、(おそらく受け取る:

+3

ボーナスとして、 'list'の定義は、 '(define list(lambda xx))'です。 – erjiang

答えて

6

違いは、このバージョンでは、あなたがlambdaフォームに予想される実引数の正確数がわかっている場合、単一のパラメータは例のために便利な、argsと呼ば受信することですパラメータのリスト)は、空、あなたがlambdaフォームの引数の可変数を期待するときに便利な、argsと呼ばれる:

(lambda args (display args)) 

は、次の2つのバージョンの違いはありませんが、それは、ドットの前の部分が欠落していますので、すべてではない通訳は、二番目を受け入れます(そのため、避けるべき):

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

次バージョンでありますlambdaフォームに、1つ以上の必須パラメータ(ドットの左側のシンボル)と0個以上のオプションのパラメータ(ドットの右側の単一のシンボル)のリストを指定する場合に便利です。

(lambda (mandadory1 mandatory2 . optional) (display mandatory1)) 
+3

'(。args)'は有効なSchemeの読み込み構文ではありません。しかし、Guileは読者を「args」と読むように拡張しているようだ。それは間違いなく移植性がなく、あなたが言うように、最高の回避されます。 –

+1

優秀、ありがとうございます。私はそれが別の方法だと思った。ドットのみのフォームは完全に標準で、「裸の」フォームは少し奇妙であると仮定しました。私は初心者の目のために、ドットの形が他の形から自然に続くと思います。 – Janne

1

これは私のために私を投げたoop;私は正式なパラメータを想定していたこの時点まで常にリストで囲まれた:

(a . args)(a b . args)のようなものが本当にいずれかの一覧表示されないこと。 (a . args)は、carがシンボルaであり、cdrがシンボルargsであるペアです。 (a b . args)は、carがシンボルaであり、cdrがシンボルbであり、cdrがシンボルargsであるペアであるペアです。それはabとしばらくの間、リストのように見えますが、null /空のリストで終わらないので、本当に適切なリストではありません。そのような構造は、しばしば不適切なリストと呼ばれます。あなたたい場合は、ドット付きペア表記hereについて少し読むことができる、またはどこか他の... (. args)

私は多分、「それはcdrがシンボルargsあるペアがある」のようなものを言うと思います。あるいは、「carがあり、cdrargsであるペア」のように出てくるかもしれません。いずれにしても、それは意味をなさないでしょう。そして、クリス・ジェスター・ヤングが言ったように、それは本当に有効なスキームではありません。

So. (a b . args)のようなものは、最後のcdrにヌルでないものを置くためのちょうど普通のドット表記の記法です。 Schemeの仮パラメータが不適切なリストまたは適切なリストまたはシンボルのいずれかになりうる場合、仮パラメータの定義は、次のようなものでなければなりません:正式なパラメータ - 物はヌル、シンボル、またはcarがシンボルであり、cdrが仮パラメータのものであるペア。

(これは、引数をパラメータにバインドするよりエレガントな方法であると思います。仮引数の場合と同様に、シンボルの場合は、引数のリストをそれがペアならば、引数のcarを仮パラメータの事のcdrにバインドし、形式的なパラメータのもの/引数のcdrに再帰させます(ああ、あなたが終わったかどうかなどの場合)。 carのシンボルが&restならば、残りの引数をシンボルに結びつけるのです。」

+0

ドットのついたペア - 私は決して接続しませんでした。これは仮パラメータ仕様のための具体的な表記であると考えました。ありがとう。私は機会があるときに私の質問を編集します。 – Janne

関連する問題