(defun foo (in i out)
(if (>= i 0)
(progn
(append (list (intern (string (elt in i)))) out)
(print output)
(foo in (- i 1) out )
)
(out)
)
)
(print (foo "abcd" (- (length "abcd") 1) (list)))
我试图将此字符串返回为(abcd)。但是它确实返回nil作为输出。我在这里做什么错?谢谢
您只有一些小错误。首先,我们需要摆脱output
和(output)
; 这些与代码无关。看来您正在使用一个名为的变量output
,然后将其重命名为out
而不修复所有代码。而且,(output)
是一个函数调用;它期望一个被调用的函数output
存在。
其次,append
必须以某种方式捕获的结果。在progn
你只是丢弃它。这是一个工作版本:
(defun foo (in i out)
(if (>= i 0)
(foo in (1- i) (cons (intern (string (elt in i))) out))
out))
另请注意(append (list X) Y)
,我使用的是更高效,更惯用的语言,而不是您的语言(cons X Y)
。此cons
操作的结果必须传递给foo
。的out
参数是我们的累加器,其通过尾递归螺纹; 到目前为止,它拥有我们列表中的多少。
即我们不能(progn <make-new-list> (foo ... <old-list>))
; 只会创建新列表并将其丢弃,然后将旧列表传递给递归调用。由于旧列表最初为nil
,所以我们一直沿用它nil
,当索引为零时,即弹出该列表。我们需要(foo .... <make-new-list>)
,这就是我所做的。
测试:
[1]> (foo "" -1 nil)
NIL
[2]> (foo "a" 0 nil)
(|a|)
[3]> (foo "ab" 1 nil)
(|a| |b|)
[4]> (foo "abcd" 3 nil)
(|a| |b| |c| |d|)
[5]> (foo "abcd" 3 '(x y z))
(|a| |b| |c| |d| X Y Z)
最后,如果您希望(|a| |b| |c| |d|)
符号显示为(a b c d)
,则必须弄弄readtable-case
。
当然:
[6]> (foo "ABCD" 3 nil)
(A B C D)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句