2016-04-29 6 views
2

Ich konvertiere einige Scheme-Code in Common Lisp. Ich kenne Scheme nicht. Ich kenne ein bisschen Common Lisp.Was ist das Common Lisp-Äquivalent des Scheme-Standardobjekts?

Hier ist der Code Schema:

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

ich, dass Scheme-Code zu diesem Common Lisp umgewandelt:

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

Abgesehen von xxx, das richtig aus?

nun im Hinblick auf xxx, was ist das Common Lisp Äquivalent für default-object?

ich diese Definition von default-object? gefunden:

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. 

Ich bin mir nicht sicher, was das sagt. Sagt es, dass default-object? true zurückgibt, wenn der Wert des Arguments der Standardwert (nicht ein übergebener Wert) ist?

Antwort

6

Dies wird in dem Ordinary Lambda Lists Abschnitt der Beschreibung behandelt:

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 Die Argumente können einzelne Symbole oder eine Liste mit zwei oder drei Elementen sein. In diesem Fall ist der zweite Wert der Standardwert. Der dritte Wert benennt eine Variable, die einen booleschen Wert enthält: Sie ist wahr, wenn und nur wenn der Wert, der an var gebunden ist, vom Aufrufer geliefert wurde. Andernfalls zeigt ein NIL an, dass der Wert der Standardwert ist. Zum Beispiel:

(defun foo (&optional (x 1 xp)) 
    (list x xp)) 

Ohne Argument geliefert:

(foo) 
=> (1 nil) 

mit einem expliziten Argument:

(foo 1) 
=> (1 T) 
:

(foo 2) 
=> (2 T) 

Mit einem Argument, das von dem Standardwert nicht zu unterscheiden ist

In Ihrem Fall, das wäre:

(defun close-enough-p (h1 h2 &optional (tolerance nil tolerance-p) scale) 
    (if tolerance-p 
     <supplied> 
     <default>)) 

Beachten Sie, dass das gleiche für &key Argumente geht.

+0

Super! Vielen Dank, Coredump. –

+0

@RogerCostello Danke – coredump