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

What is the Common Lisp equivalent of the Scheme default-object?

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

方案代码如下:

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

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

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

除了 xxx 之外,这样看起来对吗?

现在,关于 xxxdefault-object?

的 Common Lisp 等价物是什么

我找到了 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? returns 为真吗?

规范的 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 的值由调用者提供时,它才为真。 否则,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 个参数也是如此。