我是一名 Common Lisp 初学者,正在为我的一项任务而苦苦挣扎......
我的 CS 任务之一是创建一个基本上用作 clisp 的内置 nthcdr 函数的函数。
我们将其称为 ncdr:
(ncdr n L) => n 是我们要输出的 cdr,L 是列表
例子:
(ncdr 2 '(a b c)) => (c)
(ncdr 0 '(a b c)) => (a b c)
(ncdr -1 '(a b c)) => nil
(ncdr 5 '(a b c)) => nil
所以我的方法是设置一个计数器并将其与 n 进行比较
以下是我想到的条件:
if n < 0 -> nil
if counter < n -> + 1 counter and (ncdr (cdr list)
if counter = n -> output list
if counter > n -> nil
这就是我想出的……虽然我认为这不是最有效的方法,而且,就目前而言,它不起作用。
(defun ncdr (n L &aux counter)
(setq counter 0)
(cond
((atom L) nil)
((< n 0) nil)
((< counter n) (+ 1 counter (ncdr n (cdr L))))
((eq counter n) L)
((> counter n) nil) ))
从我尝试函数的每个 cond 行的时间来看,我知道这条行不能按预期工作
((< counter n) (+ 1 counter (ncdr n (cdr L))))
我收到一个错误:nil 不是数字
我觉得我错过了解决这个问题的关键。