为什么我的lisp代码给我......应该是lambda表达式?

时间:2014-11-15 02:15:05

标签: lambda lisp common-lisp

(defun helper-2 (list) 
  (if (null (first (rest list)))
      0)
  (+ (distance ((car list) (first (rest list)))) 
     (helper-2 (rest list))))

我是lisp的新手,我正在编写一个程序来计算任何多边形的周长,并按顺时针顺序输入。我的逻辑是我使用辅助方法来计算彼此相邻的两个点的长度并进行求和。在递归完成之后,我将单独调用以计算从开始点到结束的长度并将所有内容相加。我完成了距离法,它取2分并返回长度。

(distance '(2 0) '(4 0)) ;this will output 2

helper-2逻辑:      假设我们有3个点a(2 0)b(3 3)c(4 0)这个方法应该总结ab和bc之间的距离。但是,我一直得到"(车头)应该是一个lambda表达"错误。有人可以帮忙吗?谢谢。或者任何人都可以给我一个更好的方法来计算多边形的周长?

(defun square (n) (* n n))

(defun distance (a b)
  (let ((h (- (second b) (second a)))
        (w (- (first b) (first a))))
    (sqrt (+ (square h) (square w)))))

2 个答案:

答案 0 :(得分:4)

您的helper-2功能在两个地方出错:

  1. 您应该使用双臂if,以便它可以作为if / else使用。
  2. (car list)附近有太多括号。
  3. 这是固定版本:

    (defun helper-2 (list) 
      (if (null (first (rest list)))
          0
          (+ (distance (car list) (first (rest list))) 
             (helper-2 (rest list)))))
    

答案 1 :(得分:4)

HyperSpec的3.1.2.1.2.3 Function Forms部分描述了一个形式是一个缺点,例如 ((车辆清单)(第一个(休息清单))),评估:

  

如何处理复合形式取决于它是分类为特殊形式,宏形式,函数形式还是lambda形式。

您可以阅读从该页面链接到的子部分以获取更多详细信息,但实质是由于此列表的第一个元素不是符号,因此整个表单必须是lambda表单。根据{{​​3}},lambda形式是一个列表,其中第一个元素是lambda表达式。 `但是,(汽车列表) 不是一个lambda表达式,因此您会收到相应的错误消息。

你声称(距离'(2 0)'(4 0))会输出两个,但是显示用两个参数调用距离。即使可以评估((车辆清单)(第一个(休息清单))),它也只会产生一个值,所以(距离((车辆清单)(第一个(休息清单) )))))只用一个参数调用距离。你应该这样做:

(distance (car list) (first (rest list)))

另见: