学习Lisp。似乎无法从一个函数获取值并在另一个函数中使用它

时间:2013-01-09 09:52:08

标签: lisp common-lisp let

我正在尝试查找列表中的最大数字,然后用它做一些事情:

(defun maxList (l)
    (if (= (length l) 1)
            (first l)
        (if (> (first l) (maxList (rest l)))
            (first l)
            (maxList (rest l))
        );if
    );if
);defun


(defun try-let (l)
    (let (a (maxList l))
    (print a)
    );let
);defun

然而它打印null,但maxList工作。我做错了什么?

2 个答案:

答案 0 :(得分:4)

你错过了一对括号:

(let ((a (maxList l)))

这是因为let采用

中的绑定列表
(let ((a 1) (b 2) (c 'foo))
  expr)

所以在这种情况下你必须传递一个包含绑定(a (maxList l))

的单元素列表

答案 1 :(得分:2)

(defun maxList (l)
  (if (= (length l) 1)

调用LENGTH并不是一个好主意。它遍历整个列表。

      (first l)
    (if (> (first l) (maxList (rest l)))
        (first l)
      (maxList (rest l)))))

以上拨打MAXLIST两次。也许在这里LET有用吗?函数MAX怎么样?

如果你编译你的函数,Common Lisp系统会抱怨。

CL-USER 35 > (defun try-let (l)
               (let (a (maxList l))
                 (print a)))
TRY-LET

CL-USER 36 > (compile 'try-let)
;;;*** Warning in TRY-LET: MAXLIST is bound but not referenced

这表明Lisp编译器认为MAXLIST是一个变量。出了点问题。接下来查看LET的语法。

请参阅Special Operator LET, LET*

let ({var | (var [init-form])}*) declaration* form* => result*

其中说它是变量列表或(变量initform)列表。所以你可以看到你错过了把它列为一个列表。你刚刚写了一个绑定。