2016-04-29 6 views
2

私はいくつかのSchemeコードをCommon Lispに変換しています。私はスキームを知らない。私はCommon Lispのことを少し知っています。ここでSchemeのデフォルトオブジェクトのCommon Lispに相当するものは何ですか?

は、Schemeコードです:私はこれはCommon LispへのSchemeコード変換

(define (close-enuf? h1 h2 #!optional tolerance scale) 
    (if (default-object? tolerance) 
     ...)) 

:脇xxxから

(defun close-enuf? (h1 h2 &optional tolerance scale) 
    (if (xxx tolerance) 
     ...)) 

を、そう見えますか?

The predicate default-object?, which is true only of default objects, can be used to determine which optional parameters were supplied, and which were defaulted. 

私が言っているかわからないんだけど:

さて、xxxに関しては、私はdefault-object?のこの定義を見つけdefault-object?

のためのCommon Lispと等価ものです。 default-object?は、引数の値がデフォルト値(渡された値ではない)であればtrueを返しますか?

答えて

6

これは、本明細書のOrdinary Lambda Listsセクションで説明されている:&optional引数が単一の記号または二、三の要素を持つリストであることができる

lambda-list::= 
    (var* 
    [&optional {var | (var [init-form [supplied-p-parameter]])}*] 
    [&rest var] 
    [&key {var | ({var | (keyword-name var)} [init-form [supplied-p-parameter]])}* [&allow-other-keys]] 
    [&aux {var | (var [init-form])}*]) 

。 この場合、2番目の値がデフォルト値です。 3番目の値は、ブール値を保持する変数に名前を付けます。varにバインドされた値が呼び出し元によって指定された場合にのみtrueです。 それ以外の場合は、NILは、値がデフォルト値であることを示します。

(foo) 
=> (1 nil) 

明示的な引数で:

(foo 1) 
=> (1 T) 

(foo 2) 
=> (2 T) 

引数でデフォルト値と区別できない供給引数なしで

(defun foo (&optional (x 1 xp)) 
    (list x xp)) 

:例えば あなたの場合は

、それは次のようになります。

(defun close-enough-p (h1 h2 &optional (tolerance nil tolerance-p) scale) 
    (if tolerance-p 
     <supplied> 
     <default>)) 

注同じことが&key引数のために行くことに。

+0

恐ろしい!非常に多くのコアダンプありがとうございました。 –

+0

@RogerCostelloありがとう – coredump

関連する問題