2017-12-02 114 views
0

我有这样的功能:共LISP - 减法

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

的想法是,如果12的与3的函数的值的减法运算的结果小于0,则返回1,否则,它只会进行减法。 “其他功能”返回一个数字。 当我运行此功能时,lispworks冻结。但是,如果我运行没有第一个条件的功能:

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

它使得减法没有任何问题。 有人可以帮忙吗? 谢谢。

编辑: 我试过这样与设:

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

,但我仍然得到了同样的问题lispworks至极,它冻结。当我没有以下条件运行:

((< (- 12 x 3) 0) 1) 

此功能正常工作。

+0

在我看来,问题在于'other-function'而不是'test'。而不是两次做同样的事情,你可以在'let'中绑定这个值并重用这个变量。 – Sylwester

+0

@Sylwester我会添加我试着用这个问题的方式。感谢你的回答。 – MarB

+1

请发表[mcve]。 – melpomene

回答

3

除非您想出完整的代码和测试用例,否则不能复制。

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 

另外:LispWorks通常不会 '冻结' 上的错误。