目前我正在通过Peter Seibel的"Practical Common Lisp"工作.
在"实用:简单数据库"(http://www.gigamonkeys.com/book/practical-a-simple-database.html)一章中,Seibel通过以下示例解释了关键字参数和提供参数的用法:
(defun foo (&key a (b 20) (c 30 c-p)) (list a b c c-p))
Run Code Online (Sandbox Code Playgroud)
结果:
(foo :a 1 :b 2 :c 3) ==> (1 2 3 T)
(foo :c 3 :b 2 :a 1) ==> (1 2 3 T)
(foo :a 1 :c 3) ==> (1 20 3 T)
(foo) ==> (NIL 20 30 NIL)
Run Code Online (Sandbox Code Playgroud)
因此,如果我在参数列表的开头使用&key,我可以使用3个参数名称,默认值和第三个参数列表,如果参数是否已提供.好.但是看看上面例子中的代码:
(list a b c c-p)
Run Code Online (Sandbox Code Playgroud)
lisp解释器如何知道cp是我的"提供的参数"?
我正在将一些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?