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

标签 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)))))

最佳答案

您的 helper-2 函数有两处错误:

  1. 您应该使用双臂 if,这样它就可以用作 if/else。
  2. (car list) 两边的括号太多。

这是固定版本:

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

关于lambda - 为什么我的 lisp 代码给我...应该是一个 lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26941771/

相关文章:

macros - 如何在 lisp 中编写 'destructive' dolist 宏

boolean - Common Lisp中是否有非延迟评估的 "and"或 "or"操作?

lisp - LISP 中的动态构建函数

c# - Lambda 和 Expression.Call 扩展方法

scheme - Scheme/Lisp 内置二进制转换

lisp - 有没有办法将列表转换为 Scheme 中的集合?

common-lisp - Lispworks 中的 Quicklisp 错误

c# - Lambda 表达式的工作原理

java - filter和findFirst后map抛出异常需要继续过滤Java流

c# - 如何使 Where lambda 从列表中搜索?