2016-04-29 72 views
2

我將一些Scheme代碼轉換爲Common Lisp。我不知道計劃。我知道一點Common Lisp。什麼是Scheme默認對象的Common Lisp等價物?

下面是計劃代碼:

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

我完成轉換的計劃代碼這個Common Lisp的:

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

除此之外,該設置是否正確?現在

,關於xxx,什麼是Common Lisp的等效default-object?

我發現default-object?這個定義:

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. 

我不知道那是什麼話。是否表示default-object?如果參數的值是默認值(不是傳入的值),則返回true?

回答

6

這是覆蓋在本說明書的Ordinary Lambda Lists部分:

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])}*]) 

&optional參數可以是單個符號或具有兩個或三個單元的明細表。 在這種情況下,第二個值是默認值。 第三個值命名了一個包含布爾值的變量:當且僅當調用者提供了綁定到var的值時才爲true。 否則,NIL表示該值是默認值。 例如:

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

在沒有提供的參數:

(foo) 
=> (1 nil) 

使用顯式的參數:

(foo 2) 
=> (2 T) 

隨着一個參數,是從缺省值區分:

(foo 1) 
=> (1 T) 

在你的情況,這將是:

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

注意,這同樣適用於&key參數。

+0

太棒了!非常感謝coredump。 –

+0

@RogerCostello謝謝 – coredump

相關問題