clisp运行错误--ANSI Common Lisp 课后习题5.5

发布于 2021-11-16 10:03:59 字数 1618 浏览 884 评论 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

凯凯我们等你回来 2021-11-17 17:00:31

给你推荐个东西可以看你整个表达式计算过程的

sdraw

www.cs.cmu.edu/~dst/Lisp/sdraw/sdraw.generi

来至

Common Lisp_ A Gentle Introductio

离不开的别离 2021-11-17 16:05:41

是这样的,多谢了!

奢望 2021-11-17 14:45:23

回复
题目好像要求结果里没有重复的,那 push 改成 adjoin 好了,执行结果是 (#c #d #r)

梦中楼上月下 2021-11-17 09:04:24

回复
题目没明确说出来,但给出的例子是要求不重复,早点注意到这一点就不会有这个问题了。

别再吹冷风 2021-11-17 07:19:30

那是因为你最后的一个状态:当找不到目标 char,比如 #a 时,你返回的是 nil,即执行

(push element nil)

这是非法的,因为 push 最后一个参数必须是一个变量名!

修改方法就是把 push 改成 cons,执行结果如下

> (precedes-recursive #a "abracadabra")
Not NIL: 3 abracadabra
Not NIL: 2 acadabra
Not NIL: 2 adabra
Not NIL: 3 abra
NIL: NIL a
(#r #c #d #r)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文