为什么这个 do times lisp loop 给我带来问题?
why does this do times lisp loop giving me issues?
我正在尝试实现函数元素 I,return 列表 list.car 的第 i 个元素是元素 0,1 等,我正在尝试使用 dotimes 循环连同 pop 函数,我不断收到错误
(defun element-i (y L)
;; (setq m )
(let ((m ( cdr L));;(return car L))
(dotimes(m (cdr L) t)
(if (equal y 0) (return car L)
(pop car L)
(setq i (+ m L)))))))
您这里有很多问题。首先,您使用的是参数 y
,但在函数内部调用它 i
。此外 L
是一个列表,因此 (+ m L)
将发出错误信号。另一方面,我认为您打算将 m
用作整数,但将其初始化为 (cdr L)
这是一个列表。
此外,函数 pop
修改列表 L
,但使用变量指向列表的下一个元素要容易得多,而无需修改列表,只需说 (setq m (cdr m))
。
您可以用更简单的方式重写该函数,按照以下思路进行思考:取一个变量 m
并将其初始化为 L
。在列表中循环 i
次,使每次 m
等于 (cdr m)
,即同一个列表减去前一个循环的第一个元素。退出循环后,m
将成为子列表,其汽车是 L
.
的第 i
个元素
我正在尝试实现函数元素 I,return 列表 list.car 的第 i 个元素是元素 0,1 等,我正在尝试使用 dotimes 循环连同 pop 函数,我不断收到错误
(defun element-i (y L)
;; (setq m )
(let ((m ( cdr L));;(return car L))
(dotimes(m (cdr L) t)
(if (equal y 0) (return car L)
(pop car L)
(setq i (+ m L)))))))
您这里有很多问题。首先,您使用的是参数 y
,但在函数内部调用它 i
。此外 L
是一个列表,因此 (+ m L)
将发出错误信号。另一方面,我认为您打算将 m
用作整数,但将其初始化为 (cdr L)
这是一个列表。
此外,函数 pop
修改列表 L
,但使用变量指向列表的下一个元素要容易得多,而无需修改列表,只需说 (setq m (cdr m))
。
您可以用更简单的方式重写该函数,按照以下思路进行思考:取一个变量 m
并将其初始化为 L
。在列表中循环 i
次,使每次 m
等于 (cdr m)
,即同一个列表减去前一个循环的第一个元素。退出循环后,m
将成为子列表,其汽车是 L
.
i
个元素