Scheme默认对象的Common Lisp等价物是什么?

Rog*_*llo 2 scheme common-lisp

我正在将一些Scheme代码转换为Common Lisp.我不知道Scheme.我知道一点Common Lisp.

这是Scheme代码:

(define (close-enuf? h1 h2 #!optional tolerance scale)
    (if (default-object? tolerance)
       ...))
Run Code Online (Sandbox Code Playgroud)

我将该Scheme代码转换为此Common Lisp:

(defun close-enuf? (h1 h2 &optional tolerance scale)
    (if (xxx tolerance)
        ...))
Run Code Online (Sandbox Code Playgroud)

除此之外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.
Run Code Online (Sandbox Code Playgroud)

我不确定那是什么意思.是否说default-object?如果参数的值是默认值(不是传入的值),则返回true?

cor*_*ump 6

这在规范的普通Lambda列表部分中有所介绍:

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])}*])
Run Code Online (Sandbox Code Playgroud)

&optional参数可以是单一的符号或有两个或三个元素的列表.在这种情况下,第二个值是默认值.第三个值命名一个包含布尔值的变量:当且仅当绑定的值var由调用者提供时才为真.否则,a NIL表示该值是默认值.例如:

(defun foo (&optional (x 1 xp))
  (list x xp))
Run Code Online (Sandbox Code Playgroud)

没有提供参数:

(foo)
=> (1 nil)
Run Code Online (Sandbox Code Playgroud)

有一个明确的论点:

(foo 2)
=> (2 T)
Run Code Online (Sandbox Code Playgroud)

使用与默认值无法区分的参数:

(foo 1)
=> (1 T)
Run Code Online (Sandbox Code Playgroud)

在你的情况下,那将是:

(defun close-enough-p (h1 h2 &optional (tolerance nil tolerance-p) scale)
    (if tolerance-p
      <supplied>
      <default>))
Run Code Online (Sandbox Code Playgroud)

请注意,&key论证也是如此.