clisp运行错误--ANSI Common Lisp 课后习题5.5
这是ANSI Common Lisp第5章第5个练习题。题目原文为:
Define iterative and recursive versions of a function that takes an object x and vector v, and returns a list of all the objects that immediately precede x in v:
>(precedes #a "abracadabra") (#c #d #r)
我的递归版本的代码为:
(defun precedes-recursive (c str) (if (null str) nil (let ((p1 (position c str :start 1))) (if (eql p1 nil) (format t "NIL: ~A ~A~%" p1 str) (or (format t "Not NIL: ~A ~A~%" p1 str) (push (char str (- p1 1)) (precedes-recursive c (subseq str p1))))))))
我的想法是从向量第1个位置处开始寻找(向量从0开始),如果找到字符c,则把c前面的字符加入到列表中,然后再递归寻找,下一次递归时从上一次找到的位置开始找。如果本次没能找到,则说明整个字符串中都没有字符c了,所以也就不用寻找了。但我的运行结果为:
[9]> (precedes-recursive #a "abracadabra") Not NIL: 3 abracadabra Not NIL: 2 acadabra Not NIL: 2 adabra Not NIL: 3 abra NIL: NIL a *** - FUNCTION: undefined function (SETF PRECEDES-RECURSIVE) The following restarts are available: USE-VALUE :R1 Input a value to be used instead of (FDEFINITION '(SETF PRECEDES-RECURSIVE)). RETRY :R2 Retry STORE-VALUE :R3 Input a new value for (FDEFINITION '(SETF PRECEDES-RECURSIVE)). ABORT :R4 Abort main loop应该是最后一次递归时p1的值为NIL,如果p1的值为NIL的话就不会再递归了,所以也就不用再调用本函数了。但运行时为什么会出错而且错误提示为:FUNCTION: undefined function (SETF PRECEDES-RECURSIVE)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
给你推荐个东西可以看你整个表达式计算过程的
sdraw
www.cs.cmu.edu/~dst/Lisp/sdraw/sdraw.generi
来至
Common Lisp_ A Gentle Introductio
是这样的,多谢了!
回复
题目好像要求结果里没有重复的,那 push 改成 adjoin 好了,执行结果是 (#c #d #r)
回复
题目没明确说出来,但给出的例子是要求不重复,早点注意到这一点就不会有这个问题了。
那是因为你最后的一个状态:当找不到目标 char,比如 #a 时,你返回的是 nil,即执行
(push element nil)
这是非法的,因为 push 最后一个参数必须是一个变量名!
修改方法就是把 push 改成 cons,执行结果如下