2016-04-29 75 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