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?
这在规范的普通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论证也是如此.
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |