2017-12-02 8 views
0

Ich habe diese Funktion:Common Lisp - Subtraction

(defun test (variable) 
    (cond 
    ((null variable) nil) 
    ((< (- 12 (other-function variable) 3) 0) 1) 
    (t (- 12 (other-function variable) 3)) 
) 
) 

Die Idee ist, wenn das Ergebnis der Subtraktion von 12 mit dem Wert der Funktion mit 3 kleiner als 0 ist, gibt es 1. Else es wird nur die Subtraktion machen. Die "andere Funktion" gibt eine Zahl zurück. Wenn ich diese Funktion ausführen, friert Lispworks ein. Aber wenn ich die Funktion ohne die erste Bedingung ausführen:

(defun test (variable) 
    (cond 
    ((null variable) nil) 
    (t (- 12 (other-function variable) 3)) 
) 
) 

macht es die Subtraktion ohne jedes Problem. Kann jemand helfen? Danke.

EDIT: Ich habe versucht, auf diese Weise mit let:

(defun test (variable) 
(let (x (other-function variable)) 
    (cond 
    ((null variable) nil) 
    ((< (- 12 x 3) 0) 1) 
    (t (- 12 x 3))) 
) 
) 

Aber ich habe immer noch das gleiche Problem mit LispWorks wich ist, es friert. Wenn ich ohne die folgende Bedingung laufe:

Diese Funktion arbeitet richtig.

+0

Scheint mir, dass das Problem in "anderen Funktionen" statt "Test" liegt. Anstatt das gleiche zweimal zu tun, könnten Sie den Wert in einem "Let" binden und diese Variable wiederverwenden. – Sylwester

+0

@Sylwester ich werde die Art und Weise hinzufügen, wie ich versucht habe, in der Frage zu lassen. Danke für die Antwort. – MarB

+1

Bitte poste ein [mcve]. – melpomene

Antwort

3

Wenn Sie Ihren vollständigen Code und einen Testfall nicht finden, kann dieser nicht reproduziert werden.

CL-USER 1 > (lisp-implementation-type) 
"LispWorks" 

CL-USER 2 > (defun test (variable) 
       (cond 
       ((null variable) nil) 
       ((< (- 12 (other-function variable) 3) 0) 1) 
       (t (- 12 (other-function variable) 3)))) 
TEST 

CL-USER 3 > (defun other-function (foo) (+ foo 1)) 
OTHER-FUNCTION 

CL-USER 4 > (test 5) 
3 

CL-USER 5 > (test 500) 
1 

auch: LispWorks in der Regel nicht 'einzufrieren' auf einen Fehler.